diff --git a/.dumi/theme/builtins/Previewer.less b/.dumi/theme/builtins/Previewer.less index f8f038e4e6494f277b4312381e726950588397d6..dce93303e5e95da93af2936065f309805d1f97bc 100755 --- a/.dumi/theme/builtins/Previewer.less +++ b/.dumi/theme/builtins/Previewer.less @@ -4,6 +4,7 @@ background-color: #fff; border: 1px solid @c-border; border-radius: 1px; + margin-bottom: 24px; &[data-debug] { margin-top: 32px; diff --git a/.dumi/theme/builtins/Previewer.tsx b/.dumi/theme/builtins/Previewer.tsx index 71c16b641754029e7d04361665d5e61abf62235b..eb308c4010129e229645a23e5410c5b8e176972e 100755 --- a/.dumi/theme/builtins/Previewer.tsx +++ b/.dumi/theme/builtins/Previewer.tsx @@ -76,7 +76,7 @@ const Previewer: React.FC = oProps => { const isActive = history?.location.hash === `#${props.identifier}`; const isSingleFile = Object.keys(props.sources).length === 1; const openCSB = useCodeSandbox(props.hideActions?.includes('CSB') ? null : props); - const openRiddle = useRiddle(props.hideActions?.includes('RIDDLE') ? null : props); + // const openRiddle = useRiddle(props.hideActions?.includes('RIDDLE') ? null : props); const [execMotions, isMotionRunning] = useMotions(props.motions || [], demoRef.current); const [copyCode, copyStatus] = useCopy(); const [currentFile, setCurrentFile] = useState('_'); @@ -158,14 +158,14 @@ const Previewer: React.FC = oProps => { onClick={openCSB} /> )} - {openRiddle && ( + {/* {openRiddle && ( + +

{t('hello')}

+ { + return ( + + ); +} +``` + +## Example + +[click here for the full example](#) diff --git a/docs/guide/plugin-development/i18n.zh-CN.md b/docs/guide/plugin-development/i18n.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..ce731eda554b08f30dc33016bd71f56526060cfa --- /dev/null +++ b/docs/guide/plugin-development/i18n.zh-CN.md @@ -0,0 +1,107 @@ +--- +order: 4 +--- + +# 国际化 + +NocoBase 使用 i18next 做国际化支持,前后端统一,支持 namespace,非常适合 NocoBase 的插件系统。 + +## 服务端 + +初始化 i18n + +```ts +const app = new Application({ + i18n: {}, +}); + +// 翻译 +app.i18n.t('hello'); +``` + +在中间件中使用 + +```ts +async (ctx, next) => { + ctx.body = ctx.t('hello'); + // 在中间件中 i18n 是 cloneInstance + ctx.i18n.changeLanguage('zh-CN') +} +``` + +如何在插件中使用 + +```ts +// 添加插件的语言资源 +app.i18n.addResources('zh-CN', 'nocobase-plugin-xxx', { + hello: '你好 plugin-xxx', +}); + +// 需要指定 ns,如: +app.i18n.t('hello', { ns: 'nocobase-plugin-xxx' }); + +// 中间件 +async (ctx, next) => { + ctx.body = ctx.t('hello', { ns: 'nocobase-plugin-xxx' }); +} +``` + +## 客户端 + +在组件中使用,通过 `useTranslation` hook 的方式: + +```js +import { useTranslation } from 'react-i18next'; + +export default () => { + const { t, i18n } = useTranslation('nocobase-plugin-xxx'); + + return ( +
+ + +

{t('hello')}

+
+ ); +}; +``` + +在 Schema 中使用,将 t 注入给 scope + +```js +import { i18n, createSchemaComponent } from '@nocobase/client'; + +const SchemaComponent = createSchemaComponent({ + scope: { + t: i18n.t, + } +}); + +const schema = { + type: 'void', + title: "{{ t('hello') }}", + 'x-component': 'Hello', +}; + +export default () => { + return ( + + ); +} +``` + +## 示例 + +[点此查看完整的示例](#) diff --git a/docs/guide/plugin-development/index.md b/docs/guide/plugin-development/index.md new file mode 100644 index 0000000000000000000000000000000000000000..3507f18f8cb0b9a8e83172433d6fd0361c086e7e --- /dev/null +++ b/docs/guide/plugin-development/index.md @@ -0,0 +1,116 @@ +--- +order: 1 +toc: menu +group: + title: Plugin Development + path: /guide/plugin-development + order: 5 +--- + +# What is a Plugin? + +Plugins are pluggable, standalone modules divided by function. + +## Why Write Plugins? + +NocoBase provides a rich API for application development and can be extended even without writing plugins. The reason for writing plugins is to reduce coupling and better reuse. To do a place to write, use anywhere. Of course, some business links are very close, there is no need to overly plug-in split. + +## How to Write a Plugin? + +For example, to add a ratelimit middleware, you can write it like this. + +```ts +import ratelimit from 'koa-ratelimit'; + +app.use(ratelimit({ + driver: 'memory', + db: new Map(), + duration: 60000, + errorMessage: 'Sometimes You Just Have to Slow Down.', + id: (ctx) => ctx.ip, + headers: { + remaining: 'Rate-Limit-Remaining', + reset: 'Rate-Limit-Reset', + total: 'Rate-Limit-Total' + }, + max: 100, + disableHeader: false, + whitelist: (ctx) => { + // some logic that returns a boolean + }, + blacklist: (ctx) => { + // some logic that returns a boolean + } +})); +``` + +But with this kind of writing, it can only be handled by development, not dynamically removed. For this reason, NocoBase provides a pluggable `app.plugin()` interface for adding and removing middleware. After the modification, the code is as follows. + +```ts +import ratelimit from 'koa-ratelimit'; + +class RateLimitPlugin extends Plugin { + constructor(options) { + super(options); + this.ratelimit = ratelimit(options.options); + } + + enable() { + this.app.use(this.ratelimit) + } + + disable() { + this.app.unuse(this.ratelimit); + } +} + +app.plugin(RateLimitPlugin, { + name: 'rate-limit', + version: '1.0.0', + options: { + driver: 'memory', + db: new Map(), + duration: 60000, + errorMessage: 'Sometimes You Just Have to Slow Down.', + id: (ctx) => ctx.ip, + headers: { + remaining: 'Rate-Limit-Remaining', + reset: 'Rate-Limit-Reset', + total: 'Rate-Limit-Total' + }, + max: 100, + disableHeader: false, + whitelist: (ctx) => { + // some logic that returns a boolean + }, + blacklist: (ctx) => { + // some logic that returns a boolean + } + } +}); +``` + +- Distilling the parameters of ratelimit goes a step further by giving the parameter configuration to the plugin management panel +- When the plugin is active, execute plugin.enable() to add ratelimit to it +- When the plugin is disabled, execute plugin.disable() to remove ratelimit + +The above is the core content of the plugin, any functional extension can be handled in this way. Just two steps. + +- Implement the enable interface of the plugin for adding functionality. +- Then implement the disable interface for removing the function module. + +```ts +class MyPlugin extends Plugin { + enable() { + // Logic for adding + } + + disable() { + // Logic to remove + } +} +``` + +**Is it possible not to implement disable? ** + +The disable interface is designed to enable hot-plugging of plugins so that applications can activate and disable plugins without rebooting. If a plugin does not need to be disabled, you can also just implement the enable interface. diff --git a/docs/guide/plugin-development/index.zh-CN.md b/docs/guide/plugin-development/index.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..6b2b118f1454acb531a0c2d1fea18128849d037b --- /dev/null +++ b/docs/guide/plugin-development/index.zh-CN.md @@ -0,0 +1,116 @@ +--- +order: 1 +toc: menu +group: + title: 插件开发 + path: /zh-CN/guide/plugin-development + order: 5 +--- + +# 什么是插件? + +插件是按功能划分的可插拔的独立模块。 + +## 为什么要写插件? + +NocoBase 提供了丰富的 API 用于应用开发,即使不写插件也是可以实现功能扩展。之所以写成插件,是为了降低耦合,以及更好的复用。做到一处编写,随处使用。当然有些业务联系非常紧密,也没有必要过分的插件化拆分。 + +## 如何编写一个插件? + +例如,添加一个 ratelimit 中间件,可以这样写: + +```ts +import ratelimit from 'koa-ratelimit'; + +app.use(ratelimit({ + driver: 'memory', + db: new Map(), + duration: 60000, + errorMessage: 'Sometimes You Just Have to Slow Down.', + id: (ctx) => ctx.ip, + headers: { + remaining: 'Rate-Limit-Remaining', + reset: 'Rate-Limit-Reset', + total: 'Rate-Limit-Total' + }, + max: 100, + disableHeader: false, + whitelist: (ctx) => { + // some logic that returns a boolean + }, + blacklist: (ctx) => { + // some logic that returns a boolean + } +})); +``` + +但是这种写法,只能开发处理,不能动态移除。为此,NocoBase 提供了可插拔的 `app.plugin()` 接口,用于实现中间件的添加和移除。改造之后,代码如下: + +```ts +import ratelimit from 'koa-ratelimit'; + +class RateLimitPlugin extends Plugin { + constructor(options) { + super(options); + this.ratelimit = ratelimit(options.options); + } + + enable() { + this.app.use(this.ratelimit) + } + + disable() { + this.app.unuse(this.ratelimit); + } +} + +app.plugin(RateLimitPlugin, { + name: 'rate-limit', + version: '1.0.0', + options: { + driver: 'memory', + db: new Map(), + duration: 60000, + errorMessage: 'Sometimes You Just Have to Slow Down.', + id: (ctx) => ctx.ip, + headers: { + remaining: 'Rate-Limit-Remaining', + reset: 'Rate-Limit-Reset', + total: 'Rate-Limit-Total' + }, + max: 100, + disableHeader: false, + whitelist: (ctx) => { + // some logic that returns a boolean + }, + blacklist: (ctx) => { + // some logic that returns a boolean + } + } +}); +``` + +- 将 ratelimit 的参数提炼出来,更进一步可以把参数配置交给插件管理面板 +- 当插件激活时,执行 plugin.enable(),把 ratelimit 添加进来 +- 当插件禁用时,执行 plugin.disable(),把 ratelimit 移除 + +以上就是插件的核心内容了,任何功能扩展都可以这样处理。只要两步: + +- 实现插件的 enable 接口,用于添加功能; +- 再实现 disable 接口,用于移除功能模块。 + +```ts +class MyPlugin extends Plugin { + enable() { + // 添加的逻辑 + } + + disable() { + // 移除的逻辑 + } +} +``` + +**不实现 disable 可不可以?** + +disable 接口是为了实现插件的热插拔,应用不需要重启就能实现插件的激活和禁用。如果某个插件不需要被禁用,也可以只实现 enable 接口。 diff --git a/docs/guide/plugin-development/pluggable-interfaces.md b/docs/guide/plugin-development/pluggable-interfaces.md new file mode 100644 index 0000000000000000000000000000000000000000..e3fa6e49811bfb2b81e0f2b110e639c08ffe91f5 --- /dev/null +++ b/docs/guide/plugin-development/pluggable-interfaces.md @@ -0,0 +1,43 @@ +--- +order: 2 +--- +# Pluggable Interfaces + +Plugins are pluggable independent modules divided by functionality. In order to extend the functionality in the way of plugins, it is necessary to implement methods to add and remove extended functionality. +The main pluggable interfaces of NocoBase are. + +## Middleware + +- add: app.use() +- remove: app.unuse() is not yet implemented, you can directly manipulate the app.middleware array to remove + +## Events + +- Add: app.on() +- Remove: app.removeListener() + +## Resources + +- Add: app.resource() +- Remove: None + +## Actions + +- Add: app.actions() +- Delete: None + +## Data Tables + +- Add: app.collection() +- Delete: None + +## Components (front-end) + +- Add createRouteSwitch, createCollectionField, createSchemaComponent +- Remove: None at this time + + + +Currently, NocoBase's plug-in mechanism is not perfect and cannot fully implement hot-plugging. Front-end extensions have to be manually handled by developers and then rebuilt. + + diff --git a/docs/guide/plugin-development/pluggable-interfaces.zh-CN.md b/docs/guide/plugin-development/pluggable-interfaces.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..4c6298d2fd7f797fc8900d39c8eb1fbf81622f98 --- /dev/null +++ b/docs/guide/plugin-development/pluggable-interfaces.zh-CN.md @@ -0,0 +1,46 @@ +--- +order: 2 +--- + +# 插件化接口有哪些? + +插件是按功能划分的可插拔的独立模块,为了以插件的方式扩展功能,需要实现扩展功能的添加和删除方法。 +NocoBase 的插件化接口主要有: + +## 中间件 + +- 添加:app.use() +- 删除:app.unuse() 暂未实现,可以直接操作 app.middleware 数组来移除 + +## 事件 + +- 添加:app.on() +- 删除:app.removeListener() + +## 资源 + +- 添加:app.resource() +- 删除:暂无 + +## 操作 + +- 添加:app.actions() +- 删除:暂无 + +## 数据表 + +- 添加:app.collection() +- 删除:暂无 + +## 组件(前端) + +- 添加 createRouteSwitch、createCollectionField、createSchemaComponent +- 删除:暂无 + + + +目前 NocoBase 的插件化机制还不完善,不能完全实现热插拔。前端的扩展还得依赖开发手动处理再重新构建。 + + + + diff --git a/docs/guide/quickstart.md b/docs/guide/quickstart.md new file mode 100644 index 0000000000000000000000000000000000000000..8751f16e3a690d8c6bb07ab08ddce9ce1f9c6af6 --- /dev/null +++ b/docs/guide/quickstart.md @@ -0,0 +1,106 @@ +--- +order: 2 +toc: menu +--- + +# Quick Start + +This article will help you quickly install and start NocoBase, and introduce the basic usage. + +## 1. Requirements + +Please make sure your system has installed Node.js 12.x or above. + +```bash +$ node -v +v12.13.1 +``` + +If you don't have Node.js installed you can download and install [the latest LTS version](https://nodejs.org/en/download/) from the official website. If you plan to work with Node.js for a long time, it is recommended to use [nvm](https://github.com/nvm-sh/nvm) (for Win systems you can use [nvm-windows](https://github.com/coreybutler/nvm-windows)) to manage Node.js version. + +Also, it is recommended to use the yarn package manager. + +```bash +$ npm install --global yarn +``` + +With the environment ready, the next step is to install a NocoBase application. + +## 2. Installation and Start-up + +To make it easier for newcomers to install and start quickly, NocoBase provides a very simple command line. + +```bash +$ yarn create nocobase-app my-nocobase-app --quickstart +``` + +The above command will help you quickly download, install and start the NocoBase application. If you prefer to perform step by step, you can also do this: + +```bash +# 1. 创建项目 +$ yarn create nocobase-app my-nocobase-app + +# 2. 切换到项目根目录 +$ cd my-nocobase-app + +# 3. 初始化数据 +$ yarn nocobase init --import-demo + +# 4. 启动项目 +$ yarn start +``` + +Executing it step-by-step will help you understand the process and make it easier to troubleshoot issues that arise during the installation. If a problem arises and you can't fix it yourself, please post the error log from the terminal output on [GitHub Issue](https://github.com/nocobase/nocobase/issues) and we'll all work together to help you fix it. + +When you see the following, it means that the NocoBase you just created has been installed and started. + + + +## 3. Log in to NocoBase + +Use a browser to open http://localhost:8000 and you will see the login page of NocoBase. The initial account is `admin@nocobase.com` and the password is `admin123`. + + + +## 4. Create Collections and Fields + +NocoBase provides a global data table configuration panel to facilitate users to quickly create collections and fields. + + + +Follow the instructions in the video to create the posts and tags tables and several fields. + +## 5. Configure Menus and Pages + +Next, add new menu groups and pages to manage the article and tag data you just created. + + + +## 6. Create Blocks to Pages + +Create table blocks of articles and labels in the page configured in the previous step, and enable the actions that need to be opened. + +```ts +// coming soon +``` + +## 7. Add Data + +Now you can add posts and tags. + +```ts +// coming soon +``` + +## 8. Connect to the API + +In addition to the visual interface, data resources can also be accessed through the [REST API](/zh-CN/api/rest-api) provided by NocoBase. + +- post resorce:http://localhost:8000/api/posts +- user resource :http://localhost:8000/api/tags + +You can directly click to open the above API address, or use a tool like Postman to access it. NocoBase also provides a more suitable API Client (JavaScript SDK) to manage NocoBase data resources. For more information, please refer to the [API Client](/zh-CN/api/client#apiclient) chapter. \ No newline at end of file diff --git a/docs/guide/quickstart.zh-CN.md b/docs/guide/quickstart.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..c665a9b5363011ff948f7a07f82f4ca73e2e645f --- /dev/null +++ b/docs/guide/quickstart.zh-CN.md @@ -0,0 +1,112 @@ +--- +order: 2 +toc: menu +--- + +# 快速入门 + +本篇文章将帮助你快速安装并启动 NocoBase,并介绍基本的使用方法。 + +## 1. 环境要求 + +请确保你的系统已经安装了 Node.js 12.x 或以上版本。 + +```bash +$ node -v +v12.13.1 +``` + +如果你没有安装 Node.js 可以从官网下载并安装[最新的 LTS 版本](https://nodejs.org/en/download/)。如果你打算长期与 Node.js 打交道,推荐使用 [nvm](https://github.com/nvm-sh/nvm)(Win 系统可以使用 [nvm-windows](https://github.com/coreybutler/nvm-windows) )来管理 Node.js 版本。 + +另外,推荐使用 yarn 包管理器。 + +```bash +$ npm install --global yarn +``` + +由于国内网络环境的原因,强烈建议你更换国内镜像。 + +```bash +$ yarn config set registry https://registry.npm.taobao.org/ +``` + +环境准备就绪,下一步我们来安装一个 NocoBase 应用。 + +## 2. 安装与启动 + +为了方便新人快速的安装并启动, NocoBase 提供了一行非常简单的命令: + +```bash +$ yarn create nocobase-app my-nocobase-app --quickstart +``` + +上面这行命令会帮助你快速的下载、安装并启动 NocoBase 应用。如果你喜欢分步执行,也可以这样: + +```bash +# 1. 创建项目 +$ yarn create nocobase-app my-nocobase-app + +# 2. 切换到项目根目录 +$ cd my-nocobase-app + +# 3. 初始化数据 +$ yarn nocobase init --import-demo + +# 4. 启动项目 +$ yarn start +``` + +分步执行有助于理解整个流程,也更易于排查安装过程中出现的问题。如果出现问题,你也无法自行解决,请将终端输出的错误日志贴在 [GitHub Issue](https://github.com/nocobase/nocobase/issues) 上,大家会一起帮你解决问题。 + +当你看到下面内容,说明你刚才创建的 NocoBase 已经安装并启动了。 + + + +## 3. 登录 NocoBase + +使用浏览器打开 http://localhost:8000 ,你会看到 NocoBase 的登录页面,初始的账号为 `admin@nocobase.com`,密码为 `admin123`。 + + + +## 4. 创建数据表和字段 + +NocoBase 提供了一个全局的数据表配置面板,方便用户快速的创建数据表和字段。 + + + +按照视频的提示,创建文章(posts)和标签(tags)两张数据表和若干字段。 + +## 5. 配置菜单和页面 + +接着,添加新的菜单分组和页面用于管理刚才创建的文章和标签数据。 + + + +## 6. 在页面内布置区块 + +在上一步配置的页面里创建文章和标签的表格区块,并启用需要开放的操作。 + +```ts +// 视频 +``` + +## 7. 添加文章和标签数据 + +现在可以添加文章和标签了。 + +```ts +// 视频 +``` + +## 8. 通过 API 访问 + +除了可视化界面以外,也可以通过 NocoBase 提供的 [REST API](/zh-CN/api/rest-api) 访问数据资源。 + +- 文章资源:http://localhost:8000/api/posts +- 标签资源:http://localhost:8000/api/tags + +你可以直接点击打开上面 API 地址,或者使用类似 Postman 的工具访问。NocoBase 也提供了更贴合的 API Client(JavaScript SDK)来管理 NocoBase 数据资源,更多内容请查看 [API Client](/zh-CN/api/client#apiclient) 章节。 \ No newline at end of file diff --git a/docs/images/API.png b/docs/images/API.png new file mode 100644 index 0000000000000000000000000000000000000000..9528ae3aa25bbd8b5763b2dfebcc454da1af7db9 Binary files /dev/null and b/docs/images/API.png differ diff --git a/docs/images/MiniMIS.png b/docs/images/MiniMIS.png new file mode 100644 index 0000000000000000000000000000000000000000..3da87253debf5d049b896458b6ad64dfba48ced6 Binary files /dev/null and b/docs/images/MiniMIS.png differ diff --git a/docs/images/MiniProgram.png b/docs/images/MiniProgram.png new file mode 100644 index 0000000000000000000000000000000000000000..b54052ab66612d471b28b293fada54f330e43c31 Binary files /dev/null and b/docs/images/MiniProgram.png differ diff --git a/docs/images/NocoBase.png b/docs/images/NocoBase.png new file mode 100644 index 0000000000000000000000000000000000000000..ae481139de27969faea304bb0f21b6a7f5d9b015 Binary files /dev/null and b/docs/images/NocoBase.png differ diff --git a/docs/images/SaaS1.png b/docs/images/SaaS1.png new file mode 100644 index 0000000000000000000000000000000000000000..16b53a01db6e6b303502ec34dcd23a6a74c0f6f9 Binary files /dev/null and b/docs/images/SaaS1.png differ diff --git a/docs/images/SaaS2.png b/docs/images/SaaS2.png new file mode 100644 index 0000000000000000000000000000000000000000..99c8f61a6a60de8f8d0e2eb9c9b5f186989e7dbe Binary files /dev/null and b/docs/images/SaaS2.png differ diff --git a/docs/images/img1.png b/docs/images/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..1d0234fd6fcdfd8b0b3ef7c43bc61c15995dc527 Binary files /dev/null and b/docs/images/img1.png differ diff --git a/docs/images/img2.png b/docs/images/img2.png new file mode 100644 index 0000000000000000000000000000000000000000..2462e69a71ae3d00989329f9c8e061aece3daed8 Binary files /dev/null and b/docs/images/img2.png differ diff --git a/docs/index.md b/docs/index.md index 5244a2c4dae8516a01cadf1b7aa1acdd6c77153a..23944fd7c338f5677e77fa025b1f6c9ca627fb3e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,20 +1,5 @@ --- -title: NocoBase - An open source and free no-code development platform -hero: - title: NocoBase - desc: An open source and free no-code development platform - actions: - - text: Getting Started - link: /guide -features: - - icon: https://gw.alipayobjects.com/zos/bmw-prod/881dc458-f20b-407b-947a-95104b5ec82b/k79dm8ih_w144_h144.png - title: Feature 1 - desc: Balabala - - icon: https://gw.alipayobjects.com/zos/bmw-prod/d60657df-0822-4631-9d7c-e7a869c2f21c/k79dmz3q_w126_h126.png - title: Feature 2 - desc: Balabala - - icon: https://gw.alipayobjects.com/zos/bmw-prod/d1ee0c6f-5aed-4a45-a507-339a4bfe076c/k7bjsocq_w144_h144.png - title: Feature 3 - desc: Balabala -footer: Copyright © 2020-2021 NocoBase. All rights reserved. +sidemenu: false --- + + \ No newline at end of file diff --git a/docs/index.zh-CN.md b/docs/index.zh-CN.md index 0b622a96bd824e74d97968d17e66900a27245b2c..0476de3a3fb7d108187e7f59116b09d50e77ac88 100644 --- a/docs/index.zh-CN.md +++ b/docs/index.zh-CN.md @@ -1,20 +1,5 @@ --- -title: NocoBase - An open source and free no-code development platform -hero: - title: NocoBase - desc: An open source and free no-code development platform - actions: - - text: 快速上手 - link: /zh-CN/guide -features: - - icon: https://gw.alipayobjects.com/zos/bmw-prod/881dc458-f20b-407b-947a-95104b5ec82b/k79dm8ih_w144_h144.png - title: 特性 1 - desc: Balabala - - icon: https://gw.alipayobjects.com/zos/bmw-prod/d60657df-0822-4631-9d7c-e7a869c2f21c/k79dmz3q_w126_h126.png - title: 特性 2 - desc: Balabala - - icon: https://gw.alipayobjects.com/zos/bmw-prod/d1ee0c6f-5aed-4a45-a507-339a4bfe076c/k7bjsocq_w144_h144.png - title: 特性 3 - desc: Balabala -footer: Copyright © 2020-2021 NocoBase. All rights reserved. +sidemenu: false --- + + \ No newline at end of file diff --git a/docs/plugins/concepts/actions.md b/docs/plugins/concepts/actions.md deleted file mode 100644 index bb70b34a7a152cef0f658cadbfd21cc7c929a5ae..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/actions.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Actions - 操作方法 -group: - order: 2 - title: 概念 ---- - -# Actions - 操作方法 - -与 resourcer.registerAction 用法一致 - -```ts -export async function get(ctx, next) { - await next(); -} - -export const list = { - filter, - fields, // 初始化的参数 - async handler(ctx, next) { - await next(); - } -} -``` diff --git a/docs/plugins/concepts/blocks.md b/docs/plugins/concepts/blocks.md deleted file mode 100644 index 18d1f0b071d246c86fd11f4bee077764cb7e7790..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/blocks.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Blocks - 区块 ---- - -# Blocks - 区块 - -## 字段区块 - -```ts -export default { - name: 'examples', - fields: [ - { - name: 'content', - interface: 'string', - type: 'string', - block: { - type: 'textarea', - }, - } - ], -}; -``` - -## 数据表区块 - -```ts -export default { - name: 'examples', - blocks: [ - { - type: 'form', - name: 'form', - title: '表单', - fields: ['col1', 'col2'], - }, - ], -}; -``` - -## 后台可配置 - -```ts -export const form = { - title: '表单', - options: { - // form blocks 配置项默认值 - }, - properties: { - // 需要开放配置的字段 - }, - linkages: { - // 字段联动 - }, -}; -``` diff --git a/docs/plugins/concepts/collections.md b/docs/plugins/concepts/collections.md deleted file mode 100644 index 62adcc70f97b7ad521caff703aebddae070323dd..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/collections.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Collections - 数据集 ---- - -# Collections - 数据集 - -与 database.table 用法一致 - -```ts -export default { - name: 'examples', - fields: [], -} -``` - -配置扩展 - -```ts -import { extend } from '@nocobase/database'; - -export default extend({ - name: 'examples', - fields: [], -}); -``` \ No newline at end of file diff --git a/docs/plugins/concepts/fields.md b/docs/plugins/concepts/fields.md deleted file mode 100644 index 0aa16af7220890d2732357c0e0541c77f44d4655..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/fields.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Fields - 字段 ---- - -# Fields - -一个完整的字段由「数据类型」和「区块类型」两部分参数组合而成。同一个数据类型可能对应多种区块类型,同一个区块类型的数据值也可能是多种数据类型。因此提炼了字段的接口(Interface)作为唯一标识。 - -字段的 Types 和 Blocks 就不赘述了,请查阅核心章节介绍 - -- [Field Types](/cores/packages/database#field-types) -- [Field Blocks](/cores/packages/blocks#fields---字段) - - -在 NocoBase 里,普通用户概念上的字段类型指的是 interface;field type 只表示数据类型 - data type;field block 是 ui 组件,同一个组件也可能表示多种字段类型(interface)。 - - -## Interfaces - 接口类型 - -```ts -{ - // 多行文本框 - interface: 'textarea', - // 长文本类型 - type: 'text', // 也可以是 string - // 使用 多行文本框 区块渲染 UI - block: { - type: 'textarea', - }, -} - -{ - // 电子邮箱 - interface: 'email', - // 字符串 - type: 'string', - format: 'email', - // 使用 String 区块渲染 - block: { - type: 'string', - }, -} - -{ - // 手机号 - interface: 'phone', - // 字符串 - type: 'string', - format: 'phone', - // 使用 String 区块渲染 - block: { - type: 'string', - }, -} -``` - -分类有: - -- basic -- media -- choices -- datetime -- relation -- systemInfo -- developerMode -- others - -### basic -#### string -#### textarea -#### phone -#### email -#### number -#### percent - -### media -#### markdown -#### wysiwyg -#### attachment - -### choices -#### select -#### multipleSelect -#### radio -#### checkboxes -#### boolean -#### chinaRegion - -### datetime -#### datetime -#### time - -### relation -#### subTable -#### linkTo - -### systemInfo -#### createdAt -#### createdBy -#### updatedAt -#### updatedBy - -### developerMode - -#### primaryKey -#### sort -#### password -#### icon -#### json - -### Others - -以下字段可能会被遗弃 - -#### description -#### group -#### status \ No newline at end of file diff --git a/docs/plugins/concepts/hooks.md b/docs/plugins/concepts/hooks.md deleted file mode 100644 index 1b8166be9c03f08f6990ea93a52337eae2f4369e..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/hooks.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Hooks - 钩子 ---- - -# Hooks - 钩子 - -目前支持的 hook 有两类 database.addHook 和 Model.addHook - -未完待续... \ No newline at end of file diff --git a/docs/plugins/concepts/locales.md b/docs/plugins/concepts/locales.md deleted file mode 100644 index 86f9148730f5262cefade20893f18ec2ef6fdfe5..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/locales.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Locales - 国际化 ---- - -# Locales - 国际化 未实现 - -NocoBase 采用 [formatjs](https://formatjs.io/docs/getting-started/installation) 来处理国际化问题。 - -直接写在代码里,详情参考 formatjs 用例,NocoBase 会封装一个更易用的 `__` 函数来处理国际化,如: - -```ts -__('Hello, {name}'); -``` - -在配置里有两种写法: - -模板字符串: - -```ts -{ - name: `{{ __('Hello, {name}') }}` -} -``` - -json 格式: - -```ts -{ - name: { - 'zh-CN': '{name},您好', - 'en-US': 'Hello, {name}', - }, -} -``` diff --git a/docs/plugins/concepts/middlewares.md b/docs/plugins/concepts/middlewares.md deleted file mode 100644 index 93aed1b6da99237349c606d308327b06d4037131..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/middlewares.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Middlewares - 中间件 ---- - -# Middlewares - 中间件 - -## koa -## resourcer -## action \ No newline at end of file diff --git a/docs/plugins/concepts/migrations.md b/docs/plugins/concepts/migrations.md deleted file mode 100644 index bea23af559d3f4f60da14edcec8c192e5653cda8..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/migrations.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Migrations - 迁移 ---- - -# Migrations - 迁移 \ No newline at end of file diff --git a/docs/plugins/concepts/models.md b/docs/plugins/concepts/models.md deleted file mode 100644 index 786dd5cb412ab50d1b9c4c1cfb734c7e3219660b..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/models.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Models - 模型 ---- - -# Models - 模型 - -将 models 统一放在 `/src/models`、`/lib/models` 目录下,将自动导入 database。 - -database.table 提供的数据表配置支持指定特殊 model,如: - -```ts -import { Model } from '@nocobase/database'; - -class Test extends Model { - // 在这个类里可以为 Test Model 扩展其他 API - static hello() { - - } -} - -export default { - name: 'tests', - model: Test, -}; -``` - -调用 Model - -```ts -const Test = db.getModel('tests'); -// Test 可以调用 hello 方法了 -Test.hello(); -``` \ No newline at end of file diff --git a/docs/plugins/concepts/resources.md b/docs/plugins/concepts/resources.md deleted file mode 100644 index 447d6be1062877c033335a2dad75fcbe8bc9b2a3..0000000000000000000000000000000000000000 --- a/docs/plugins/concepts/resources.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Resources - 资源 ---- - -# Resources - 资源 - -用法同 resourcer.define diff --git a/docs/plugins/index.md b/docs/plugins/index.md new file mode 100644 index 0000000000000000000000000000000000000000..8c9e23c238834729dd5e601bc05110e7e132d667 --- /dev/null +++ b/docs/plugins/index.md @@ -0,0 +1,90 @@ +--- +title: Plugins +toc: menu +nav: + title: Plugins + order: 4 +--- + +# Plugins + +## Plugin Manager + +Development can download, activate, disable, and remove plugins via the command line, which corresponds to + +```bash +## Download plugins, which can be activated quickly with the --enable parameter +yarn nocobase pm:download --enable +# Activate the plugin +yarn nocobase pm:enable +# Disable the plugin +yarn nocobase pm:disable +# Remove the plugin +yarn nocobase pm:remove +``` + +## List of existing plugins + +### @nocobase/plugin-collections datasheet configuration + +Provides an HTTP API for managing data tables and fields + +### @nocobase/plugin-permissions + +Permissions module + +### @nocobase/plugin-users + +User module + +### @nocobase/plugin-system-settings + +Site information configuration + +### @nocobase/plugin-china-region + +Field extension, China region + +### @nocobase/plugin-file-manager + +Field extension, attachment field + +### @nocobase/plugin-action-logs + +Action logs + +### @nocobase/plugin-multi-apps + +Dynamic multi-apps, a simple SaaS + +### @nocobase/plugin-export + +Operation extensions, export + +### @nocobase/plugin-notifications + +Notifications module (half-baked), only supports emailing for now, no visual interface + +### @nocobase/plugin-automations + +Automation (not available at the moment) + +### @nocobase/plugin-client + +Client-side plugin that provides visual configuration support for nocobase. Dependent plugins are. + +- @nocobase/plugin-collections (required) +- @nocobase/plugin-permissions (required) +- @nocobase/plugin-users (required) +- @nocobase/plugin-system-settings (required) +- @nocobase/plugin-file-manager (required) +- @nocobase/plugin-china-region (optional) +- @nocobase/plugin-action-logs (optional) + +Several components are included. + +- Store client ui-schema on the server side for on-demand dynamic output +- Store client-side ui-router on the server side for on-demand dynamic output +- Provide static server support for app dist, allowing configuration of app dist paths +- Provide initial demo data import support for nocobase installation, configurable via importData +- Provide visualization support for collections diff --git a/docs/plugins/index.zh-CN.md b/docs/plugins/index.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..bd6931dcb5065a7275d8c646d2b9a9c15c733ea0 --- /dev/null +++ b/docs/plugins/index.zh-CN.md @@ -0,0 +1,90 @@ +--- +title: 插件 +toc: menu +nav: + title: 插件 + order: 4 +--- + +# 插件 + +## 插件管理器 + +开发可以通过命令行下载、激活、禁用、移除插件,对应的命令行有: + +```bash +# 下载插件,可以通过 --enable 参数快速激活 +yarn nocobase pm:download --enable +# 激活插件 +yarn nocobase pm:enable +# 禁用插件 +yarn nocobase pm:disable +# 移除插件 +yarn nocobase pm:remove +``` + +## 已有的插件列表 + +### @nocobase/plugin-collections 数据表配置 + +提供 HTTP API 的方式管理数据表和字段 + +### @nocobase/plugin-permissions + +权限模块 + +### @nocobase/plugin-users + +用户模块 + +### @nocobase/plugin-system-settings + +站点信息配置 + +### @nocobase/plugin-china-region + +字段扩展,中国行政区 + +### @nocobase/plugin-file-manager + +字段扩展,附件字段 + +### @nocobase/plugin-action-logs + +操作日志 + +### @nocobase/plugin-multi-apps + +动态多应用,一个简易的 SaaS + +### @nocobase/plugin-export + +操作扩展,导出 + +### @nocobase/plugin-notifications + +通知模块(半成品),暂时只支持邮件发送,没有可视化界面 + +### @nocobase/plugin-automations + +自动化(暂不可用) + +### @nocobase/plugin-client + +客户端插件,为 nocobase 提供可视化配置的支持。依赖的插件有: + +- @nocobase/plugin-collections(必须) +- @nocobase/plugin-permissions(必须) +- @nocobase/plugin-users(必须) +- @nocobase/plugin-system-settings(必须) +- @nocobase/plugin-file-manager(必须) +- @nocobase/plugin-china-region(可选) +- @nocobase/plugin-action-logs(可选) + +包括几部分内容: + +- 将客户端 ui-schema 存储在服务端,以实现按需动态输出 +- 将客户端 ui-router 存储在服务端,以实现按需动态输出 +- 提供 app dist 的 static server 支持,可以配置 app 的 dist 路径 +- 为 nocobase 安装提供初始化 demo 数据导入的支持,可通过 importData 配置 +- 提供 collections 可视化支持 diff --git a/docs/plugins/packages/action-logs.md b/docs/plugins/packages/action-logs.md deleted file mode 100644 index 7cd512e3e37f2d6edd0e46f4cb7990fd5c2894fd..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/action-logs.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: '@nocobase/plugin-action-logs' -order: 5 -group: - order: 3 - title: 官方插件 ---- - -# @nocobase/plugin-action-logs - -操作记录 - -## 安装 - -```bash -yarn nocobase pull action-logs --start -``` diff --git a/docs/plugins/packages/automations.md b/docs/plugins/packages/automations.md deleted file mode 100644 index 16b081d50a560847af39d8dfac74206c49016b34..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/automations.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: '@nocobase/plugin-automations' -order: 4 ---- - -# @nocobase/plugin-automations - -提供自动化模块 - -## 安装 - -```bash -yarn nocobase pull automations --start -``` - -## 用例 - -```ts -// 省略上文 - -database.table({ - name: 'tests', - fields: [ - { - type: 'string', - name: 'name1', - }, - { - type: 'string', - name: 'name2', - }, - ], -}); - -database.table({ - name: 'demos', - fields: [ - { - type: 'string', - name: 'col1', - }, - { - type: 'string', - name: 'col2', - }, - ], -}); - -const [Automation, Test] = database.getModels(['automations', 'tests']); - -const automation = await Automation.create({ - title: 'a1', - enabled: true, - type: 'collections:afterCreate', - collection_name: 'tests', -}); - -automation.startJob('test', async (result, options) => { - // job 代码 -}); - -// 使用内置的 job -await automation.updateAssociations({ - jobs: [ - { - title: 'j1', - enabled: true, - type: 'create', - collection_name: 'demos', - values: [ - { - column: 'col1', - op: 'eq', - value: 'n1' - }, - { - column: 'col2', - op: 'ref', - value: 'name2' - }, - ], - } - ], -}); - -// tests 表新增数据会触发上面执行 job 任务 -await Test.create({ - name1: 'n11', - name2: 'n22', -}); -``` - -## Model API - -### Automation.load() -### automation.loadJobs() -### automation.startJob(jobName: string, callback: any) -### automation.cancelJob(jobName: string) -### Job.bootstrap() -### Job.process(result?: any, options?: any) -### Job.cancel() \ No newline at end of file diff --git a/docs/plugins/packages/collections.md b/docs/plugins/packages/collections.md deleted file mode 100644 index 5e07cab88c7eb2415bdd998e19987501ae729634..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/collections.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: '@nocobase/plugin-collections' -order: 1 ---- - -# @nocobase/plugin-collections - -提供数据表配置接口,可通过 HTTP API 管理数据表。 - -## 安装 - -```bash -yarn nocobase pull collections --start -``` \ No newline at end of file diff --git a/docs/plugins/packages/export.md b/docs/plugins/packages/export.md deleted file mode 100644 index e93072f06f2c9aea6f8e8b2487eea5cbffe6e377..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/export.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: '@nocobase/plugin-export' ---- - -# @nocobase/plugin-export - -提供导出功能 - - -暂时只支持 excel 导出 - - -## 安装 - -```bash -yarn nocobase pull export --start -``` - -## Action API - -### export - -参数和 list 一致,暂时只支持 excel 导出 - -```ts -api.resource(resourceName).export(params); -``` diff --git a/docs/plugins/packages/file-manager.md b/docs/plugins/packages/file-manager.md deleted file mode 100644 index 0e31ef75d3680064cf1b874d952aca64904d9255..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/file-manager.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: '@nocobase/plugin-file-manager' ---- - -# @nocobase/plugin-file-manager - -文件管理器 - -## 安装 - -```bash -yarn nocobase pull file-manager --start -``` - -## Field Interfaces - -### attachment - -附件字段 - -## Action API - -### upload - -文件上传 - -```ts -// 文件管理器接口 -await api.resource('attachments').upload({}); - -// 附件字段接口 -await api.resource('users.avatar').upload({ - associatedKey: 1, -}); -``` - -## Storages - -### local - -本地存储 - -### ali-oss - -阿里云 OSS \ No newline at end of file diff --git a/docs/plugins/packages/pages.md b/docs/plugins/packages/pages.md deleted file mode 100644 index af8b2df2a430d115d8e917f77a41f404365f0008..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/pages.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: '@nocobase/plugin-pages' -order: 1 ---- - -# @nocobase/plugin-pages - -将客户端的组件参数交由服务端管理,由服务端控制输出客户端所需的 ui schema。开发者可以随意适配任意前端组件。 - -## 安装 - -```bash -yarn nocobase pull pages --start -``` diff --git a/docs/plugins/packages/permissions.md b/docs/plugins/packages/permissions.md deleted file mode 100644 index b868a64e58a4bac55b17b974c7670ef6b301dba2..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/permissions.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: '@nocobase/plugin-permissions' -order: 1 ---- - -# @nocobase/plugin-permissions - -提供权限模块 - -## 安装 - -```bash -yarn nocobase pull permissions --start -``` - -## API - - - -- 提供 Permission Model 相关快捷数据操作 API -- 需要支持从代码层面快捷配置权限,无需经由后台 - 系统表相关操作权限可能是直接通过权限 api 配置或者 permission model api,直接写入数据库 -- 提供 ui schema 需要的 fields/actions/pages 相关 permission api - 现在有个 ac.can 可用,实际体验不够直接 -- 数据表权限设置只开放了业务表,系统表权限需要开发自行处理,但无提供相关 api - 如操作记录表、中国行政区表、附件表的情况: - - 操作记录表只开放查看,只能查看自己有权限能查看的数据表的操作 - - 中国行政区的省市区等数据仅登录用户可查看 - - 附件暂时没做权限限制 - - - -### context.ac.isRoot - -是否为 root 权限 - -### context.ac.can(collection) - -判断当前用户权限,支持链式操作。 - -#### ac.can(collection).permissions() - -获取当前 collection 的所有权限配置 - -#### ac.can(collection).act(actionName).any() - -是否允许 collection:actionName 操作,允许则返回相关配置 - -#### ac.can(collection).act(actionName).one(resourceKey) - -具体 resourceKey 值的 collection,是否允许 collection:actionName 操作,允许则返回相关配置 - -#### ac.as(roles).can(collection) - -指定 roles 的权限判断 \ No newline at end of file diff --git a/docs/plugins/packages/users.md b/docs/plugins/packages/users.md deleted file mode 100644 index 7c6609287380034b23ab75eb70f3ecba7bbf7e55..0000000000000000000000000000000000000000 --- a/docs/plugins/packages/users.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: '@nocobase/plugin-users' ---- - -# @nocobase/plugin-users - -提供用户模块 - - -用户模块目前的实现较简单 - - -## 安装 - -```bash -yarn nocobase pull users --start -``` - -## Action API - -### users:check - -检查用户是否已登录 - -```ts -await api.resource('users').check(); -``` - -### users:login - -登录 - -```ts -await api.resource('users').login({ - values: { - email, - password, - }, -}); -``` - -### users:register - -注册 - -```ts -await api.resource('users').register({ - values: { - email, - password, - ...others, - }, -}); -``` - -### users:logout - -注销 - - -注销后端暂无任何处理,实际需要清除 token。 - - -```ts -await api.resource('users').logout(); -``` - -### users:lostpassword - -忘记密码 - -```ts -await api.resource('users').lostpassword({ - values: { - email, - } -}); -``` - -### users:resetpassword - -重置密码 - - -未实现邮件发送 - - -```ts -await api.resource('users').lostpassword({ - values: { - email, - password, - reset_token, - } -}); -``` - -### users:getUserByResetToken - -根据 reset token 获取用户信息 - -```ts -await api.resource('users').getUserByResetToken({ - values: { - reset_token, - } -}); -``` - - -## Fields Types - -### context 未实现 - -上下文类型,可以从 app.context 里获取信息,如 UA、Client IP 等。利用 context 类型,createdBy/updatedBy 的实现也变得更简单了: - -createdBy - -```ts -{ - name: 'created_by_id', - type: 'context', - dataIndex: 'state.currentUser.id', - createOnly: true, -} -``` - -updatedBy - -```ts -{ - name: 'updated_by_id', - type: 'context', - dataIndex: 'state.currentUser.id', -} -``` - -## Field Interfaces - -### createdBy - -创建人 - -### updatedBy - -最后更新人 diff --git a/docs/plugins/tutorials/developer-mode.md b/docs/plugins/tutorials/developer-mode.md deleted file mode 100644 index ed1adf195543218c6dcb4d8227defd25d73df44f..0000000000000000000000000000000000000000 --- a/docs/plugins/tutorials/developer-mode.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: 开发者模式 -order: 3 -toc: menu ---- - -# 开发者模式 待完善 - -开发者模式是专门为开发者提供的修改、调试复杂配置项的运行环境。在开发者模式下: - -- 可以查看系统配置表 -- 配置开放 JSON Editor,可以修改和调试更多隐藏配置项 diff --git a/docs/plugins/tutorials/index.md b/docs/plugins/tutorials/index.md deleted file mode 100644 index 8ff77870feae1dbd33cf6f0edb682fe36d7afedb..0000000000000000000000000000000000000000 --- a/docs/plugins/tutorials/index.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: 了解插件 -order: 1 -nav: - title: 插件 - order: 3 - path: /plugins -group: - order: 1 - title: 教程 ---- - -# 了解插件 - -NocoBase 核心提供了丰富的 API 用于处理扩展,但是直接调用底层 API 成本较高。因此,又提供了更为灵活、便捷的插件化管理方式,用户只需要将代码放在约定的几个目录里即可。 - - -NocoBase 插件之间是平行的,不存在直接的依赖关系,不过插件在加载时可能有优先级。 - - -## 目录结构 未实现 - -```bash -|- @nocobase/plugin-[name] 或 nocobase-plugin-[name] - |- src - |- actions - |- collections - |- fields - |- hooks - |- interfaces - |- middlewares - |- models - |- resources - |- blocks -``` - - - -目前 v0.4 版本的插件还十分简陋,只提供了一个非常原生态的函数扩展,其他的都需要开发者根据情况调用核心 API 来完成各类功能扩展,并未提供约定式目录,也没有完整的生命周期机制。没有安装/卸载、激活/禁用,加载即激活。 - - - -## PluginManager 未实现 - -插件的几个状态 - -- 下载 -- 启动 -- 停止 -- 重启 -- 删除 - -### API 未实现 - -- `pluginManager.pull()` -- `pluginManager.start()` -- `pluginManager.stop()` -- `pluginManager.restart()` -- `pluginManager.remove()` - -### CLI 未实现 - -- `yarn nocobase pull ` -- `yarn nocobase start ` -- `yarn nocobase stop ` -- `yarn nocobase restart ` -- `yarn nocobase remove ` diff --git a/docs/plugins/tutorials/plugin-cli.md b/docs/plugins/tutorials/plugin-cli.md deleted file mode 100644 index 2100b39f407313dd8021636535fa9cb560dff3e4..0000000000000000000000000000000000000000 --- a/docs/plugins/tutorials/plugin-cli.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: 插件命令行操作 -order: 2 -toc: menu ---- - -# 插件命令行操作 未实现 - -## pull - 拉取 - -将插件包从远程下载到本地列表 - -## start - 启动 - -启动插件 - -## stop - 停止 - -停止插件 - -## rm - 移除 - -插件将从本地列表移除 \ No newline at end of file diff --git a/docs/plugins/tutorials/server-lifecycle.md b/docs/plugins/tutorials/server-lifecycle.md deleted file mode 100644 index 97fc3286666536bca5a6fec828dbac1c164720e8..0000000000000000000000000000000000000000 --- a/docs/plugins/tutorials/server-lifecycle.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: NocoBase 生命周期 -order: 2 -toc: menu ---- - -# NocoBase 生命周期 - -每个 NocoBase 实例在被创建时都要经过一系列的初始化过程,在这个过程中某些节点会运行一些函数,这些节点就是生命周期的钩子,有了钩子的存在,代码不论按什么顺序书写,都会按照既定的顺序执行。NocoBase 的生命周期大概分为四个环节: - -1. 初始化实例 -2. 加载配置 -3. 数据库操作 -4. 每次请求中 - -## 初始化实例 - -- koa:nocobase 实例 -- database:数据库实例 -- resourcer:koa 的分支,负责 resource router -- pluginManager:插件管理器实例 - -现阶段的设计 sever 直接继承了 koa application,其他三个作为 server 实例的成员存在。 - - -pluginManager 的初始化存在较大缺陷,在初始化时直接加载了配置,暂时无法处理数据库操作。 - - -## 加载配置 - -- table hooks:表配置事件 -- table options:表配置 -- model hooks:model 事件 - -系统表配置从文件目录里导入,业务表配置从数据库里导入,部分开放的系统表从文件目录导入之后,又从数据库里更新,如用户表。 - - - -resourcer 配置是运行时初始化,在 koa middleware 中。hooks 分 table、model、plugin、resourcer 四类,暂时并不统一。 - -另外,还有个非常重要的细节,生命周期解决了大结构的执行顺序,但并未解决同一挂载点多钩子之间的执行顺序。 - - - -## 数据库操作 - -- initialize:初始化,app 启动或重启时都执行 -- install:安装操作,只执行一次 -- upgrade:更新操作,只执行一次 -- uninstall:卸载操作,只执行一次 - - -目前还不支持,这部分的钩子主要用于管理插件。 - - -## 每次请求中 - -- koa middleware -- resourcer middleware -- resource middleware -- action middleware -- action handler - -客户端请求时,都会执行。 - -虽然大部分框架都提供了中间件,但是中间件的执行顺序(优先级)依赖于编码顺序,这种方式非常不利于插件化管理。因此,在 Resourcer 设计思想里,将中间件做了分层,不同层级的 middlewares 不依赖于编码顺序,而是如下顺序: - -1. 首先,koa 层:`koa.use` -2. 其次,resourcer 层:`resourcer.use` -3. 再次,resource 层(每个资源独立):`resourcer.registerActionMiddleware` -4. 然后,action 层:`resourcer.registerResourceMiddleware` -5. 最后,执行 action handler - -不过,每个层次的中间件执行顺序还依赖于编码顺序,如有需要再进行更细微的改进。 diff --git a/docs/plugins/tutorials/testing.md b/docs/plugins/tutorials/testing.md deleted file mode 100644 index 756898d1bc5271726f8ddbeb5e552d5bad165af0..0000000000000000000000000000000000000000 --- a/docs/plugins/tutorials/testing.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: 如何编写测试 -order: 4 -toc: menu ---- - -# 如何编写测试 未实现 - -NocoBase 提供了 @nocobase/test 用于编写和调试插件。 - -```ts -import { mockServer } from '@nocobase/test'; - -describe('test', () => { - let api; - - beforeEach(async () => { - api = mockServer({}); - await api.database.sync(); - }); - - afterEach(async () => { - await api.database.close(); - }); - - it('test resource', () => { - await app.resource('demos').get(); - }); - - it('test request', () => { - await app.request().get('/'); - }); -}); -``` diff --git a/docs/reference/application.md b/docs/reference/application.md new file mode 100644 index 0000000000000000000000000000000000000000..5e1fcc812c7771932b9db195e5873b321fcf451d --- /dev/null +++ b/docs/reference/application.md @@ -0,0 +1,80 @@ +--- +nav: + title: API + order: 3 +toc: menu +--- + +# Application + +## app.db + +数据库实例 + +## app.resourcer + +资源实例 + +## app.pm + +插件管理器 + +## app.i18n + +国际化 + +## app.constructor() + +构造器 + +## app.use() + +中间件 + +## app.on() + +事件 + +## app.emit() + +## app.emitAsync() + +## app.collection() + +等同于 app.db.collection() + +## app.actions() + +等同于 app.resourcer.registerActions() + +## app.resource() + +等同于 app.resourcer.define() + +## app.parse() + +等同于 app.cli.parse() + +## app.load() + +加载配置 + +## app.init() + +初始化 + +## app.start() + +启动应用 + +## app.stop() + +停止应用 + +## app.command() + +等同于 app.cli.command() + +## app.plugin() + +等同于 app.pm.add() \ No newline at end of file diff --git a/docs/reference/cli.md b/docs/reference/cli.md new file mode 100644 index 0000000000000000000000000000000000000000..ce608643096be61ddca5d3495d1ca7861f49ad47 --- /dev/null +++ b/docs/reference/cli.md @@ -0,0 +1,13 @@ +--- +toc: menu +--- + +# CLI + +## init +## start +## db:sync +## pm:download +## pm:enable +## pm:disable +## pm:remove diff --git a/docs/reference/client.md b/docs/reference/client.md new file mode 100644 index 0000000000000000000000000000000000000000..e845d83561cea3fec109cb1546737645029bb845 --- /dev/null +++ b/docs/reference/client.md @@ -0,0 +1,16 @@ +--- +toc: menu +--- + +# Client + +## APIClient + +## createRouteSwitch + +## createCollectionField + +## createSchemaComponent + +## i18n + diff --git a/docs/reference/collection.md b/docs/reference/collection.md new file mode 100644 index 0000000000000000000000000000000000000000..5a71d32dc7ec81ece8756d37444b20dfdb26375f --- /dev/null +++ b/docs/reference/collection.md @@ -0,0 +1,17 @@ +--- +toc: menu +--- + +# Collection + +## collection.constructor() +## collection.mergeOptions() +## collection.sync() +## collection.hasField() +## collection.getField() +## collection.addField() +## collection.setFields() +## collection.mergeField() +## collection.removeField() +## collection.forEachField() +## collection.findField() \ No newline at end of file diff --git a/docs/reference/context.md b/docs/reference/context.md new file mode 100644 index 0000000000000000000000000000000000000000..82b41dd76cbda52de774b4ee24022f6c91491e38 --- /dev/null +++ b/docs/reference/context.md @@ -0,0 +1,16 @@ +--- +toc: menu +--- + +# Context + +## ctx.db + +## ctx.resourcer + +## ctx.action + +## ctx.i18n + +## ctx.t() + diff --git a/docs/reference/database.md b/docs/reference/database.md new file mode 100644 index 0000000000000000000000000000000000000000..06dc10c1a07fabd91ddd7ec1ee988d15295af290 --- /dev/null +++ b/docs/reference/database.md @@ -0,0 +1,18 @@ +--- +toc: menu +--- + +# Database + +## db.constructor() +## db.collection() +## db.sync() +## db.close() +## db.registerFieldTypes() +## db.import() +## db.on() +## db.emitAsync() +## db.emit() +## db.registerModels() +## db.registerRepositories() +## db.registerOperators() diff --git a/docs/reference/field-types.md b/docs/reference/field-types.md new file mode 100644 index 0000000000000000000000000000000000000000..7408d98152da2f95fa244868c38788b9c351d0c4 --- /dev/null +++ b/docs/reference/field-types.md @@ -0,0 +1,30 @@ +--- +toc: menu +--- + +# Field Types + +## Field - abstract +## RelationField - abstract +## HasOneField +## HasManyField +## BelongsToField +## BelongsToManyField +## StringField +## TextField +## IntegerField +## FloatField +## DoubleField +## RealField +## DecimalField +## DateField +## TimeField +## JsonField +## JsonbField +## VirtualField +## SortField +## PasswordField +## RadioField +## UidField +## CreatedByField +## UpdatedByField diff --git a/docs/reference/operators.md b/docs/reference/operators.md new file mode 100644 index 0000000000000000000000000000000000000000..3888e2c401083f1b6f7d466c58255829b1b48bd6 --- /dev/null +++ b/docs/reference/operators.md @@ -0,0 +1,50 @@ +--- +toc: menu +--- + +# Operators + +## string +- includes +- notIncludes +- eq +- ne +- null +- notNull +## number +- eq +- ne +- gt +- gte +- lt +- lte +- between +- null +- notNull +## select +- eq +- ne +- in +- notIn +- null +- notNull +## multipleSelect +- match +- notMatch +- anyOf +- noneOf +- null +- notNull +## date +- dateOn +- dateNotOn +- dateBefore +- dateAfter +- dateNotBefore +- dateNotAfter +- null +- notNull +## association +- fieldName.$name +- exists +- notExists \ No newline at end of file diff --git a/docs/reference/plugin-manager.md b/docs/reference/plugin-manager.md new file mode 100644 index 0000000000000000000000000000000000000000..f3d7c64b9e456074e2ec6b1443c66146bc0ebd10 --- /dev/null +++ b/docs/reference/plugin-manager.md @@ -0,0 +1,19 @@ +--- +toc: menu +--- + +# PluginManager + +## pm.constructor() + +## pm.forEach() + +## pm.load() + +## pm.download() + +## pm.enable() + +## pm.disable() + +## pm.remove() \ No newline at end of file diff --git a/docs/reference/plugin.md b/docs/reference/plugin.md new file mode 100644 index 0000000000000000000000000000000000000000..6c47a9ef9380c986262bf370d5565167edf15ff6 --- /dev/null +++ b/docs/reference/plugin.md @@ -0,0 +1,11 @@ +--- +toc: menu +--- + +# Plugin + +## plugin.constructor() +## plugin.enable() +## plugin.disable() +## plugin.upgrade() +## plugin.remove() \ No newline at end of file diff --git a/docs/reference/repository.md b/docs/reference/repository.md new file mode 100644 index 0000000000000000000000000000000000000000..6de2a9e51db6840bb814273f205630a3f776d2ca --- /dev/null +++ b/docs/reference/repository.md @@ -0,0 +1,696 @@ +--- +toc: menu +--- + +# Repository + +## `repository.find()` + +查询数据,返回数组。无数据时为空数组,不返回 count。如果需要,请使用 [repository.findAndCount()](#repositoryfindandcount) 方法。 + +##### Definition + +```ts +interface find { + (options?: FindOptions): Promise +} + +interface FindOptions extends Sequelize.FindOptions { + // 数据过滤 + filter?: FilterOptions; + // 输出结果显示哪些字段 + fields?: string[]; + // 输出结果不显示哪些字段 + expect?: string[]; + // 附加字段,用于控制关系字段的输出 + appends?: string[]; + // 排序,字段前面加上 “-” 表示降序 + sort?: string[]; +} + +// 待补充 +type FilterOptions = any; +``` + +##### Examples + +###### 全览 + +```ts +await repository.find({ + // 过滤 + filter: { + $and: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6) + $or: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6) + someAttribute: { + // Basics + $eq: 3, // = 3 + $ne: 20, // != 20 + $is: null, // IS NULL + $not: true, // IS NOT TRUE + $gt: 6, // > 6 + $gte: 6, + }, + // 支持使用逗号间隔 + 'someAttribute.$eq': 3, + // 内嵌的,一般是关系数据 + nested: { + someAttribute: {}, + }, + // 同上,也支持使用逗号间隔 + 'nested.someAttribute': { + // 同上 + }, + }, + // 字段白名单 + fields: [], + // 附加字段,主要用于附加关系字段 + appends: [], + // 字段黑名单 + expect: [], + // 排序 + sort: ['-createdAt', 'updatedAt'], +}); +``` + +###### filter 参数示例说明 + +以文章和标签为例,文章和标签的 collection 如下: + +```ts +const Tag = db.collection({ + name: 'tags', + fields: [ + { type: 'string', name: 'name' }, + ], +}); + +const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'text', name: 'content' }, + { type: 'belongsToMany', name: 'tags' }, + ], +}); +``` + +最简单的筛选过滤 + +```ts +await Post.repository.find({ + filter: { + 'name': 'post1', + }, +}); +``` + +支持多种 Operators,以 `$` 开头。[更多内容,查阅 Operators 章节](operators.md) + +```ts +await Post.repository.find({ + filter: { + 'name.$includes': 'post1', + // 等同于 + name: { + $includes: 'post1', + }, + }, +}); +``` + +支持关系字段过滤,可以使用 dot 来表示层级结构 + +```ts +await Post.repository.find({ + filter: { + 'tags.name': 'tag1', + // 等同于 + tags: { + name: 'tag1', + }, + }, +}); +``` + +多个同一关系字段的过滤可以写在一起 + +```ts +await Post.repository.find({ + filter: { + 'tags': { + 'name.$includes': 'tag1', + 'createdAt.$dateOn': '2020-10-28', + }, + }, +}); +``` + +同时也支持 and、or 逻辑运算符 + +```ts +await Post.repository.find({ + filter: { + $and: [ + // 一个 Object 只写一个条件 + { name: 'post1' }, + // 支持关系字段(非常重要) + { 'tags.name.$includes': 'tag1' }, + { 'tags.name.$includes': 'tag2' }, + ], + }, +}); +``` + +###### sort 参数示例说明 + +指定一组数据的排序,倒序时在字段前加上减号 `-` + +```ts +await Post.repository.find({ + // 创建日期倒序 + sort: ['-createdAt'], +}); +``` + +可以设置多个排序规则 + +```ts +await Post.repository.find({ + // 创建日期倒序,ID 正序 + sort: ['-createdAt', 'id'], +}); +``` + +也可以是关系表的字段 + +```ts +await Post.repository.find({ + // 标签名正序,文章创建日期倒序 + sort: ['tags.name', '-createdAt'], +}); +``` + +###### fields 参数示例说明 + +- `fields` 显示哪些字段 +- `expect` 不显示哪些字段 +- `appends` 附加哪些字段 + +如果并未指定 fields,输出所有 Attributes,Associations 字段并不输出 + +```ts +await Post.repository.find(); +// [{ id, name, content, createdAt, updatedAt }] +``` + +只输出指定字段时,可以用 fields + +```ts +await Post.repository.find({ + fields: ['name'], +}); +// [{ name }] +``` + +当 fields 里有关系字段时,按默认情况输出 + +```ts +await Post.repository.find({ + fields: ['id', 'name', 'tags'], +}); +// +// [{ id, name, createdAt, updatedAt, tags: [{ id, name, createdAt, updatedAt }] }] + +``` + +可以只输出关系数据的某个字段 + +```ts +await Post.repository.find({ + fields: ['id', 'name', 'tags.name'], +}); +// [{ id, name, tags: [{ name }] }] +``` + +排除某些字段时,可以使用 expect + +```ts +await Post.repository.find({ + expect: ['content'], +}); +// [{ id, name, createdAt, updatedAt }] +``` + +Attributes 不变,只附加 Associations 进来时,可以使用 appends + +```ts +await Post.repository.find({ + appends: ['tags'], +}); +// [{ id, name, content, createdAt, updatedAt, tags: [{ id, name, createdAt, updatedAt }] }] +``` + +如果某个字段只用在 filter 里,但并没有出现在 fields 里,不应该被输出 + +```ts +await Post.repository.find({ + filter: { + 'tags.name': 'tag1', + }, +}); +// 输出所有的 Attributes,但不输出 tags +// [{ id, name, content, createdAt, updatedAt }] +``` + +如果某个字段只用在 sort 里,但并没有出现在 fields 里,也不应该被输出 + +```ts +await Post.repository.find({ + sort: ['-tags.createdAt'] +}); +// 输出所有的 Attributes,但不输出 tags +// [{ id, name, content, createdAt, updatedAt }] +``` + +## `repository.findAndCount()` + +按分页查询数据,并返回所有符合的数据总数。 + +##### Definition + +```ts +interface findAndCount { + (options?: FindAndCountOptions): Promise<[ M[], number ]> +} + +interface FindAndCountOptions extends Sequelize.FindAndCountOptions { + // 数据过滤 + filter?: FilterOptions; + // 输出结果显示哪些字段 + fields?: string[]; + // 输出结果不显示哪些字段 + expect?: string[]; + // 附加字段,用于控制关系字段的输出 + appends?: string[]; + // 排序,字段前面加上 “-” 表示降序 + sort?: string[]; + // 当前页,默认为 1 + page?: number; + // 当前页最大数量,默认为 20 + pageSize?: number; +} +``` + +##### Examples + +大部分参数与 [repository.find()](#repositoryfind) 一致,所以这里只列举 page 和 pageSize 的例子。 + +不填写参数时,默认 page=1,pageSize=20。 + +```ts +await repository.findAndCount(); +// [[{ id, name, content, createdAt, updatedAt }], 50] + +const [models, count] = await repository.findAndCount(); +``` + +指定页码和单页最大数量 + +```ts +await repository.findAndCount({ + page: 1, + pageSize: 50, +}); +// [[{ id, name, content, createdAt, updatedAt }], 50] +``` + +## `repository.findOne()` + +##### Definition + +```ts +interface findOne { + (options?: FindOneOptions): Promise<[ M[], number ]> +} + +interface FindOneOptions extends findOptions { + // 数据过滤 + filter?: FilterOptions; + // 输出结果显示哪些字段 + fields?: string[]; + // 输出结果不显示哪些字段 + expect?: string[]; + // 附加字段,用于控制关系字段的输出 + appends?: string[]; + // 排序,字段前面加上 “-” 表示降序 + sort?: string[]; + // 通过 pk 过滤 + filterByPk?: number | string; +} +``` + +##### Examples + +大部分参数与 [repository.find()](#repositoryfind) 一致。这里只列举 filterByPk 的例子。 + +```ts +await repository.findOne({ + filterByPk: 1, + // 等同于 + filter: { + [Model.primaryKeyAttribute]: 1, + } +}); +``` + +## repository.create() + +创建数据 + +##### Definition + +```ts +interface create { + (options?: CreateOptions): Promise +} + +interface CreateOptions { + // 数据 + values?: any; + // 字段白名单 + whitelist?: string[]; + // 字段黑名单 + blacklist?: string[]; + // 关系数据默认会新建并建立关联处理,如果是已存在的数据只关联,但不更新关系数据 + // 如果需要更新关联数据,可以通过 updateAssociations 指定 + updateAssociations?: string[]; +} +``` + +##### Examples + +例子之前,先定义几个 Collection 吧 + +```ts +db.collection({ + name: 'users', + fields: [ + {name: 'name', type: 'string'}, + ], +}); + +db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsTo', name: 'user' }, + { type: 'belongsToMany', name: 'tags' }, + { type: 'hasMany', name: 'comments' }, + ], +}); + +db.collection({ + name: 'tags', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsToMany', name: 'posts' }, + ], +}); + +db.collection({ + name: 'comments', + fields: [ + { type: 'string', name: 'name' }, + ], +}); +``` + +新建数据,可以不指定 values。 + +```ts +const model = await repository.create(); +``` + +values 必须是 Object。 + +```ts +await repository.create({ + values: { + name: 'post1', + }, +}); +``` + +values 可以包含关系数据 + +```ts +await repository.create({ + values: { + name: 'post1', + // 新建并关联 + tags: [{ name: 'tag1' }], + }, +}); +``` + +关联字段,可以只提供关系约束值(一般是 id) + +```ts +await repository.create({ + values: { + name: 'post1', + // 关联 id=1 的 tag + tags: [1], + // 也可以这样,会自动识别 + tags: 1, + }, +}); +``` + +可以设置 values 的白名单和黑名单 + +```ts +await repository.create({ + values: { + name: 'post1', + // 关联 id=1 的 tag + tags: [1], + }, + whitelist: ['name'], +}); +``` + +指定哪些关联字段在建立关联的同时可以更新数据 + +```ts +// 原 tag=1 的数据 +// { id: 1, name: 'tag1' } + +await repository.create({ + values: { + name: 'post1', + tags: [{ + id: 1, + name: 'tag123', // name 与原数据不一样 + }], + }, + // 指定了 tags,建立关联时,也会同步修改 tag 数据 + updateAssociations: ['tags'], +}); +``` + +全览 + +```ts +await repository.create({ + // 待存数据 + values: { + a: 'a', + // 快速建立关联 + o2o: 1, // 建立一对一关联 + m2o: 1, // 建立多对一关联 + o2m: [1,2] // 建立一对多关联 + m2m: [1,2] // 建立多对多关联 + // 新建关联数据并建立关联 + o2o: { + key1: 'val1', + }, + o2m: [{key1: 'val1'}, {key2: 'val2'}], + // 子表格数据 + subTable: [ + // 如果数据存在,更新处理 + {id: 1, key1: 'val1111'}, + // 如果数据不存在,直接创建并关联 + {key2: 'val2'}, + ], + }, + // 字段白名单 + whitelist: [], + // 字段黑名单 + blacklist: [], + // 关系数据默认会新建并建立关联处理,如果是已存在的数据只关联,但不更新关系数据 + // 如果需要更新关联数据,可以通过 updateAssociations 指定 + updateAssociations: ['subTable'], +}); +``` + +## repository.update() + +更新数据 + +##### Definition + +```ts +interface update { + (options: UpdateOptions): Promise +} + +interface UpdateOptions { + filter?: any; + filterByPk?: number | string; + // 数据 + values?: any; + // 字段白名单 + whitelist?: string[]; + // 字段黑名单 + blacklist?: string[]; + // 关系数据默认会新建并建立关联处理,如果是已存在的数据只关联,但不更新关系数据 + // 如果需要更新关联数据,可以通过 updateAssociations 指定 + updateAssociations?: string[]; +} +``` + +##### Examples + +全部改 + +```ts +await repository.update({ + values: { + a: 'b' + }, +}); +``` + +只改某条数据 + +```ts +await repository.update({ + filterByPk: 1, + values: { + a: 'b' + }, +}); +``` + +指定范围修改 + +```ts +await repository.update({ + filter: { + name: 'post1.1' + }, + values: { + name: 'post1.2' + }, +}); +``` + +## repository.destroy() + +删除数据 + +##### Definition + +```ts +interface destroy { + (options?: number | string | number[] | string[] | DestroyOptions): Promise +} + +interface DestroyOptions { + filter?: any; +} +``` + +##### Examples + +指定 primary key 值 + +```ts +repository.destroy(1); +``` + +批量 primary key 值 + +```ts +repository.destroy([1, 2, 3]); +``` + +复杂的 filter + +```ts +repository.destroy({ + filter: {}, +}); +``` + +## repository.relation().of() + +##### Definition + +```ts +interface relation { + (name: string): { + of: (parent: any): RelationRepository; + } +} + +// 关系数据的增删改查在 NocoBase 里非常重要 +class RelationRepository { + find() {} + findOne() {} + create() {} + update() {} + destroy() {} + set() {} + add() {} + remove() {} + toggle() {} +} +``` + +##### Examples + +find、findOne、create、update 和 destroy 和常规 Repository API 层面是一致,这里重点列举关联操作的几个方法: + +```ts +// user_id = 1 的 post 的 relatedQuery +const userPostsRepository = repository.relation('posts').of(1); + +// 建立关联 +userPostsRepository.set(1); + +// 批量,仅用于 HasMany 和 BelongsToMany +userPostsRepository.set([1,2,3]); + +// BelongsToMany 的中间表 +userPostsRepository.set([ + [1, {/* 中间表数据 */}], + [2, {/* 中间表数据 */}], + [3, {/* 中间表数据 */}], +]); + +// 仅用于 HasMany 和 BelongsToMany +userPostsRepository.add(1); + +// BelongsToMany 的中间表 +userPostsRepository.add(1, {/* 中间表数据 */}); + +// 删除关联 +userPostsRepository.remove(1); + +// 建立或解除 +userPostsRepository.toggle(1); +userPostsRepository.toggle([1, 2, 3]); +``` diff --git a/packages/app/mock/.gitkeep b/docs/reference/resourcer.md old mode 100755 new mode 100644 similarity index 100% rename from packages/app/mock/.gitkeep rename to docs/reference/resourcer.md diff --git a/docs/reference/rest-api.md b/docs/reference/rest-api.md new file mode 100644 index 0000000000000000000000000000000000000000..5a972f42f2e1be356a0c09f1c5c396c4f9d788bf --- /dev/null +++ b/docs/reference/rest-api.md @@ -0,0 +1 @@ +# REST API diff --git a/examples/collections/src/index.ts b/examples/collections/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a17f2673a1b27e8b7c61af73da3395c3a9458749 --- /dev/null +++ b/examples/collections/src/index.ts @@ -0,0 +1,77 @@ +import { Application } from '@nocobase/server/src'; +import path from 'path'; + +const keys = __dirname.split(path.sep); +const slug = keys[keys.length - 2]; + +const options = { + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + hooks: { + beforeDefine(model, options) { + options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`; + }, + }, + }, + resourcer: { + prefix: `/api/examples/${slug}`, + }, +}; + +console.log(options); + +const app = new Application(options); + +// 用户 +app.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'username', unique: true }, + { type: 'password', name: 'password', unique: true }, + { type: 'hasMany', name: 'posts', foreignKey: 'author_id' }, + ], +}); + +// 文章 +app.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'text', name: 'content' }, + { type: 'belongsToMany', name: 'tags' }, + { type: 'hasMany', name: 'comments' }, + { type: 'belongsTo', name: 'author', target: 'users' }, + ], +}); + +// 标签 +app.collection({ + name: 'tags', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsToMany', name: 'posts' }, + ], +}); + +// 评论 +app.collection({ + name: 'comments', + fields: [ + { type: 'text', name: 'content' }, + { type: 'belongsTo', name: 'user' }, + ], +}); + +app.parse(process.argv); + +// yarn examples collections db sync +// yarn examples collections start diff --git a/examples/index.ts b/examples/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..39fe5d95a970099a635d7500d58440d4930fc9fd --- /dev/null +++ b/examples/index.ts @@ -0,0 +1,4 @@ +const example = process.argv[2]; +process.argv.splice(2, 1); +console.log(process.argv); +require(`./${example}/src`); diff --git a/packages/client/src/index.ts b/examples/middleware/src/index.ts similarity index 100% rename from packages/client/src/index.ts rename to examples/middleware/src/index.ts diff --git a/packages/plugin-permissions/src/index.ts b/examples/models/src/index.ts similarity index 100% rename from packages/plugin-permissions/src/index.ts rename to examples/models/src/index.ts diff --git a/packages/app/src/components/fields/form-layout/style.ts b/examples/plugins/src/index.ts similarity index 100% rename from packages/app/src/components/fields/form-layout/style.ts rename to examples/plugins/src/index.ts diff --git a/packages/app/src/components/fields/form-mega-layout/style.ts b/examples/repositories/src/index.ts similarity index 100% rename from packages/app/src/components/fields/form-mega-layout/style.ts rename to examples/repositories/src/index.ts diff --git a/examples/resources/src/index.ts b/examples/resources/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1d51452f8484a21a062d44a80457db973132e79 --- /dev/null +++ b/examples/resources/src/index.ts @@ -0,0 +1,65 @@ +import { Application } from '@nocobase/server/src'; +import path from 'path'; + +const keys = __dirname.split(path.sep); +const slug = keys[keys.length - 2]; + +const options = { + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + hooks: { + beforeDefine(model, options) { + options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`; + }, + }, + }, + resourcer: { + prefix: `/api/examples/${slug}`, + }, +}; + +console.log(options); + +const app = new Application(options); + +app.resource({ + name: 'server', + actions: { + async getTime(ctx, next) { + ctx.body = new Date(); + await next(); + } + }, +}); + +app.parse(process.argv); + +/* +根据配置生成相关数据表 +yarn examples simple db sync + +启动服务 +yarn examples simple start + +客户端发送请求 + +创建数据 +curl --location --request POST 'http://localhost:3000/api/examples/simple/users' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "username": "abc", + "password": "123456" +}' + +查看列表 +curl --location --request GET 'http://localhost:5051/api/examples/simple/users' +*/ diff --git a/examples/saas/src/index.ts b/examples/saas/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..340bc3bb35d602e9ea2d5ee46adc4e05901636e3 --- /dev/null +++ b/examples/saas/src/index.ts @@ -0,0 +1,154 @@ +import { Application } from '@nocobase/server/src'; +import path from 'path'; +import compose from 'koa-compose'; + +const keys = __dirname.split(path.sep); +const slug = keys[keys.length - 2]; + +function createApp(opts) { + const { name } = opts; + const options = { + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + appName: name, + hooks: { + beforeDefine(model, options) { + options.tableName = `examples_${slug}_${name}_${ + options.tableName || options.name.plural + }`; + }, + }, + }, + resourcer: { + prefix: `/api/examples/${slug}/${name}`, + }, + }; + const app = new Application(options); + app.resource({ + name: 'saas', + actions: { + async getInfo(ctx, next) { + ctx.body = ctx.db.options; + await next(); + }, + }, + }); + app.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'username' }, + { type: 'password', name: 'password' }, + ], + }); + return app; +} + +const saas = createApp({ + name: 'main', +}); + +saas['apps'] = new Map(); + +saas.collection({ + name: 'applications', + fields: [ + { type: 'string', name: 'name', unique: true }, + ], +}); + +saas + .command('app:create') + .argument('') + .action(async (appName) => { + const App = saas.db.getModel('applications'); + const model = await App.create({ + name: appName, + }); + const app = createApp({ + name: appName, + }); + await app.db.sync(); + await app.destroy(); + await saas.destroy(); + console.log(model.toJSON()); + }); + +saas + .command('db:sync') + .option('-f, --force') + .option('--app [app]') + .action(async (...args) => { + const cli = args.pop(); + const force = cli.opts()?.force; + const appName = cli.opts()?.app; + const app = !appName + ? saas + : createApp({ + name: appName, + }); + await app.load(); + await app.db.sync( + force + ? { + force: true, + alter: { + drop: true, + }, + } + : {}, + ); + await app.destroy(); + await saas.destroy(); + }); + +function multiApps({ getAppName }) { + return async function (ctx, next) { + const appName = getAppName(ctx); + if (!appName) { + return next(); + } + const App = ctx.db.getModel('applications'); + const model = await App.findOne({ + where: { name: appName }, + }); + console.log({ appName, model }); + if (!model) { + return next(); + } + const apps = ctx.app.apps; + if (!apps.has(appName)) { + const app = createApp({ + name: appName, + }); + apps.set(appName, app); + } + const saas = apps.get(appName); + await compose(saas.middleware)(ctx, async () => {}); + }; +} + +saas.use( + multiApps({ + getAppName(ctx) { + const appName = ctx.path.split('/')[4]; + return appName === 'main' ? null : appName; + }, + }), +); + +// saas.use(async (ctx, next) => { +// ctx.body = 'aaaaa'; +// console.log(ctx.db.options); +// await next(); +// }); + +saas.parse(process.argv); diff --git a/examples/simple/src/index.ts b/examples/simple/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..27ce61fb16dcebf520e8ebdf9ebbd8a12eea80fb --- /dev/null +++ b/examples/simple/src/index.ts @@ -0,0 +1,63 @@ +import { Application } from '@nocobase/server/src'; +import path from 'path'; + +const keys = __dirname.split(path.sep); +const slug = keys[keys.length - 2]; + +const options = { + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + hooks: { + beforeDefine(model, options) { + options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`; + }, + }, + }, + resourcer: { + prefix: `/api/examples/${slug}`, + }, +}; + +console.log(options); + +const app = new Application(options); + +app.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'username' }, + { type: 'password', name: 'password' }, + ], +}); + +app.parse(process.argv); + +/* +根据配置生成相关数据表 +yarn examples simple db:sync + +启动服务 +yarn examples simple start + +客户端发送请求 + +创建数据 +curl --location --request POST 'http://localhost:3000/api/examples/simple/users' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "username": "abc", + "password": "123456" +}' + +查看列表 +curl --location --request GET 'http://localhost:5051/api/examples/simple/users' +*/ diff --git a/fff b/fff new file mode 100644 index 0000000000000000000000000000000000000000..df606bf255295411b265853bff4d710623ddc059 --- /dev/null +++ b/fff @@ -0,0 +1,2 @@ +dsfsadf asdf dsa fsda fsda dsfsadff +fsa fsda fdsa fsad fas \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 86449aa65676bd0f53bb8f8e90a87f65869ff214..607114cc6a2b272dcc87f7c25eba5b57ab032131 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,13 +3,23 @@ const path = require('path'); module.exports = { preset: 'ts-jest', testEnvironment: 'node', - setupFilesAfterEnv: [path.resolve(__dirname, 'dotenv.js')], + setupFilesAfterEnv: [ + path.resolve(__dirname, 'dotenv.js'), + ], testMatch: [ // '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)' ], modulePathIgnorePatterns: [ "/.dumi/", - "/packages/father-build/" + "/packages/father-build/", + "/packages/client/lib/" ], + globals: { + 'ts-jest': { + babelConfig: true, + tsconfig: 'tsconfig.jest.json', + diagnostics: false, + }, + }, }; \ No newline at end of file diff --git a/lerna.json b/lerna.json index 79dfc4aad298dcbad25029721ff32e4cb52d7d98..5ca5562efb5e20ee2cdb612828e42f23a123fcf1 100644 --- a/lerna.json +++ b/lerna.json @@ -3,17 +3,16 @@ "packages/*" ], "version": "independent", + "npmClient": "yarn", + "useWorkspaces": true, + "npmClientArgs": [ + "--ignore-engines" + ], "command": { - "bootstrap": { - "npmClientArgs": [ - "--no-package-lock" - ] - }, "publish": { - "allowBranch": "master", "ignoreChanges": [ "*.md" ] } } -} +} \ No newline at end of file diff --git a/nodemon.json b/nodemon.json index 51695bfc2083dd503d3537decba5fc736f690f08..8652250f21d61c3061b4d1618bbdb65e619e1d28 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,6 +1,6 @@ { "watch": ["packages/", ".env"], - "ignore": ["packages/app"], + "ignore": ["packages/app", "packages/client"], "ext": "ts", "exec": "ts-node -r dotenv/config ./packages/api/src/index.ts" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 58aa75d08105c0a7d6469c764f19812546dfb1ce..0000000000000000000000000000000000000000 --- a/package-lock.json +++ /dev/null @@ -1,25431 +0,0 @@ -{ - "name": "root", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "dev": true, - "requires": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "@ant-design/icons": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.6.2.tgz", - "integrity": "sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==", - "dev": true, - "requires": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.0.0", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - } - }, - "@ant-design/icons-svg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz", - "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==", - "dev": true - }, - "@ant-design/react-slick": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.3.tgz", - "integrity": "sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "lodash": "^4.17.21", - "resize-observer-polyfill": "^1.5.0" - } - }, - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", - "dev": true - }, - "@babel/core": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", - "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.15", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.14", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", - "dev": true, - "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" - } - }, - "@babel/plugin-proposal-do-expressions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.12.1.tgz", - "integrity": "sha512-bpJ6Bfrzvdzb0vG6zBSNh3HLgFKh+S2CBpNmaLRjg2u7cNkzRPIqBjVURCmpG6pvPfKyxkizwbrXwpYtW3a9cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-do-expressions": "^7.12.1" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.1.tgz", - "integrity": "sha512-z5Q4Ke7j0AexQRfgUvnD+BdCSgpTEKnqQ3kskk2jWtOBulxICzd1X9BGt7kmWftxZ2W3++OZdt5gtmC8KLxdRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-default-from": "^7.12.1" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-do-expressions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.12.13.tgz", - "integrity": "sha512-xm52bNA0O8QPH4rBXXJ/VLaQ6UGocUS3/fbgZO5z+KDUU7y8iFy8cnIwuRS/NNGjs18sOquzJfH0EasQv+F1oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", - "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@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": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - } - }, - "@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" - } - }, - "@babel/register": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.1.tgz", - "integrity": "sha512-XWcmseMIncOjoydKZnWvWi0/5CUCD+ZYKhRwgYlWOrA8fGZ/FjuLRpqtIhLOVD/fvR1b9DQHtZPn68VvhpYf+Q==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - } - }, - "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@bloomberg/record-tuple-polyfill": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@bloomberg/record-tuple-polyfill/-/record-tuple-polyfill-0.0.3.tgz", - "integrity": "sha512-sBnCqW0nqofE47mxFnw+lvx6kzsQstwaQMVkh66qm/A6IlsnH7WsyGuVXTou8RF2wL4W7ybOoHPvP2WgIo6rhQ==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@ctrl/tinycolor": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz", - "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "@evocateur/libnpmaccess": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", - "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - } - } - }, - "@evocateur/libnpmpublish": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", - "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@evocateur/npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@evocateur/pacote": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", - "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "bluebird": "^3.5.3", - "cacache": "^12.0.3", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.5.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^3.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.3", - "safe-buffer": "^5.2.0", - "semver": "^5.7.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@koa/router": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-9.4.0.tgz", - "integrity": "sha512-dOOXgzqaDoHu5qqMEPLKEgLz5CeIA7q8+1W62mCvFVCOqeC71UoTGJ4u1xUSOpIl2J1x2pqrNULkFteUeZW3/A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" - } - }, - "@lerna/add": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", - "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", - "dev": true, - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.21.0", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/bootstrap": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", - "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/changed": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", - "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", - "dev": true, - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", - "dev": true, - "requires": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" - } - }, - "@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", - "dev": true, - "requires": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@lerna/clean": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", - "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" - } - }, - "@lerna/cli": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", - "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", - "dev": true, - "requires": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@lerna/collect-updates": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", - "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" - } - }, - "@lerna/command": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", - "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/project": "3.21.0", - "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^1.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/conventional-commits": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", - "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", - "dev": true, - "requires": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/create": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", - "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", - "dev": true, - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "camelcase": "^5.0.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "globby": "^9.2.0", - "init-package-json": "^1.10.3", - "npm-package-arg": "^6.1.0", - "p-reduce": "^1.0.0", - "pify": "^4.0.1", - "semver": "^6.2.0", - "slash": "^2.0.0", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "@lerna/create-symlink": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", - "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", - "dev": true, - "requires": { - "@zkochan/cmd-shim": "^3.1.0", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/describe-ref": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", - "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2" - } - }, - "@lerna/diff": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", - "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/validation-error": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/exec": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", - "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/filter-options": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", - "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", - "dev": true, - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/filter-packages": "3.18.0", - "dedent": "^0.7.0", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/filter-packages": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", - "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", - "dev": true, - "requires": { - "@lerna/validation-error": "3.13.0", - "multimatch": "^3.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/get-npm-exec-opts": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", - "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/get-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", - "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "ssri": "^6.0.1", - "tar": "^4.4.8" - } - }, - "@lerna/github-client": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", - "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^16.28.4", - "git-url-parse": "^11.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/gitlab-client": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", - "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", - "dev": true, - "requires": { - "node-fetch": "^2.5.0", - "npmlog": "^4.1.2", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "@lerna/global-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", - "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", - "dev": true - }, - "@lerna/has-npm-version": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", - "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/import": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", - "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "p-map-series": "^1.0.0" - } - }, - "@lerna/info": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", - "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/output": "3.13.0", - "envinfo": "^7.3.1" - } - }, - "@lerna/init": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", - "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0", - "write-json-file": "^3.2.0" - } - }, - "@lerna/link": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", - "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/package-graph": "3.18.5", - "@lerna/symlink-dependencies": "3.17.0", - "p-map": "^2.1.0", - "slash": "^2.0.0" - } - }, - "@lerna/list": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", - "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/listable": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", - "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", - "dev": true, - "requires": { - "@lerna/query-graph": "3.18.5", - "chalk": "^2.3.1", - "columnify": "^1.5.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@lerna/log-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", - "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", - "dev": true, - "requires": { - "byte-size": "^5.0.1", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-conf": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", - "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", - "dev": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "@lerna/npm-dist-tag": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", - "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "@lerna/otplease": "3.18.5", - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-install": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", - "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.2", - "write-pkg": "^3.1.0" - } - }, - "@lerna/npm-publish": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", - "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", - "dev": true, - "requires": { - "@evocateur/libnpmpublish": "^1.2.2", - "@lerna/otplease": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "read-package-json": "^2.0.13" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "@lerna/npm-run-script": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", - "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/otplease": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", - "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", - "dev": true, - "requires": { - "@lerna/prompt": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/output": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", - "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/pack-directory": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", - "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", - "dev": true, - "requires": { - "@lerna/get-packed": "3.16.0", - "@lerna/package": "3.16.0", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "npm-packlist": "^1.4.4", - "npmlog": "^4.1.2", - "tar": "^4.4.10", - "temp-write": "^3.4.0" - } - }, - "@lerna/package": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", - "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", - "dev": true, - "requires": { - "load-json-file": "^5.3.0", - "npm-package-arg": "^6.1.0", - "write-pkg": "^3.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "@lerna/package-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", - "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", - "dev": true, - "requires": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/prerelease-id-from-version": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", - "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", - "dev": true, - "requires": { - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/profiler": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", - "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "upath": "^1.2.0" - } - }, - "@lerna/project": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", - "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", - "dev": true, - "requires": { - "@lerna/package": "3.16.0", - "@lerna/validation-error": "3.13.0", - "cosmiconfig": "^5.1.0", - "dedent": "^0.7.0", - "dot-prop": "^4.2.0", - "glob-parent": "^5.0.0", - "globby": "^9.2.0", - "load-json-file": "^5.3.0", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "resolve-from": "^4.0.0", - "write-json-file": "^3.2.0" - }, - "dependencies": { - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "@lerna/prompt": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", - "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", - "dev": true, - "requires": { - "inquirer": "^6.2.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/publish": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", - "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", - "dev": true, - "requires": { - "@evocateur/libnpmaccess": "^3.1.2", - "@evocateur/npm-registry-fetch": "^4.0.0", - "@evocateur/pacote": "^9.6.3", - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/describe-ref": "3.16.5", - "@lerna/log-packed": "3.16.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/npm-dist-tag": "3.18.5", - "@lerna/npm-publish": "3.18.5", - "@lerna/otplease": "3.18.5", - "@lerna/output": "3.13.0", - "@lerna/pack-directory": "3.16.4", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.22.1", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/pulse-till-done": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", - "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/query-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", - "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", - "dev": true, - "requires": { - "@lerna/package-graph": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/resolve-symlink": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", - "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^1.0.1" - } - }, - "@lerna/rimraf-dir": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", - "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2", - "path-exists": "^3.0.0", - "rimraf": "^2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@lerna/run": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", - "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-run-script": "3.16.5", - "@lerna/output": "3.13.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/timer": "3.13.0", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/run-lifecycle": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", - "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", - "dev": true, - "requires": { - "@lerna/npm-conf": "3.16.0", - "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^3.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/run-topologically": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", - "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", - "dev": true, - "requires": { - "@lerna/query-graph": "3.18.5", - "figgy-pudding": "^3.5.1", - "p-queue": "^4.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - }, - "p-queue": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", - "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", - "dev": true, - "requires": { - "eventemitter3": "^3.1.0" - } - } - } - }, - "@lerna/symlink-binary": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", - "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", - "dev": true, - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/package": "3.16.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0" - } - }, - "@lerna/symlink-dependencies": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", - "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", - "dev": true, - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/resolve-symlink": "3.16.0", - "@lerna/symlink-binary": "3.17.0", - "fs-extra": "^8.1.0", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0" - } - }, - "@lerna/timer": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", - "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", - "dev": true - }, - "@lerna/validation-error": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", - "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/version": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", - "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/conventional-commits": "3.22.0", - "@lerna/github-client": "3.22.0", - "@lerna/gitlab-client": "3.15.0", - "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "chalk": "^2.3.1", - "dedent": "^0.7.0", - "load-json-file": "^5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "p-reduce": "^1.0.0", - "p-waterfall": "^1.0.0", - "semver": "^6.2.0", - "slash": "^2.0.0", - "temp-write": "^3.4.0", - "write-json-file": "^3.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "@lerna/write-log-file": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", - "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", - "dev": true, - "requires": { - "npmlog": "^4.1.2", - "write-file-atomic": "^2.3.0" - } - }, - "@mapbox/hast-util-to-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-to-jsx/-/hast-util-to-jsx-1.0.0.tgz", - "integrity": "sha512-HJRp3qkr0uGIBFASzA8rVATLo6y/UoOMoD8eXsG8HVofk5Dokc9PV+dh266zYLZniYgtpJbc2+AKf1fNpsVqAA==", - "dev": true, - "requires": { - "kebab-case": "^1.0.0", - "postcss": "^7.0.31", - "postcss-js": "^2.0.3", - "property-information": "^5.5.0", - "react-attr-converter": "^0.3.1", - "stringify-entities": "^3.0.1", - "stringify-object": "^3.3.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@octokit/auth-token": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", - "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/endpoint": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", - "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } - } - }, - "@octokit/openapi-types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-6.0.0.tgz", - "integrity": "sha512-CnDdK7ivHkBtJYzWzZm7gEkanA7gKH6a09Eguz7flHw//GacPJLmkHA3f3N++MJmlxD1Fl+mB7B32EEpSCwztQ==", - "dev": true - }, - "@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", - "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/request": { - "version": "5.4.15", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.15.tgz", - "integrity": "sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.7.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/request-error": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", - "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } - } - }, - "@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/rest": { - "version": "16.43.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", - "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" - } - }, - "@octokit/types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.13.0.tgz", - "integrity": "sha512-W2J9qlVIU11jMwKHUp5/rbVUeErqelCsO5vW5PKNb7wAXQVUz87Rc+imjlEvpvbH8yUb+KHmv8NEjVZdsdpyxA==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^6.0.0" - } - }, - "@opencensus/core": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz", - "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==", - "dev": true, - "requires": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^5.5.0", - "shimmer": "^1.2.0", - "uuid": "^3.2.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@opencensus/propagation-b3": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz", - "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==", - "dev": true, - "requires": { - "@opencensus/core": "^0.0.8", - "uuid": "^3.2.1" - }, - "dependencies": { - "@opencensus/core": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz", - "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==", - "dev": true, - "requires": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^5.5.0", - "shimmer": "^1.2.0", - "uuid": "^3.2.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@pm2/agent": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-1.0.8.tgz", - "integrity": "sha512-r8mud8BhBz+a2yjlgtk+PBXUR5EQ9UKSJCs232OxfCmuBr1MZw0Mo+Kfog6WJ8OmVk99r1so9yTUK4IyrgGcMQ==", - "dev": true, - "requires": { - "async": "~3.2.0", - "chalk": "~3.0.0", - "dayjs": "~1.8.24", - "debug": "~4.3.1", - "eventemitter2": "~5.0.1", - "fclone": "~1.0.11", - "nssocket": "0.6.0", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~4.0.1", - "semver": "~7.2.0", - "ws": "~7.2.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "semver": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz", - "integrity": "sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==", - "dev": true - }, - "ws": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", - "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", - "dev": true - } - } - }, - "@pm2/io": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz", - "integrity": "sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==", - "dev": true, - "requires": { - "@opencensus/core": "0.0.9", - "@opencensus/propagation-b3": "0.0.8", - "async": "~2.6.1", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "require-in-the-middle": "^5.0.0", - "semver": "6.3.0", - "shimmer": "^1.2.0", - "signal-exit": "^3.0.3", - "tslib": "1.9.3" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "eventemitter2": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", - "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } - } - }, - "@pm2/js-api": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz", - "integrity": "sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==", - "dev": true, - "requires": { - "async": "^2.6.3", - "axios": "^0.21.0", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "ws": "^7.0.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "eventemitter2": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", - "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", - "dev": true - } - } - }, - "@pm2/pm2-version-check": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", - "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", - "dev": true, - "requires": { - "debug": "^4.3.1" - } - }, - "@rollup/plugin-babel": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz", - "integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-commonjs": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz", - "integrity": "sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "@rollup/plugin-inject": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.2.tgz", - "integrity": "sha512-TSLMA8waJ7Dmgmoc8JfPnwUwVZgLjjIAM6MqeIFqPO2ODK36JqE0Cf2F54UTgCUuW8da93Mvoj75a6KAVWgylw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.4", - "estree-walker": "^1.0.1", - "magic-string": "^0.25.5" - } - }, - "@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/plugin-node-resolve": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz", - "integrity": "sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.17.0" - } - }, - "@rollup/plugin-replace": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz", - "integrity": "sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - } - }, - "@rollup/plugin-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-url/-/plugin-url-5.0.1.tgz", - "integrity": "sha512-/dO8Ic+vR9VtMkHjmFBWzISjX0iDwrB3vLg8sy4A7hxu2Uk0J09kAXbtku7gJb1fqVcJUIByFG5d/4sgNh1DvA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.4", - "make-dir": "^3.0.0", - "mime": "^2.4.4" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@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" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@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" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "@svgr/rollup": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/rollup/-/rollup-5.4.0.tgz", - "integrity": "sha512-hwYjrTddW6mFU9vwqRr1TULNvxiIxGdIbqrD5J7vtoATSfWazq/2JSnT4BmiH+/4kFXLEtjKuSKoDUotkOIAkg==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@babel/plugin-transform-react-constant-elements": "^7.7.4", - "@babel/preset-env": "^7.9.5", - "@babel/preset-react": "^7.9.4", - "@svgr/core": "^5.4.0", - "@svgr/plugin-jsx": "^5.4.0", - "@svgr/plugin-svgo": "^5.4.0", - "rollup-pluginutils": "^2.8.2" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/bcrypt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.1.tgz", - "integrity": "sha512-SwBrq5wb6jXP0o3O3jStdPWbKpimTImfdFD/OZE3uW+jhGpds/l5wMX9lfYOTDOa5Bod2QmOgo9ln+tMp2XP/w==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==", - "dev": true - }, - "@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, - "@types/cookies": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz", - "integrity": "sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", - "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz", - "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==", - "dev": true - }, - "@types/http-assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", - "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==", - "dev": true - }, - "@types/http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.22", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz", - "integrity": "sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", - "dev": true - }, - "@types/koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q==", - "dev": true, - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa-bodyparser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", - "integrity": "sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-mount": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/koa-mount/-/koa-mount-4.0.0.tgz", - "integrity": "sha512-56iBULArwY3uKLl28eRFchZ2v0diEoJzJbDaHH/ehgruF/s2/KMHyWsKcIhvDJ3tGdKu9oZNQvxaMg++1IKFdA==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa__router": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.4.tgz", - "integrity": "sha512-SXpZy6ICU/bsTZbNhg7QMNUQuNE7ka94zeLPHXhej2QZ09u2tz5S3WlBRB85HLSUosUZFbIRgfrFtu+PSIAUVA==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "@types/mathjax": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@types/mathjax/-/mathjax-0.0.36.tgz", - "integrity": "sha512-TqDJc2GWuTqd/m+G/FbNkN+/TF2OCCHvcawmhIrUaZkdVquMdNZmNiNUkupNg9qctorXXkVLVSogZv1DhmgLmg==", - "dev": true - }, - "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/node": { - "version": "14.14.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.39.tgz", - "integrity": "sha512-Qipn7rfTxGEDqZiezH+wxqWYR8vcXq5LRpZrETD19Gs4o8LbklbmqotSUsMU+s5G3PJwMRDfNEYoxrcBwIxOuw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", - "dev": true - }, - "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.3.tgz", - "integrity": "sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-router": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.12.tgz", - "integrity": "sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*" - } - }, - "@types/react-router-config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.2.tgz", - "integrity": "sha512-WOSetDV3YPxbkVJAdv/bqExJjmcdCi/vpCJh3NfQOy1X15vHMSiMioXIcGekXDJJYhqGUMDo9e337mh508foAA==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-dqYdvN7Sbw8QT/0Ci5rhjE4/iCMJEM0Y9rHpCu+gGXD9Lwbz28t6HI2yegsB6BoV1sShRMU6lAmAcgRjmFy7LA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/superagent": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", - "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "@types/supertest": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", - "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", - "dev": true, - "requires": { - "@types/superagent": "*" - } - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", - "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "3.10.1", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "@umijs/ast": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/ast/-/ast-3.4.8.tgz", - "integrity": "sha512-3JAAdrZXcE78rODzhoK9yABlJK59DGscx3c0iNwbvdK0ylyYgmb7+Qm9dbEQn4kYeKX5ximV4CD5X8IljzicIA==", - "dev": true, - "requires": { - "@umijs/utils": "3.4.8" - } - }, - "@umijs/babel-plugin-auto-css-modules": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/babel-plugin-auto-css-modules/-/babel-plugin-auto-css-modules-3.4.8.tgz", - "integrity": "sha512-TQkIQHPPVEJR2OdEiCv+OQDKLV6bYNOkvvlmTuqQ5eDvruOrvJ4Rb5dmwrwXphUhwxkS3S92vgBYMDFVVCT27A==", - "dev": true - }, - "@umijs/babel-plugin-import-to-await-require": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/babel-plugin-import-to-await-require/-/babel-plugin-import-to-await-require-3.4.8.tgz", - "integrity": "sha512-sLxNW7MKdXOcKsdSF1RLyk9+cpt59zvdVN2uSRyChXf/KpwoHcSEgNi5E77I/ehLDnZumKzl1HDL9ifSWXDhkw==", - "dev": true, - "requires": { - "@umijs/utils": "3.4.8" - } - }, - "@umijs/babel-plugin-lock-core-js-3": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/babel-plugin-lock-core-js-3/-/babel-plugin-lock-core-js-3-3.4.8.tgz", - "integrity": "sha512-XsurU0oKwlTa34PAOPfJouKVZklHU7TBt/AJOj9JB+7ulGZnqTl+OL7Tlxw5sUs4USJTS4PBhnyng9i46nI2DQ==", - "dev": true, - "requires": { - "@umijs/utils": "3.4.8", - "core-js": "3.6.5" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - } - } - }, - "@umijs/babel-plugin-no-anonymous-default-export": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/babel-plugin-no-anonymous-default-export/-/babel-plugin-no-anonymous-default-export-3.4.8.tgz", - "integrity": "sha512-ZqfedGneKcxAcZLCsC4W4lDjcZoy2qJVDqsjQBFUj+Txwq2BTwRFBWnsxCdKnBw3dQ4jYuAiG57idhpsCy4v2w==", - "dev": true, - "requires": { - "@umijs/utils": "3.4.8" - } - }, - "@umijs/babel-preset-umi": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/babel-preset-umi/-/babel-preset-umi-3.4.8.tgz", - "integrity": "sha512-ZIWOOplileF8nfTMb1PlZW9w22HcYW0kYX9DdyPFTglV2jAXHkipEUSLlMRhJCLhdNMlmQaiRg50jfoTF33ZmQ==", - "dev": true, - "requires": { - "@babel/runtime": "7.12.5", - "@umijs/babel-plugin-auto-css-modules": "3.4.8", - "@umijs/babel-plugin-import-to-await-require": "3.4.8", - "@umijs/babel-plugin-lock-core-js-3": "3.4.8", - "@umijs/babel-plugin-no-anonymous-default-export": "3.4.8" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - } - } - }, - "@umijs/bundler-utils": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/bundler-utils/-/bundler-utils-3.4.8.tgz", - "integrity": "sha512-R1iIOO3PeGiPaFF5yZ9E9KMn6vXH41b80saWjcAS2nTzb2edo4+HGZSdTYK8SbLHzQQzcaoGy9AUTi2bMDtAtw==", - "dev": true, - "requires": { - "@umijs/babel-preset-umi": "3.4.8", - "@umijs/types": "3.4.8", - "@umijs/utils": "3.4.8" - } - }, - "@umijs/bundler-webpack": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/bundler-webpack/-/bundler-webpack-3.4.8.tgz", - "integrity": "sha512-u5/or/rD1/yl2N7pFTbDfoOlYKOKpq67Pyy6hjxOJ6zvo+T3Ntc2iBGDtJ27KBSfhNyYULEaTkHSg7Q7yLM0Eg==", - "dev": true, - "requires": { - "@umijs/bundler-utils": "3.4.8", - "@umijs/deps": "0.8.1", - "@umijs/types": "3.4.8", - "@umijs/utils": "3.4.8", - "jest-worker": "26.6.2", - "node-libs-browser": "2.2.1", - "normalize-url": "1.9.1", - "postcss": "7.0.32", - "postcss-flexbugs-fixes": "4.2.1", - "postcss-loader": "3.0.0", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.2", - "terser": "5.6.0", - "webpack-chain": "6.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", - "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - } - } - }, - "@umijs/core": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/core/-/core-3.4.8.tgz", - "integrity": "sha512-UQY1VrAUQBGYjXMFsFou0TBBWrhlhPXYcgAM/2RSD10RZhTynoTiwAmkwDGU2R0gTtsf4GJO+3sDO4Qng2PbQw==", - "dev": true, - "requires": { - "@umijs/ast": "3.4.8", - "@umijs/babel-preset-umi": "3.4.8", - "@umijs/deps": "0.8.1", - "@umijs/utils": "3.4.8" - } - }, - "@umijs/deps": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@umijs/deps/-/deps-0.8.1.tgz", - "integrity": "sha512-BfvWUblKdBzSyTWiX4Z4SmCu7yno5ypJquSx05ruPnZ9ZTxZIs4g+9Z3ow4yIvCBK/fFbRcBs4Os4fIPW3kmhg==", - "dev": true, - "requires": { - "@bloomberg/record-tuple-polyfill": "0.0.3", - "chokidar": "3.5.1", - "clipboardy": "2.3.0", - "jest-worker": "24.9.0", - "prettier": "2.2.1" - }, - "dependencies": { - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true - } - } - }, - "@umijs/plugin-analytics": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@umijs/plugin-analytics/-/plugin-analytics-0.2.2.tgz", - "integrity": "sha512-dVDzUfgIdEwdCC6a5IsMYpIPI+bEZjBEqIhAvw9dic6Vk77w9RxQxyRfW11dDmdXLAwWphp22NntQNt1ejZPtg==", - "dev": true - }, - "@umijs/plugin-antd": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@umijs/plugin-antd/-/plugin-antd-0.9.1.tgz", - "integrity": "sha512-MG+RifLIovPRvf5qPUfTIRqkiq1QBaKCE/pP3mM72DwAkDh6ZXn8oql/8tqFR3k1+m3XUbDEiOCH+Zx+eNiFew==", - "dev": true, - "requires": { - "antd": "^4.1.3", - "antd-mobile": "^2.3.1" - } - }, - "@umijs/preset-built-in": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/preset-built-in/-/preset-built-in-3.4.8.tgz", - "integrity": "sha512-/Fzmh9FwNA0PMKwFN20VhhHkOUqzfeX0imNaigGjqC72AF36sLkGLk9IbT5dqdEsC0OJSs+1rpk7n8fWoqf95A==", - "dev": true, - "requires": { - "@types/react-router-config": "5.0.2", - "@umijs/babel-preset-umi": "3.4.8", - "@umijs/bundler-webpack": "3.4.8", - "@umijs/deps": "0.8.1", - "@umijs/renderer-mpa": "3.4.8", - "@umijs/renderer-react": "3.4.8", - "@umijs/runtime": "3.4.8", - "@umijs/server": "3.4.8", - "@umijs/types": "3.4.8", - "@umijs/utils": "3.4.8", - "es5-imcompatible-versions": "^0.1.62", - "history-with-query": "4.10.4", - "react-refresh": "0.9.0", - "react-router": "5.2.0", - "react-router-config": "5.1.1", - "react-router-dom": "5.2.0", - "regenerator-runtime": "0.13.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - } - } - }, - "@umijs/preset-dumi": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@umijs/preset-dumi/-/preset-dumi-1.1.13.tgz", - "integrity": "sha512-WjSH5MIWDNo4Apg2NOm+0kCbmqrIWCJWGb7WheSb95ETYHBPiYgLIYHUyPrVCTlZKkG2x6NdxneShC/qlF4nKg==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-transform-modules-commonjs": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.7.2", - "@mapbox/hast-util-to-jsx": "^1.0.0", - "@umijs/babel-preset-umi": "3.x", - "@umijs/plugin-analytics": "^0.2.2", - "@umijs/runtime": "^3.2.14", - "@umijs/types": "3.x", - "@umijs/utils": "^3.2.28", - "copy-text-to-clipboard": "^2.2.0", - "deepmerge": "^4.2.2", - "dumi-assets-types": "1.0.0", - "dumi-theme-default": "1.0.13", - "enhanced-resolve": "^4.1.1", - "github-slugger": "^1.3.0", - "hast-util-has-property": "^1.0.4", - "hast-util-is-element": "^1.1.0", - "hast-util-raw": "^6.0.0", - "hast-util-to-html": "^7.1.1", - "hast-util-to-string": "^1.0.2", - "hosted-git-info": "^3.0.2", - "js-yaml": "^3.13.1", - "lz-string": "^1.4.4", - "react-docgen-typescript": "^1.20.5", - "rehype-autolink-headings": "^4.0.0", - "rehype-mathjax": "^3.1.0", - "rehype-remove-comments": "^4.0.2", - "rehype-stringify": "^8.0.0", - "remark-frontmatter": "^3.0.0", - "remark-gfm": "^1.0.0", - "remark-math": "^4.0.0", - "remark-parse": "^9.0.0", - "remark-rehype": "^8.0.0", - "remark-stringify": "^9.0.0", - "sitemap": "^6.3.3", - "slash2": "^2.0.0", - "terser": "^5.5.1", - "unified": "^8.4.1", - "unist-util-visit": "^2.0.1", - "unist-util-visit-parents": "^3.0.1" - } - }, - "@umijs/renderer-mpa": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/renderer-mpa/-/renderer-mpa-3.4.8.tgz", - "integrity": "sha512-E7GrzFPtXXoAoR0R4Xqt3ztFL+VIfv+a4ammFdouxxWkONnmZ+ede+V2TEzEK3+89Eu2eryWqmx5rIKu1aWaUg==", - "dev": true, - "requires": { - "@types/react": "^16.9.43", - "@types/react-dom": "^16.9.8", - "@umijs/runtime": "3.4.8" - }, - "dependencies": { - "@types/react": { - "version": "16.14.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz", - "integrity": "sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "16.9.12", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.12.tgz", - "integrity": "sha512-i7NPZZpPte3jtVOoW+eLB7G/jsX5OM6GqQnH+lC0nq0rqwlK0x8WcMEvYDgFWqWhWMlTltTimzdMax6wYfZssA==", - "dev": true, - "requires": { - "@types/react": "^16" - } - } - } - }, - "@umijs/renderer-react": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/renderer-react/-/renderer-react-3.4.8.tgz", - "integrity": "sha512-kMnxOHGCWmpLG464uYCvRshH7R5XvdkjA/1kKGM9y3xUDxK3dm7pV8I+LXZFrTGykH2fI/EShhFaRRDLjwWNUw==", - "dev": true, - "requires": { - "@types/react": "^16.9.43", - "@types/react-dom": "^16.9.8", - "@types/react-router-config": "^5.0.2", - "@umijs/runtime": "3.4.8", - "react-router-config": "5.1.1" - }, - "dependencies": { - "@types/react": { - "version": "16.14.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz", - "integrity": "sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "16.9.12", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.12.tgz", - "integrity": "sha512-i7NPZZpPte3jtVOoW+eLB7G/jsX5OM6GqQnH+lC0nq0rqwlK0x8WcMEvYDgFWqWhWMlTltTimzdMax6wYfZssA==", - "dev": true, - "requires": { - "@types/react": "^16" - } - } - } - }, - "@umijs/runtime": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/runtime/-/runtime-3.4.8.tgz", - "integrity": "sha512-MhPL8Rx2HS9ruBrJr1lFjQ5hm2mweQ0cNUZNs5jMZnm8s3v4SpCOlGJFVA3J4OyW1IsD8mAgsSfT7RvD6eh1Kg==", - "dev": true, - "requires": { - "@types/react-router": "5.1.12", - "@types/react-router-dom": "5.1.7", - "history-with-query": "4.10.4", - "react-router": "5.2.0", - "react-router-dom": "5.2.0", - "use-subscription": "1.5.1" - } - }, - "@umijs/server": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/server/-/server-3.4.8.tgz", - "integrity": "sha512-I/NrWamzxgoxm4DTkKC64HYnOQnZqxSsDaBXUHm/aJSv9mKfLU2wUQpG7LC8Za6tlGL9zq5Kq/oiNpuUdxss6Q==", - "dev": true, - "requires": { - "@umijs/deps": "0.8.1", - "@umijs/utils": "3.4.8" - } - }, - "@umijs/types": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/types/-/types-3.4.8.tgz", - "integrity": "sha512-YYbbCtay8GFEnXyEcBAgqIDfLYFnF7VVLVnKXNAO+Y3Tsh0NZIrMyiqpZIj5AMwl77C0BcC1xnI1T4b96LcXzw==", - "dev": true, - "requires": { - "@umijs/babel-preset-umi": "3.4.8", - "@umijs/core": "3.4.8", - "@umijs/deps": "0.8.1", - "@umijs/server": "3.4.8", - "@umijs/utils": "3.4.8", - "webpack-chain": "6.5.1" - } - }, - "@umijs/utils": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@umijs/utils/-/utils-3.4.8.tgz", - "integrity": "sha512-ewVj7M+B3WCRv7yqBBmN/JiiA/copH0cU7uGwIrnfytX86wjyjgq54LJ1Yj9bpw9axbOB+qaU2x+arfU6LLLag==", - "dev": true, - "requires": { - "@umijs/deps": "0.8.1" - } - }, - "@zkochan/cmd-shim": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", - "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", - "dev": true, - "requires": { - "is-windows": "^1.0.0", - "mkdirp-promise": "^5.0.1", - "mz": "^2.5.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "accord": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz", - "integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==", - "dev": true, - "requires": { - "convert-source-map": "^1.5.0", - "glob": "^7.0.5", - "indx": "^0.2.3", - "lodash.clone": "^4.3.2", - "lodash.defaults": "^4.0.1", - "lodash.flatten": "^4.2.0", - "lodash.merge": "^4.4.0", - "lodash.partialright": "^4.1.4", - "lodash.pick": "^4.2.1", - "lodash.uniq": "^4.3.0", - "resolve": "^1.5.0", - "semver": "^5.3.0", - "uglify-js": "^2.8.22", - "when": "^3.7.8" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "acorn": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz", - "integrity": "sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "add-dom-event-listener": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", - "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", - "dev": true, - "requires": { - "object-assign": "4.x" - } - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "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-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", - "integrity": "sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=", - "dev": true - }, - "amp-message": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", - "integrity": "sha1-p48cmJlQh602GSpBKY5NtJ49/EU=", - "dev": true, - "requires": { - "amp": "0.3.1" - } - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "antd": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/antd/-/antd-4.15.1.tgz", - "integrity": "sha512-zTZz8GY9yERNjSnH6xWU3Rw5sC3RtHEs/LOTKcSMTtU3Q5jHXIbAHKd1C6bYLQT6Ru75p+/UyKvJoNip/ax/WQ==", - "dev": true, - "requires": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons": "^4.6.2", - "@ant-design/react-slick": "~0.28.1", - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", - "lodash": "^4.17.21", - "moment": "^2.25.3", - "rc-cascader": "~1.4.0", - "rc-checkbox": "~2.3.0", - "rc-collapse": "~3.1.0", - "rc-dialog": "~8.5.1", - "rc-drawer": "~4.3.0", - "rc-dropdown": "~3.2.0", - "rc-field-form": "~1.20.0", - "rc-image": "~5.2.4", - "rc-input-number": "~7.0.1", - "rc-mentions": "~1.5.0", - "rc-menu": "~8.10.0", - "rc-motion": "^2.4.0", - "rc-notification": "~4.5.2", - "rc-pagination": "~3.1.6", - "rc-picker": "~2.5.10", - "rc-progress": "~3.1.0", - "rc-rate": "~2.9.0", - "rc-resize-observer": "^1.0.0", - "rc-select": "~12.1.6", - "rc-slider": "~9.7.1", - "rc-steps": "~4.1.0", - "rc-switch": "~3.2.0", - "rc-table": "~7.13.0", - "rc-tabs": "~11.7.0", - "rc-textarea": "~0.3.0", - "rc-tooltip": "~5.1.0", - "rc-tree": "~4.1.0", - "rc-tree-select": "~4.3.0", - "rc-trigger": "^5.2.1", - "rc-upload": "~4.2.0-alpha.0", - "rc-util": "^5.9.4", - "scroll-into-view-if-needed": "^2.2.25", - "warning": "^4.0.3" - } - }, - "antd-mobile": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/antd-mobile/-/antd-mobile-2.3.4.tgz", - "integrity": "sha512-Uw02Ghc+DPzaQceJQ+5p1ZnQFafvILA0chTTen7m7c89Uzbw6Ny3zsVZDE1gfteNEIsL4JpPe0I/+aI3Q/nPAA==", - "dev": true, - "requires": { - "array-tree-filter": "~2.1.0", - "babel-runtime": "6.x", - "classnames": "^2.2.1", - "normalize.css": "^7.0.0", - "rc-checkbox": "~2.0.0", - "rc-collapse": "~1.9.1", - "rc-slider": "~8.2.0", - "rc-swipeout": "~2.0.0", - "rmc-calendar": "^1.0.0", - "rmc-cascader": "~5.0.0", - "rmc-date-picker": "^6.0.8", - "rmc-dialog": "^1.0.1", - "rmc-drawer": "^0.4.11", - "rmc-feedback": "^2.0.0", - "rmc-input-number": "^1.0.0", - "rmc-list-view": "^0.11.0", - "rmc-notification": "~1.0.0", - "rmc-nuka-carousel": "~3.0.0", - "rmc-picker": "~5.0.0", - "rmc-pull-to-refresh": "~1.0.1", - "rmc-steps": "~1.0.0", - "rmc-tabs": "~1.2.0", - "rmc-tooltip": "~1.0.0" - }, - "dependencies": { - "rc-align": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz", - "integrity": "sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "dom-align": "^1.7.0", - "prop-types": "^15.5.8", - "rc-util": "^4.0.4" - } - }, - "rc-checkbox": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.0.3.tgz", - "integrity": "sha1-Q2qdUIlI4iSYDwU16nOLSBd6jyU=", - "dev": true, - "requires": { - "babel-runtime": "^6.23.0", - "classnames": "2.x", - "prop-types": "15.x", - "rc-util": "^4.0.4" - } - }, - "rc-collapse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-1.9.3.tgz", - "integrity": "sha512-8cG+FzudmgFCC9zRGKXJZA36zoI9Dmyjp6UDi8N80sXUch0JOpsZDxgcFzw4HPpPpK/dARtTilEe9zyuspnW0w==", - "dev": true, - "requires": { - "classnames": "2.x", - "css-animation": "1.x", - "prop-types": "^15.5.6", - "rc-animate": "2.x" - } - }, - "rc-slider": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.2.0.tgz", - "integrity": "sha1-rjfRcUTK1g4dpurA7k/8/qCwpug=", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5", - "prop-types": "^15.5.4", - "rc-tooltip": "^3.4.2", - "rc-util": "^4.0.4", - "shallowequal": "^1.0.1", - "warning": "^3.0.0" - } - }, - "rc-tooltip": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.3.tgz", - "integrity": "sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "prop-types": "^15.5.8", - "rc-trigger": "^2.2.2" - } - }, - "rc-trigger": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.5.tgz", - "integrity": "sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.6", - "prop-types": "15.x", - "rc-align": "^2.4.0", - "rc-animate": "2.x", - "rc-util": "^4.4.0", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dev": true, - "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.0.tgz", - "integrity": "sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "dev": true, - "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "async-validator": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz", - "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", - "dev": true - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dev": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-react-require": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.1.1.tgz", - "integrity": "sha512-XFz+B0dWx41fnGnugzCWn5rOgrDHb150N5gFhUfO3BgYDCT25o4sofRtd9uUfqUHoRu+t4/r5Cr2RMPIKuCt2g==", - "dev": true - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.1.tgz", - "integrity": "sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "bodec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", - "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", - "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001208", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.712", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001208", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", - "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", - "dev": true - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-tableau": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", - "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", - "dev": true, - "requires": { - "chalk": "3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", - "dev": true, - "requires": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "dev": true - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, - "component-classes": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "dev": true, - "requires": { - "component-indexof": "0.0.3" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "component-indexof": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=", - "dev": true - }, - "compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "dev": true, - "requires": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", - "dev": true, - "requires": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", - "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", - "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - } - } - }, - "conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dev": true, - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - } - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-text-to-clipboard": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-2.2.0.tgz", - "integrity": "sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==", - "dev": true - }, - "copy-to": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", - "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=", - "dev": true - }, - "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "dev": true, - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-js-compat": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", - "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", - "dev": true, - "requires": { - "browserslist": "^4.16.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-class": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", - "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "cron": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", - "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", - "dev": true, - "requires": { - "moment-timezone": "^0.5.x" - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "css-animation": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", - "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "component-classes": "^1.2.5" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==", - "dev": true - }, - "culvert": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", - "integrity": "sha1-lQL18BVKLVoioCPnn3HMk2+m728=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-fns": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.0.tgz", - "integrity": "sha512-lbAFpaKz7QuVxm6m1rmioh4BB2gmLx1r1JMYXU2A/ufT5ly4zEG7HYH4fvS/QfbdyC5rkYyiS30mYz4Q7XCO+w==", - "dev": true - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "dayjs": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", - "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", - "dev": true, - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - }, - "dependencies": { - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-align": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==", - "dev": true - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==", - "dev": true - }, - "dumi": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/dumi/-/dumi-1.1.13.tgz", - "integrity": "sha512-6OVqFRv3dbE9nagcZasLcGljL9cLKgYZItZJsdhHUvssYRnbSwQsUrDr3TyGUp/jbdQtXOtWv+6dzx6gqHlrgQ==", - "dev": true, - "requires": { - "@umijs/preset-dumi": "1.1.13", - "umi": "^3.0.0" - } - }, - "dumi-assets-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dumi-assets-types/-/dumi-assets-types-1.0.0.tgz", - "integrity": "sha512-7nhSeWM15vybbUAMPLZsdls2jKoHB2UU4P1RM6kLPucuS8eC/HSmufquFqTTYtX4oIDLHGtil/dVtMreNGwhdA==", - "dev": true - }, - "dumi-theme-default": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/dumi-theme-default/-/dumi-theme-default-1.0.13.tgz", - "integrity": "sha512-Z/iOpEDFm6HAh3SVk0XcwBR33lFOYMpdXZLcTSHy7UxVRVmsWmgaCvsFLkGnLL+B8AXW9BkKIq4b1e5xp1VJww==", - "dev": true, - "requires": { - "prism-react-renderer": "^1.1.1", - "prismjs": "^1.21.0", - "rc-tabs": "^11.7.1" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.717", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", - "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "dev": true, - "requires": { - "shimmer": "^1.2.0" - } - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-imcompatible-versions": { - "version": "0.1.67", - "resolved": "https://registry.npmjs.org/es5-imcompatible-versions/-/es5-imcompatible-versions-0.1.67.tgz", - "integrity": "sha512-L74XSKBby2NFW0Rxf6QhdQ45x0MrxbDmuNicti5arzoK7w2I+A6sxHGIQqPaN5NpoYDO3RTT/I3NZC5oIUskpw==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", - "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.21", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", - "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "father-build": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/father-build/-/father-build-1.19.4.tgz", - "integrity": "sha512-ub3sqUI6/LsZju0n+AL11VpPvhKZud5XjUpP/gZG4UOeYDPtI4TNWcuniBY9Rvg84OIEBh/WXfpe5p9FF00snA==", - "dev": true, - "requires": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-do-expressions": "7.12.1", - "@babel/plugin-proposal-export-default-from": "7.12.1", - "@babel/plugin-proposal-export-namespace-from": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-transform-modules-commonjs": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/register": "7.12.1", - "@lerna/project": "^3.21.0", - "@rollup/plugin-babel": "5.2.1", - "@rollup/plugin-commonjs": "16.0.0", - "@rollup/plugin-inject": "4.0.2", - "@rollup/plugin-json": "4.1.0", - "@rollup/plugin-node-resolve": "10.0.0", - "@rollup/plugin-replace": "2.3.4", - "@rollup/plugin-url": "5.0.1", - "@svgr/rollup": "5.4.0", - "ajv": "6.10.0", - "autoprefixer": "9.6.0", - "babel-plugin-istanbul": "^5.2.0", - "babel-plugin-react-require": "3.1.1", - "chalk": "2.4.2", - "chokidar": "^3.0.2", - "glob": "^7.1.4", - "gulp-if": "2.0.2", - "gulp-less": "^4.0.1", - "gulp-plumber": "^1.2.1", - "gulp-typescript": "5.0.1", - "less": "3.9.0", - "less-plugin-npm-import": "2.1.0", - "lodash": "4.17.19", - "rimraf": "2.6.3", - "rollup": "2.33.3", - "rollup-plugin-postcss": "3.1.8", - "rollup-plugin-terser": "7.0.2", - "rollup-plugin-typescript2": "0.29.0", - "signale": "1.4.0", - "slash2": "2.0.0", - "temp-dir": "2.0.0", - "through2": "3.0.1", - "ts-loader": "^8.0.7", - "typescript": "^4.0.5", - "update-notifier": "3.0.0", - "vinyl-fs": "3.0.3", - "yargs-parser": "13.1.2" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "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/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "autoprefixer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", - "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", - "dev": true, - "requires": { - "browserslist": "^4.6.1", - "caniuse-lite": "^1.0.30000971", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.16", - "postcss-value-parser": "^3.3.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", - "dev": true - } - } - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "dev": true, - "requires": { - "format": "^0.2.0" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, - "fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", - "dev": true - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "fork-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", - "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "dev": true - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", - "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-node-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", - "integrity": "sha1-SbIV4kLr5Dqkx1Ybu6SZUhdSCA8=", - "dev": true - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - } - }, - "git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", - "dev": true, - "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "git-sha1": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", - "integrity": "sha1-WZrBkrcYdYJeE6RF86bgURjC90U=", - "dev": true - }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.4.4", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.4.tgz", - "integrity": "sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", - "dev": true, - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@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": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "gulp-if": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", - "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", - "dev": true, - "requires": { - "gulp-match": "^1.0.3", - "ternary-stream": "^2.0.1", - "through2": "^2.0.1" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-less": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", - "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", - "dev": true, - "requires": { - "accord": "^0.29.0", - "less": "2.6.x || ^3.7.1", - "object-assign": "^4.0.1", - "plugin-error": "^0.1.2", - "replace-ext": "^1.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-match": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", - "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.3" - } - }, - "gulp-plumber": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", - "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.4.tgz", - "integrity": "sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw==", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dev": true, - "requires": { - "@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-dom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-3.0.0.tgz", - "integrity": "sha512-4vQuGiD5Y/wlD7fZiY4mZML/6oh0GOnH38UNyeDFcSTE4AHF0zjKHZfbd+ekVwPvsZXRl8choc99INHUwSPJlg==", - "dev": true, - "requires": { - "hastscript": "^6.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dev": true, - "requires": { - "@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-has-property": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", - "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==", - "dev": true - }, - "hast-util-is-conditional-comment": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-is-conditional-comment/-/hast-util-is-conditional-comment-1.0.4.tgz", - "integrity": "sha512-rtULxWWknVeSuU/vsJ9tHo+M3ExyaOrZcWvLxqY2nUfCHbDcq60EJzSJC5zNm6ZlbxbJ8l7Ej8C1Kzsi5PJS1A==", - "dev": true - }, - "hast-util-is-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", - "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", - "dev": true - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "dev": true - }, - "hast-util-raw": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", - "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", - "dev": true, - "requires": { - "@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", - "unist-util-visit": "^2.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-html": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.2.tgz", - "integrity": "sha512-pu73bvORzdF6XZgwl9eID/0RjBb/jtRfoGRRSykpR1+o9rCdiAHpgkSukZsQBRlIqMg6ylAcd7F0F7myJUb09Q==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-is-element": "^1.0.0", - "hast-util-whitespace": "^1.0.0", - "html-void-elements": "^1.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0", - "stringify-entities": "^3.0.1", - "unist-util-is": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dev": true, - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", - "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==", - "dev": true - }, - "hast-util-to-text": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz", - "integrity": "sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==", - "dev": true, - "requires": { - "hast-util-is-element": "^1.0.0", - "repeat-string": "^1.0.0", - "unist-util-find-after": "^3.0.0" - } - }, - "hast-util-whitespace": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", - "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", - "dev": true - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dev": true, - "requires": { - "@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" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "requires": { - "@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" - } - }, - "history-with-query": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/history-with-query/-/history-with-query-4.10.4.tgz", - "integrity": "sha512-JnskQK8X+PbRFHSdDAExhoJyhLnlLZL+UuHQuQhys+Se9/ukRDRBWU4JVTjsiIfbv1fcEmR3oqKW56OYmk5M5w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "query-string": "^6.11.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "dev": true - }, - "http-assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", - "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.7.2" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indx": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", - "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", - "dev": true - }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-ssh": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz", - "integrity": "sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "javascript-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", - "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", - "dev": true - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-git": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", - "integrity": "sha1-UvplWrYYd9bxB578ZTS1VPMeVEQ=", - "dev": true, - "requires": { - "bodec": "^0.1.0", - "culvert": "^0.1.2", - "git-sha1": "^0.1.2", - "pako": "^0.2.5" - }, - "dependencies": { - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", - "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.1.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.4", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", - "dev": true, - "requires": { - "string-convert": "^0.2.0" - } - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "katex": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz", - "integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==", - "dev": true, - "requires": { - "commander": "^2.19.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "kebab-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.1.tgz", - "integrity": "sha512-txPHx6nVLhv8PHGXIlAk0nYoh894SpAqGPXNvbg2hh8spvHXIah3+vT87DLoa59nKgC6scD3u3xAuRIgiMqbfQ==", - "dev": true - }, - "keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "requires": { - "tsscmp": "1.0.6" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", - "dev": true, - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "~3.1.0", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "koa-bodyparser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", - "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", - "dev": true, - "requires": { - "co-body": "^6.0.0", - "copy-to": "^2.0.1" - } - }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", - "dev": true, - "requires": { - "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "dev": true, - "requires": { - "any-promise": "^1.1.0" - } - } - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=", - "dev": true - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "lerna": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", - "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", - "dev": true, - "requires": { - "@lerna/add": "3.21.0", - "@lerna/bootstrap": "3.21.0", - "@lerna/changed": "3.21.0", - "@lerna/clean": "3.21.0", - "@lerna/cli": "3.18.5", - "@lerna/create": "3.22.0", - "@lerna/diff": "3.21.0", - "@lerna/exec": "3.21.0", - "@lerna/import": "3.22.0", - "@lerna/info": "3.21.0", - "@lerna/init": "3.21.0", - "@lerna/link": "3.21.0", - "@lerna/list": "3.21.0", - "@lerna/publish": "3.22.1", - "@lerna/run": "3.21.0", - "@lerna/version": "3.22.1", - "import-local": "^2.0.0", - "npmlog": "^4.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - } - } - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-plugin-npm-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", - "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", - "dev": true, - "requires": { - "promise": "~7.0.1", - "resolve": "~1.1.6" - }, - "dependencies": { - "promise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "lint-staged": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", - "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.1.0", - "listr2": "^3.2.2", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@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" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "listr2": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.6.2.tgz", - "integrity": "sha512-B2vlu7Zx/2OAMVUovJ7Tv1kQ2v2oXd0nZKzkSAcRCej269d8gkS/gupDEdNl23KQ3ZjVD8hQmifrrBFbx8F9LA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.7", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - } - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.partialright": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - } - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "dev": true - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - }, - "dependencies": { - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mathjax-full": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.1.2.tgz", - "integrity": "sha512-jFCwRFdFwIOa8J7r6VZT0AIv9ZwbLQ9aPc9YZp695NTvv7XKU2NunJodA+zDWzElIFJ7mTsImyfe5R3QyRNZjw==", - "dev": true, - "requires": { - "esm": "^3.2.25", - "mj-context-menu": "^0.6.1", - "speech-rule-engine": "^3.1.1" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-find-and-replace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", - "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", - "dev": true, - "requires": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - } - } - }, - "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "mdast-util-frontmatter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", - "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", - "dev": true, - "requires": { - "micromark-extension-frontmatter": "^0.2.0" - } - }, - "mdast-util-gfm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", - "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", - "dev": true, - "requires": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" - } - }, - "mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", - "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" - } - }, - "mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", - "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", - "dev": true, - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "mdast-util-gfm-table": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", - "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", - "dev": true, - "requires": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" - } - }, - "mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", - "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", - "dev": true, - "requires": { - "mdast-util-to-markdown": "~0.6.0" - } - }, - "mdast-util-math": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-0.1.2.tgz", - "integrity": "sha512-fogAitds+wH+QRas78Yr1TwmQGN4cW/G2WRw5ePuNoJbBSPJCxIOCE8MTzHgWHVSpgkRaPQTgfzXRE1CrwWSlg==", - "dev": true, - "requires": { - "longest-streak": "^2.0.0", - "mdast-util-to-markdown": "^0.6.0", - "repeat-string": "^1.0.0" - } - }, - "mdast-util-to-hast": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", - "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", - "dev": true, - "requires": { - "@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-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "micromark-extension-frontmatter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", - "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", - "dev": true, - "requires": { - "fault": "^1.0.0" - } - }, - "micromark-extension-gfm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", - "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", - "dev": true, - "requires": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" - } - }, - "micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", - "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", - "dev": true, - "requires": { - "micromark": "~2.11.3" - } - }, - "micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", - "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", - "dev": true, - "requires": { - "micromark": "~2.11.0" - } - }, - "micromark-extension-gfm-table": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", - "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", - "dev": true, - "requires": { - "micromark": "~2.11.0" - } - }, - "micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", - "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", - "dev": true - }, - "micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", - "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", - "dev": true, - "requires": { - "micromark": "~2.11.0" - } - }, - "micromark-extension-math": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-0.1.2.tgz", - "integrity": "sha512-ZJXsT2eVPM8VTmcw0CPSDeyonOn9SziGK3Z+nkf9Vb6xMPeU+4JMEnO6vzDL10562Favw8Vste74f54rxJ/i6Q==", - "dev": true, - "requires": { - "katex": "^0.12.0", - "micromark": "~2.11.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true - }, - "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dev": true, - "requires": { - "mime-db": "1.47.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, - "mini-store": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.6.tgz", - "integrity": "sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==", - "dev": true, - "requires": { - "hoist-non-react-statics": "^3.3.2", - "shallowequal": "^1.0.2" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mj-context-menu": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", - "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=", - "dev": true - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true - }, - "moment-timezone": { - "version": "0.5.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "dev": true, - "requires": { - "moment": ">= 2.9.0" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", - "dev": true, - "requires": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", - "dev": true, - "requires": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "dev": true, - "requires": { - "lru-cache": "^4.1.3" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "dependencies": { - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "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" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - } - } - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "dependencies": { - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - } - } - }, - "normalize.css": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-7.0.0.tgz", - "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=", - "dev": true - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-lifecycle": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", - "dev": true, - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nssocket": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", - "integrity": "sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=", - "dev": true, - "requires": { - "eventemitter2": "~0.4.14", - "lazy": "~1.0.11" - }, - "dependencies": { - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - } - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - } - }, - "octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", - "dev": true - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "p-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", - "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - } - } - }, - "pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", - "dev": true, - "requires": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^2.0.1" - } - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "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-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-path": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", - "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" - }, - "dependencies": { - "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "parse-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.2.tgz", - "integrity": "sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - } - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", - "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pg": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", - "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", - "dev": true, - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.3.0", - "pg-protocol": "^1.5.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - } - }, - "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", - "dev": true - }, - "pg-hstore": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.3.tgz", - "integrity": "sha512-qpeTpdkguFgfdoidtfeTho1Q1zPVPbtMHgs8eQ+Aan05iLmIs3Z3oo5DOZRclPGoQ4i68I1kCtQSJSa7i0ZVYg==", - "dev": true, - "requires": { - "underscore": "^1.7.0" - } - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true - }, - "pg-pool": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", - "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==", - "dev": true - }, - "pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==", - "dev": true - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dev": true, - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", - "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", - "dev": true, - "requires": { - "split2": "^3.1.1" - } - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", - "dev": true, - "requires": { - "safe-buffer": "^5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pm2": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-4.5.6.tgz", - "integrity": "sha512-4J5q704Xl6VmpmQhXFGMJL4kXyyQw3AZM1FE9vRxhS3LiDI/+WVBtOM6pqJ4g/RKW+AUjEkc23i/DCC4BVenDA==", - "dev": true, - "requires": { - "@pm2/agent": "~1.0.8", - "@pm2/io": "~5.0.0", - "@pm2/js-api": "~0.6.7", - "@pm2/pm2-version-check": "^1.0.4", - "async": "~3.2.0", - "blessed": "0.1.81", - "chalk": "3.0.0", - "chokidar": "^3.5.1", - "cli-tableau": "^2.0.0", - "commander": "2.15.1", - "cron": "1.8.2", - "dayjs": "~1.8.25", - "debug": "^4.3.1", - "enquirer": "2.3.6", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "mkdirp": "1.0.4", - "needle": "2.4.0", - "pidusage": "2.0.21", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.0", - "pm2-deploy": "~1.0.2", - "pm2-multimeter": "^0.1.2", - "promptly": "^2", - "ps-list": "6.3.0", - "semver": "^7.2", - "source-map-support": "0.5.19", - "sprintf-js": "1.1.2", - "vizion": "2.2.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - } - } - }, - "pm2-axon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", - "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", - "dev": true, - "requires": { - "amp": "~0.3.1", - "amp-message": "~0.1.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - } - } - }, - "pm2-axon-rpc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", - "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", - "dev": true, - "requires": { - "debug": "^4.3.1" - } - }, - "pm2-deploy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", - "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", - "dev": true, - "requires": { - "run-series": "^1.1.8", - "tv4": "^1.3.0" - } - }, - "pm2-multimeter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", - "integrity": "sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=", - "dev": true, - "requires": { - "charm": "~0.1.1" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", - "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1", - "postcss": "^7.0.18" - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-2.0.0.tgz", - "integrity": "sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==", - "dev": true, - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^2.0.1", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "dev": true - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", - "dev": true - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "dev": true - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "prism-react-renderer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz", - "integrity": "sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg==", - "dev": true - }, - "prismjs": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", - "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", - "dev": true - }, - "promptly": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", - "integrity": "sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=", - "dev": true, - "requires": { - "read": "^1.0.4" - } - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", - "dev": true, - "requires": { - "read": "1" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "dev": true - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", - "dev": true, - "requires": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "ps-list": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz", - "integrity": "sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "rc-align": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz", - "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^5.3.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-animate": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.11.1.tgz", - "integrity": "sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.6", - "css-animation": "^1.3.2", - "prop-types": "15.x", - "raf": "^3.4.0", - "rc-util": "^4.15.3", - "react-lifecycles-compat": "^3.0.4" - }, - "dependencies": { - "rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dev": true, - "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "rc-cascader": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.2.tgz", - "integrity": "sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1", - "warning": "^4.0.1" - } - }, - "rc-checkbox": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - } - }, - "rc-collapse": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.0.tgz", - "integrity": "sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.2.1", - "shallowequal": "^1.1.0" - } - }, - "rc-dialog": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz", - "integrity": "sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.6.1" - } - }, - "rc-drawer": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.3.1.tgz", - "integrity": "sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.7.0" - } - }, - "rc-dropdown": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz", - "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-trigger": "^5.0.4" - } - }, - "rc-field-form": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.0.tgz", - "integrity": "sha512-jkzsIfXR7ywEYdeAtktt1aLff88wxIPDLpq7KShHNl4wlsWrCE+TzkXBfjvVzYOVZt5GGrD8YDqNO/q6eaR/eA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4", - "async-validator": "^3.0.3", - "rc-util": "^5.8.0" - } - }, - "rc-gesture": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/rc-gesture/-/rc-gesture-0.0.22.tgz", - "integrity": "sha512-6G6qrCE0MUTXyjh/powj91XkjRjoFL4HiJLPU5lALXHvGX+/efcUjGYUrHrrw0mwQdmrmg4POqnY/bibns+G3g==", - "dev": true, - "requires": { - "babel-runtime": "6.x" - } - }, - "rc-image": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.4.tgz", - "integrity": "sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-dialog": "~8.5.0", - "rc-util": "^5.0.6" - } - }, - "rc-input-number": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.0.6.tgz", - "integrity": "sha512-J5DIoCKIunoPb16FEghaEOyNDuZXD5F9LxLNcqd31z/0e37XtuHgo4QF/TonKLsESwdg7UAzWhiD0K6PPrN3YQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.9.8" - } - }, - "rc-mentions": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.5.3.tgz", - "integrity": "sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-menu": "^8.0.1", - "rc-textarea": "^0.3.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1" - } - }, - "rc-menu": { - "version": "8.10.7", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.10.7.tgz", - "integrity": "sha512-m/ypV7OjkkUsMdutzMUxEI8tWyi0Y1TQ5YkSDk7k2uv2aCKkHYEoDKsDAfcPeejo3HMo2z5unWE+jD+dCphraw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "mini-store": "^3.0.1", - "rc-motion": "^2.0.1", - "rc-trigger": "^5.1.2", - "rc-util": "^5.7.0", - "resize-observer-polyfill": "^1.5.0", - "shallowequal": "^1.1.0" - } - }, - "rc-motion": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz", - "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.2.1" - } - }, - "rc-notification": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.5.tgz", - "integrity": "sha512-YIfhTSw+h5GsSdgMnuMx24wqiPlg3FeamuOlkh9RkyHx+SeZVAKzQ0juy2NGvPEF2hDWi5xTqxUqLdo0L2AmGg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.2.0", - "rc-util": "^5.0.1" - } - }, - "rc-overflow": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.1.1.tgz", - "integrity": "sha512-bkGrxvWtz6xQfxBPBQcN8xOEHFCeG0R4pfLAku6kFLQF9NPMTt5HvT+Bq0+stqom9eI3WRlun6RPzfjTamPwew==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.5.1" - } - }, - "rc-pagination": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.6.tgz", - "integrity": "sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - } - }, - "rc-picker": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.10.tgz", - "integrity": "sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "date-fns": "^2.15.0", - "moment": "^2.24.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - } - }, - "rc-progress": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.3.tgz", - "integrity": "sha512-Jl4fzbBExHYMoC6HBPzel0a9VmhcSXx24LVt/mdhDM90MuzoMCJjXZAlhA0V0CJi+SKjMhfBoIQ6Lla1nD4QNw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6" - } - }, - "rc-rate": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz", - "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" - } - }, - "rc-resize-observer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz", - "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-select": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-12.1.9.tgz", - "integrity": "sha512-jsqcdby3Ag9ohYQ0d4vS4Q2jeWjj6kb2NHS9WcQSse0/5lCb3mqXI/1fkKRRIhdQvMBklYh4ctSox3mDrZiB8A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.9.8", - "rc-virtual-list": "^3.2.0" - } - }, - "rc-slider": { - "version": "9.7.2", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.2.tgz", - "integrity": "sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-tooltip": "^5.0.1", - "rc-util": "^5.0.0", - "shallowequal": "^1.1.0" - } - }, - "rc-steps": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.3.tgz", - "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "classnames": "^2.2.3", - "rc-util": "^5.0.1" - } - }, - "rc-swipeout": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/rc-swipeout/-/rc-swipeout-2.0.11.tgz", - "integrity": "sha512-d37Lgn4RX4OOQyuA2BFo0rGlUwrmZk5q83srH3ixJ1Y1jidr2GKjgJDbNeGUVZPNfYBL91Elu6+xfVGftWf4Lg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "2.x", - "rc-gesture": "~0.0.22", - "react-native-swipeout": "^2.2.2" - } - }, - "rc-switch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", - "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.1" - } - }, - "rc-table": { - "version": "7.13.3", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.13.3.tgz", - "integrity": "sha512-oP4fknjvKCZAaiDnvj+yzBaWcg+JYjkASbeWonU1BbrLcomkpKvMUgPODNEzg0QdXA9OGW0PO86h4goDSW06Kg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - } - }, - "rc-tabs": { - "version": "11.7.3", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.3.tgz", - "integrity": "sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "^3.1.3", - "rc-menu": "^8.6.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.5.0" - } - }, - "rc-textarea": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.4.tgz", - "integrity": "sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.7.0" - } - }, - "rc-tooltip": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz", - "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.2", - "rc-trigger": "^5.0.0" - } - }, - "rc-tree": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz", - "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.0.0", - "rc-virtual-list": "^3.0.1" - } - }, - "rc-tree-select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.1.tgz", - "integrity": "sha512-OeV8u5kBEJ8MbatP04Rh8T3boOHGjdGBTEm1a0bubBbB2GNNhlMOr4ZxezkHYtXf02JdBS/WyydmI/RMjXgtJA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "^12.0.0", - "rc-tree": "^4.0.0", - "rc-util": "^5.0.5" - } - }, - "rc-trigger": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.5.tgz", - "integrity": "sha512-RlF5RpWqK+JeiFeQVOzwjLFzpNe2FowoXc/42azz+20wr/bYF1Q/MwprUK+3+vs/oFhLC0ht3/NlrslAo/OoWA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-align": "^4.0.0", - "rc-motion": "^2.0.0", - "rc-util": "^5.5.0" - } - }, - "rc-upload": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.2.0.tgz", - "integrity": "sha512-BXtvBs1PnwLjaUzBBU5z4yb9NMSaxc6mUIoPmS9LUAzaTz12L3TLrwu+8dnopYUiyLmYFS3LEO7aUfEWBqJfSA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - } - }, - "rc-util": { - "version": "5.9.8", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.8.tgz", - "integrity": "sha512-typLSHYGf5irvGLYQshs0Ra3aze086h0FhzsAkyirMunYZ7b3Te8gKa5PVaanoHaZa9sS6qx98BxgysoRP+6Tw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "rc-virtual-list": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz", - "integrity": "sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==", - "dev": true, - "requires": { - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.0.7" - } - }, - "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-attr-converter": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/react-attr-converter/-/react-attr-converter-0.3.1.tgz", - "integrity": "sha512-dSxo2Mn6Zx4HajeCeQNLefwEO4kNtV/0E682R1+ZTyFRPqxDa5zYb5qM/ocqw9Bxr/kFQO0IUiqdV7wdHw+Cdg==", - "dev": true - }, - "react-docgen-typescript": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-1.22.0.tgz", - "integrity": "sha512-MPLbF8vzRwAG3GcjdL+OHQlhgtWsLTXs+7uJiHfEeT3Ur7IsZaNYqRTLQ9sj2nB6M6jylcPCeCmH7qbszJmecg==", - "dev": true - }, - "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true - }, - "react-native-swipeout": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-native-swipeout/-/react-native-swipeout-2.3.6.tgz", - "integrity": "sha512-t9suUCspzck4vp2pWggWe0frS/QOtX6yYCawHnEes75A7dZCEE74bxX2A1bQzGH9cUMjq6xsdfC94RbiDKIkJg==", - "dev": true, - "requires": { - "create-react-class": "^15.6.0", - "prop-types": "^15.5.10", - "react-tween-state": "^0.1.5" - } - }, - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true - }, - "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "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" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-tween-state": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/react-tween-state/-/react-tween-state-0.1.5.tgz", - "integrity": "sha1-6YsGZVHvuTy5LdG+FJlcLj3q4zk=", - "dev": true, - "requires": { - "raf": "^3.1.0", - "tween-functions": "^1.0.1" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", - "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "rehype-autolink-headings": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-4.0.0.tgz", - "integrity": "sha512-2lglJ+4S3A4RCz+zlKVWj1wHvwO4bjunAoEOgMfjphT59EVXwdMiJzrL/A2fuAX/33k/LhkGW6BEK1Cl1I5WQw==", - "dev": true, - "requires": { - "extend": "^3.0.1", - "hast-util-has-property": "^1.0.0", - "hast-util-is-element": "^1.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "rehype-mathjax": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-3.1.0.tgz", - "integrity": "sha512-Pmz92Y56lBFmDjFc9nIdrKu1xzKSBYevcwKiKiG7b5JJg74q1E62nRSbPEm37vXaXn7Bn25iRsWcP39bJKkMxg==", - "dev": true, - "requires": { - "@types/mathjax": "^0.0.36", - "hast-util-from-dom": "^3.0.0", - "hast-util-to-text": "^2.0.0", - "jsdom": "^16.0.0", - "mathjax-full": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "rehype-remove-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rehype-remove-comments/-/rehype-remove-comments-4.0.2.tgz", - "integrity": "sha512-E2FNohTuIs7QzUnEQs3SdYdCScsTgUN7yPeDNWi+gsvx+pbLzIAyp27TWz3Gm64jpdLi7/6HxyRHxdd1NVQ37A==", - "dev": true, - "requires": { - "hast-util-is-conditional-comment": "^1.0.0", - "unist-util-filter": "^2.0.0" - } - }, - "rehype-stringify": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", - "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", - "dev": true, - "requires": { - "hast-util-to-html": "^7.1.1" - } - }, - "remark-frontmatter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", - "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", - "dev": true, - "requires": { - "mdast-util-frontmatter": "^0.2.0", - "micromark-extension-frontmatter": "^0.2.0" - } - }, - "remark-gfm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", - "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", - "dev": true, - "requires": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" - } - }, - "remark-math": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-4.0.0.tgz", - "integrity": "sha512-lH7SoQenXtQrvL0bm+mjZbvOk//YWNuyR+MxV18Qyv8rgFmMEGNuB0TSCQDkoDaiJ40FCnG8lxErc/zhcedYbw==", - "dev": true, - "requires": { - "mdast-util-math": "^0.1.0", - "micromark-extension-math": "^0.1.0" - } - }, - "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "requires": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "remark-rehype": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", - "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", - "dev": true, - "requires": { - "mdast-util-to-hast": "^10.2.0" - } - }, - "remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-in-the-middle": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", - "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.12.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, - "retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", - "dev": true, - "requires": { - "any-promise": "^1.3.0" - } - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rmc-align": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rmc-align/-/rmc-align-1.0.0.tgz", - "integrity": "sha512-3gEa5/+hqqoEVoeQ25KoRc8DOsXIdSaVpaBq1zQFaV941LR3xvZIRTlxTDT/IagYwoGM1KZea/jd7cNMYP34Rg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "dom-align": "1.x", - "rc-util": "4.x" - }, - "dependencies": { - "rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dev": true, - "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "rmc-calendar": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rmc-calendar/-/rmc-calendar-1.1.4.tgz", - "integrity": "sha512-xxQZaPFDnpHt4IFO8mukYrXSgC1W8LcNVp+EoX4iyeOJFimungOKB/iP5/cy+st8yXq8lUgk9TXsHNtM6Xo6ZA==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "rc-animate": "^2.4.4", - "rmc-date-picker": "^6.0.8" - } - }, - "rmc-cascader": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/rmc-cascader/-/rmc-cascader-5.0.3.tgz", - "integrity": "sha512-PxDhMjWViDdG4SMZqoXtAthGwgDyYnyxxZEE17IDDYsiCHpWtOhoIL8nsI+/hZ212UT/XF2LpqCsOlMoJiYk+w==", - "dev": true, - "requires": { - "array-tree-filter": "2.1.x", - "babel-runtime": "6.x", - "rmc-picker": "~5.0.0" - } - }, - "rmc-date-picker": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/rmc-date-picker/-/rmc-date-picker-6.0.10.tgz", - "integrity": "sha512-/9+I6lm3EDEl6M7862V6++zFuxwsM0UEq8wSHbotYIPPmyB/65gx1cviblghOv2QfB0O9+U2w3qEJlRP/WsMrA==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "rmc-picker": "~5.0.0" - } - }, - "rmc-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rmc-dialog/-/rmc-dialog-1.1.1.tgz", - "integrity": "sha512-28aJqtPTX6v13Z/aU1WBy1AFIXkE74PxZXde7JvtEIy9hQDTjH8fqOi822BpzAbXCyNE7jF9iFomy3H2ClsDJA==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "rc-animate": "2.x" - } - }, - "rmc-drawer": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/rmc-drawer/-/rmc-drawer-0.4.11.tgz", - "integrity": "sha512-YfB9XEJ8iM0MMuLWAK4313uOxSM8NAljC8Cqun1KamXutglYTuRviUuTLNSOzV8HHPp5kNpsVduvPCGLWXvThw==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.4", - "prop-types": "^15.5.10" - } - }, - "rmc-feedback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz", - "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5" - } - }, - "rmc-input-number": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/rmc-input-number/-/rmc-input-number-1.0.5.tgz", - "integrity": "sha512-prPkEtoOVde77GnEnEaBeWjBobMOPgGqU5bd0gxfp1kt1pUN740mMpVAcH7uxpJjVfmw+kuGWtiz4S7CueagSg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.0", - "rmc-feedback": "^2.0.0" - } - }, - "rmc-list-view": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/rmc-list-view/-/rmc-list-view-0.11.5.tgz", - "integrity": "sha512-eMOC5394tLNawcdEEhF7boMpQgpjJGDdL5lS+LblAWdBec7Q4EYkUdnrKNbt+O9k5RGM6nSLAGZK5oB4FN85Lg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5", - "fbjs": "^0.8.3", - "prop-types": "^15.5.8", - "warning": "^3.0.0", - "zscroller": "~0.4.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, - "rmc-notification": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rmc-notification/-/rmc-notification-1.0.0.tgz", - "integrity": "sha512-9sPxjltFvtRLt2v312Hu7OXwk53pHkBYgINRDmnJ3A5NF1qtJeCCcdN0Xr0fzJ6sbQvtGju822tWHdzYA9u7Vw==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "2.x", - "prop-types": "^15.5.8", - "rc-animate": "2.x", - "rc-util": "^4.0.4" - }, - "dependencies": { - "rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dev": true, - "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "rmc-nuka-carousel": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rmc-nuka-carousel/-/rmc-nuka-carousel-3.0.1.tgz", - "integrity": "sha512-w2EPTERMUUZqcUSKFuejjin7xsMlhrLrtS0A/igTXpFJGq3kemDKcRi7q3pSYDuZBHYBl5iV4UqsLLkjdFtrYA==", - "dev": true, - "requires": { - "exenv": "^1.2.0", - "raf": "^3.3.2" - } - }, - "rmc-picker": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rmc-picker/-/rmc-picker-5.0.10.tgz", - "integrity": "sha512-KZ70+WjcaZHnG5GyCxWCPFWAZ12s6NqyrbW73LeqH0WEqaTMMs0sOrk2f4mQAZ/CGT0XcFN6VZLw7Ozoxfn7LA==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.6", - "rmc-dialog": "^1.1.1", - "rmc-feedback": "^2.0.0" - } - }, - "rmc-pull-to-refresh": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/rmc-pull-to-refresh/-/rmc-pull-to-refresh-1.0.13.tgz", - "integrity": "sha512-iYLsURiR7G/sKmRA6p2kq6ZXicn7Hyeo6VQFljssV1eMW+fzDgihhaz0kv5mza0f88vphGJvjOihT9E6+xGb6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5" - } - }, - "rmc-steps": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rmc-steps/-/rmc-steps-1.0.1.tgz", - "integrity": "sha512-8ijtwp4D1CYTtI2yerXJYqCv+GQbiBc9T12nrFngd/vM0y+58CnznGphTAueF6IWf7qbxBwcjTrcFgg7bP2YGA==", - "dev": true, - "requires": { - "babel-runtime": "^6.23.0", - "classnames": "^2.2.3" - } - }, - "rmc-tabs": { - "version": "1.2.29", - "resolved": "https://registry.npmjs.org/rmc-tabs/-/rmc-tabs-1.2.29.tgz", - "integrity": "sha512-wiJS9WSJi9JH9GQO+FqncX+zaHP31qHa/S8nDW9UXUx0qbCX294QcJEnvfB+WmsfUws7rXjs6sOQp5EDiObnHg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "rc-gesture": "~0.0.18" - } - }, - "rmc-tooltip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rmc-tooltip/-/rmc-tooltip-1.0.1.tgz", - "integrity": "sha512-fSDArf2BlMVrHExmBiqb2TkCRJHshvXFJQ/7tMraLellwaJLNiwrxtWpW329k3S+zTtoVG8UxFS1TjBGEsMzRg==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "rmc-trigger": "1.x" - } - }, - "rmc-trigger": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/rmc-trigger/-/rmc-trigger-1.0.12.tgz", - "integrity": "sha512-AccQniX7PX7Pm8hBhHEsnf3JU6CA61Xc7fAt2WbO+oXrGaI/jqN8C3COhhOXG54S5iTOjLS26j858zshwAxR9A==", - "dev": true, - "requires": { - "babel-runtime": "6.x", - "rc-animate": "2.x", - "rc-util": "4.x", - "rmc-align": "~1.0.0" - }, - "dependencies": { - "rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dev": true, - "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "rollup": { - "version": "2.33.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.33.3.tgz", - "integrity": "sha512-RpayhPTe4Gu/uFGCmk7Gp5Z9Qic2VsqZ040G+KZZvsZYdcuWaJg678JeDJJvJeEQXminu24a2au+y92CUWVd+w==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - }, - "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - } - } - }, - "rollup-plugin-postcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-3.1.8.tgz", - "integrity": "sha512-JHnGfW8quNc6ePxEkZ05HEZ1YiRxDgY9RKEetMfsrwxR2kh/d90OVScTc6b1c2Q17Cs/5TRYL+1uddG21lQe3w==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^4.1.10", - "import-cwd": "^3.0.0", - "p-queue": "^6.3.0", - "pify": "^5.0.0", - "postcss": "^7.0.27", - "postcss-load-config": "^2.1.0", - "postcss-modules": "^2.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.16.1", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.1", - "style-inject": "^0.3.0" - }, - "dependencies": { - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "rollup-plugin-typescript2": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.29.0.tgz", - "integrity": "sha512-YytahBSZCIjn/elFugEGQR5qTsVhxhUwGZIsA9TmrSsC88qroGo65O5HZP/TTArH2dm0vUmYWhKchhwi2wL9bw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.17.0", - "tslib": "2.0.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "scroll-into-view-if-needed": { - "version": "2.2.28", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz", - "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==", - "dev": true, - "requires": { - "compute-scroll-into-view": "^1.0.17" - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", - "dev": true - }, - "sequelize": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.6.2.tgz", - "integrity": "sha512-H/zrzmTK+tis9PJaSigkuXI57nKBvNCtPQol0yxCvau1iWLzSOuq8t3tMOVeQ+Ep8QH2HoD9/+FCCIAqzUr/BQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.12.0", - "lodash": "^4.17.20", - "moment": "^2.26.0", - "moment-timezone": "^0.5.31", - "retry-as-promised": "^3.2.0", - "semver": "^7.3.2", - "sequelize-pool": "^6.0.0", - "toposort-class": "^1.0.1", - "uuid": "^8.1.0", - "validator": "^10.11.0", - "wkx": "^0.5.0" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "sequelize-pool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", - "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==", - "dev": true - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "sitemap": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", - "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", - "dev": true, - "requires": { - "@types/node": "^14.14.28", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slash2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash2/-/slash2-2.0.0.tgz", - "integrity": "sha512-7ElvBydJPi3MHU/KEOblFSbO/skl4Z69jKkFCpYIYVOMSIZsKi4gYU43HGeZPmjxCXrHekoDAAewphPQNnsqtA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "speech-rule-engine": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.1.1.tgz", - "integrity": "sha512-FGX8B44yI3yGhmcw8nZ/by2ffUlZG6m5b/O3RULXsSiwhL/evL+jwQ6BXQxV3gGtOYptOFalTVCAFknAJgBKAg==", - "dev": true, - "requires": { - "commander": "^6.0.0", - "wicked-good-xpath": "^1.3.0", - "xmldom-sre": "^0.1.31" - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - } - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dev": true, - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dev": true, - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^3.8.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.1.0.tgz", - "integrity": "sha512-T4G5KMmqIk6X87gLKWyU5exPpTjLjY5KyrFWaIjv3SvgaIUGXV7UEzGEnZJdTA38/yUS6f9PlKezQ0bYXG3iIQ==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "temp-write": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", - "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "is-stream": "^1.1.0", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "ternary-stream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz", - "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==", - "dev": true, - "requires": { - "duplexify": "^3.5.0", - "fork-stream": "^0.0.4", - "merge-stream": "^1.0.0", - "through2": "^2.0.1" - }, - "dependencies": { - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==", - "dev": true - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=", - "dev": true - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=", - "dev": true - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true - }, - "ts-jest": { - "version": "26.5.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.4.tgz", - "integrity": "sha512-I5Qsddo+VTm94SukBJ4cPimOoFZsYTeElR2xy6H2TOVs+NsvgYglW8KuQgKoApOKuaU/Ix/vrF9ebFZlb5D2Pg==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } - } - }, - "ts-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.1.0.tgz", - "integrity": "sha512-YiQipGGAFj2zBfqLhp28yUvPP9jUGqHxRzrGYuc82Z2wM27YIHbElXiaZDc93c3x0mz4zvBmS6q/DgExpdj37A==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - } - } - }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", - "dev": true - }, - "tween-functions": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha1-GuOlDnxguz3vd06scHrLynO7w/8=", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true - }, - "umask": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", - "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", - "dev": true - }, - "umi": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/umi/-/umi-3.4.8.tgz", - "integrity": "sha512-PKpXqZpBl5iAADFVEosp07l5PHSjUbTcGb8h2VGoYFAE3rUj3zpsSgJjF05nKoLdpVPxBLZt7zPmmuVfXNzxfg==", - "dev": true, - "requires": { - "@umijs/bundler-webpack": "3.4.8", - "@umijs/core": "3.4.8", - "@umijs/deps": "0.8.1", - "@umijs/preset-built-in": "3.4.8", - "@umijs/runtime": "3.4.8", - "@umijs/types": "3.4.8", - "@umijs/utils": "3.4.8", - "react": "16.x", - "react-dom": "16.x", - "v8-compile-cache": "2.3.0" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "underscore": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.0.tgz", - "integrity": "sha512-sCs4H3pCytsb5K7i072FAEC9YlSYFIbosvM0tAKAlpSSUgD7yC1iXSEGdl5XrDKQ1YUB+p/HDzYrSG2H2Vl36g==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "dev": true - }, - "unist-util-filter": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-2.0.3.tgz", - "integrity": "sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-find-after": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz", - "integrity": "sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "dev": true - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "dev": true - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-notifier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.0.tgz", - "integrity": "sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg==", - "dev": true, - "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "dev": true - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "dev": true - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "dev": true - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - }, - "vizion": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", - "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", - "dev": true, - "requires": { - "async": "^2.6.3", - "git-node-fs": "^1.0.0", - "ini": "^1.3.5", - "js-git": "^0.7.8" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "dev": true - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "webpack-chain": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", - "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - }, - "dependencies": { - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true - } - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wicked-good-xpath": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", - "integrity": "sha1-gbDpXoZQ5JyUsiKY//hoa1VTz2w=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "dev": true, - "requires": { - "execa": "^1.0.0" - } - }, - "wkx": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "dev": true, - "requires": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - } - } - } - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", - "dev": true - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xmldom-sre": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", - "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "ylru": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", - "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yorkie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", - "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", - "dev": true, - "requires": { - "execa": "^0.8.0", - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "zscroller": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/zscroller/-/zscroller-0.4.8.tgz", - "integrity": "sha512-G5NiNLKx2+QhhvZi2yV1jjVXY50otktxkseX2hG2N/eixohOUk0AY8ZpbAxNqS9oJS/NxItCsowupy2tsXxAMw==", - "dev": true, - "requires": { - "babel-runtime": "6.x" - } - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 909d52d93add87f66f90843b4c5eccfff0a75929..9e74c4d709b3d5e08700b6ae92686bf6d5a09e7b 100644 --- a/package.json +++ b/package.json @@ -1,74 +1,78 @@ { - "name": "root", + "name": "nocobase", "private": true, + "workspaces": [ + "packages/*" + ], "scripts": { - "start": "cd packages/app && npm start", - "start-server": "nodemon", - "start-client": "cd packages/app && npx umi dev", + "bootstrap": "lerna bootstrap", + "clean": "lerna clean", + "examples": "ts-node-dev -r dotenv/config ./examples", + "start": "concurrently \"npm run start-server\" \"npm run start-docs\"", + "start-client": "cd packages/app && npm run start-client", + "start-server": "ts-node-dev -r dotenv/config ./packages/app/src/apis/index.ts", + "nocobase": "ts-node-dev -r dotenv/config ./packages/app/src/apis/index.ts", "start-docs": "dumi dev", "build-docs": "dumi build", - "pm2-start": "npx pm2 start packages/api/lib/index.js", - "build-app": "cd packages/app && npm run build", - "bootstrap": "lerna bootstrap --no-ci", - "build": "father-build", - "clean": "lerna clean", - "db-migrate": "ts-node -r dotenv/config ./packages/api/src/migrate.ts", + "build2": "lerna run build", + "build": "npm run build-father-build && node packages/father-build/bin/father-build.js", + "build-father-build": "cd packages/father-build && npm run build", "lint": "eslint --ext .ts,.tsx,.js \"packages/*/src/**.@(ts|tsx|js)\" --fix", - "test": "npm run lint && jest", - "debug": "node --inspect-brk node_modules/.bin/jest --runInBand", + "start-prod": "concurrently \"npx pm2-runtime start packages/api/lib/index.js\" \"cd packages/app && npm run start-client\"", + "pm2-start": "npx pm2-runtime start packages/api/lib/index.js", "version:alpha": "lerna version prerelease --preid alpha --force-publish=* --no-git-tag-version -m \"chore(versions): publish packages %s\"", + "test": "npm run lint && jest", "release:force": "lerna publish from-package --yes", "release": "lerna publish" }, - "repository": { - "type": "git", - "url": "git+https://github.com/nocobase/nocobase.git", - "branch": "master", - "platform": "github" + "resolutions": { + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0" }, "devDependencies": { - "@koa/router": "^9.3.1", - "@types/bcrypt": "^3.0.0", - "@types/jest": "^26.0.4", - "@types/koa": "^2.11.6", - "@types/koa-bodyparser": "^4.3.0", - "@types/koa-mount": "^4.0.0", - "@types/koa__router": "^8.0.2", - "@types/lodash": "^4.14.158", - "@types/node": "^14.0.23", - "@types/react": "^17.0.3", + "@types/file-saver": "^2.0.3", + "@types/jest": "^27.0.1", + "@types/koa": "^2.13.1", + "@types/koa-mount": "^4.0.1", + "@types/lodash": "^4.14.169", + "@types/mockjs": "^1.0.3", + "@types/node": "^12.6.8", + "@types/react": "^17.0.0", + "@types/react-big-calendar": "^0.33.1", "@types/react-dom": "^17.0.3", - "@types/supertest": "^2.0.10", - "@typescript-eslint/eslint-plugin": "^3.6.1", - "@typescript-eslint/parser": "^3.6.1", - "@umijs/plugin-antd": "^0.9.1", - "antd": "^4.15.0", - "cross-env": "^7.0.2", + "@typescript-eslint/eslint-plugin": "^4.9.1", + "@typescript-eslint/parser": "^4.8.2", + "@umijs/preset-react": "^1.8.24", + "antd": "^4.16.11", + "concurrently": "^6.2.1", "dotenv": "^8.2.0", - "dumi": "^1.0.12", + "dumi": "^1.1.25", "eslint": "^7.4.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-react": "^7.23.2", "eslint-plugin-standard": "^4.0.1", - "father-build": "^1.19.2", - "jest": "^26.1.0", - "koa": "^2.13.0", + "jest": "^26.6.3", "koa-bodyparser": "^4.3.0", "lerna": "^3.22.0", - "lint-staged": "^10.0.7", - "mysql2": "^2.1.0", - "nodemon": "^2.0.4", - "path-to-regexp": "^6.1.0", - "pg": "^8.3.0", + "mockjs": "^1.1.0", + "nodemailer-mock": "^1.5.11", + "nodemon": "^2.0.12", + "pg": "^8.6.0", "pg-hstore": "^2.3.3", - "pm2": "^4.5.6", - "prettier": "^1.19.1", - "sequelize": "^6.3.4", - "supertest": "^4.0.2", - "ts-jest": "^26.1.2", - "ts-node": "^8.10.2", - "typescript": "^3.9.6", - "yorkie": "^2.0.0" + "pm2": "^5.1.1", + "prettier": "^2.3.0", + "react": "^17.0.1", + "react-dom": "^17.0.2", + "react-router-dom": "^5.2.0", + "react-test-renderer": "^17.0.2", + "rimraf": "^3.0.2", + "sqlite3": "^5.0.2", + "supertest": "^6.1.3", + "ts-jest": "^26.5.6", + "ts-node": "^9.1.1", + "ts-node-dev": "^1.1.8", + "typescript": "4.1.5" } } diff --git a/packages/actions/package.json b/packages/actions/package.json index 0e23c7ace0d36d65d6479c6195adc4bc6fde851b..6ab9f9c2093ae180a5c1aabcf3a4cf798fc9c6c5 100644 --- a/packages/actions/package.json +++ b/packages/actions/package.json @@ -1,24 +1,22 @@ { "name": "@nocobase/actions", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "description": "", "license": "MIT", "main": "./lib/index.js", "types": "./lib/index.d.ts", "scripts": {}, "dependencies": { - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7" + "@nocobase/database": "^0.5.0-alpha.25", + "@nocobase/resourcer": "^0.5.0-alpha.25" }, "devDependencies": { - "koa": "^2.13.0", - "sequelize": "^6.3.4", - "typescript": "^3.9.6" + "@nocobase/test": "^0.5.0-alpha.25" }, "repository": { "type": "git", "url": "git+https://github.com/nocobase/nocobase.git", "directory": "packages/actions" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/actions/src/__tests__/actions/create1.ts b/packages/actions/src/__tests__/actions/create1.ts deleted file mode 100644 index 2ed6af4e517ca36d72d205c1b9b0062292cf7d3f..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/actions/create1.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ActionOptions } from '@nocobase/resourcer'; -import { create } from '../../actions/common'; - -export default { - values: { - meta: { - location: 'Kunming' - } - }, - - fields: { - except: ['sort', 'user.profile', 'comments.status'] - }, - - handler: create -} as unknown as ActionOptions; diff --git a/packages/actions/src/__tests__/actions/create2.ts b/packages/actions/src/__tests__/actions/create2.ts deleted file mode 100644 index 43a40300b61251ad4de2854c24d4cb30c989d8e8..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/actions/create2.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ActionOptions } from '@nocobase/resourcer'; -import { create } from '../../actions/common'; - -export default { - fields: { - only: ['title'] - }, - - handler: create -} as unknown as ActionOptions; diff --git a/packages/actions/src/__tests__/actions/list1.ts b/packages/actions/src/__tests__/actions/list1.ts deleted file mode 100644 index a5d283b28604f3ac0c8eb47576bfb56d7a38fcbc..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/actions/list1.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ActionOptions } from '@nocobase/resourcer'; -import { list } from '../../actions/common'; - -const now = new Date(); -const before7Days = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7); - -export default { - filter: { - status: 'published', - published_at: { - gte: before7Days.toISOString(), - lt: now.toISOString() - } - }, - - handler: list -} as unknown as ActionOptions; diff --git a/packages/actions/src/__tests__/actions/update1.ts b/packages/actions/src/__tests__/actions/update1.ts deleted file mode 100644 index 449978ee158a152701fb3bb8227008621707b9be..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/actions/update1.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ActionOptions } from '@nocobase/resourcer'; -import { update } from '../../actions/common'; - -export default { - values: { - meta: { - location: 'Kunming' - } - }, - - fields: { - except: ['title'] - }, - - handler: update -} as unknown as ActionOptions; diff --git a/packages/actions/src/__tests__/actions/update2.ts b/packages/actions/src/__tests__/actions/update2.ts deleted file mode 100644 index 6f3d708ccac719d658671b87bf512f57f014b552..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/actions/update2.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ActionOptions } from '@nocobase/resourcer'; -import { update } from '../../actions/common'; - -export default { - fields: { - only: ['title'] - }, - - handler: update -} as unknown as ActionOptions; diff --git a/packages/actions/src/__tests__/add.test.ts b/packages/actions/src/__tests__/add.test.ts index 063453f09c1ef639574078e0aaa722c10f2fd133..01eb5bbf2edb0afdf650ee5eab4783290d22394d 100644 --- a/packages/actions/src/__tests__/add.test.ts +++ b/packages/actions/src/__tests__/add.test.ts @@ -1,23 +1,21 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('add', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); }); - afterAll(() => db.close()); + afterEach(async () => { + return api.destroy(); + }); - it('belongsToMany1', async () => { - const [Post, Tag] = db.getModels(['posts', 'tags']); - let post = await Post.create(); - let tag1 = await Tag.create({ name: 'tag1' }); - let tag2 = await Tag.create({ name: 'tag2' }); - await agent.post(`/posts/${post.id}/tags:add/${tag1.id}`); - await agent.post(`/posts/${post.id}/tags:add/${tag2.id}`); - let [tag01, tag02] = await post.getTags(); - expect(tag01.id).toBe(tag1.id); - expect(tag02.id).toBe(tag2.id); + it('add', async () => { + }); }); diff --git a/packages/actions/src/__tests__/create.test.ts b/packages/actions/src/__tests__/create.test.ts index c8365b1443f4b36f527e655e0b38d7a8a2e35db2..edf982eeabf291e32cfd282aab836e8ed327fa6e 100644 --- a/packages/actions/src/__tests__/create.test.ts +++ b/packages/actions/src/__tests__/create.test.ts @@ -1,109 +1,65 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('create', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); }); - afterAll(() => db.close()); - - describe('single', () => { - it('create with hasMany items', async () => { - const response = await agent - .post('/posts') - .send({ - title: 'title1', - comments: [ - { content: 'content1' }, - { content: 'content2' }, - ] - }); - expect(response.body.title).toBe('title1'); + afterEach(async () => { + return api.destroy(); + }); - const createdPost = await agent.get(`/posts/${response.body.id}?fields=comments`); - expect(createdPost.body.comments.length).toBe(2); + it('create', async () => { + api.db.table({ + name: 'tests', + fields: [ + { type: 'string', name: 'name' }, + ], }); - - it('create with defaultValues by custom action', async () => { - const response = await agent - .post('/posts:create1') - .send({ - title: 'title1', - }); - expect(response.body.meta).toEqual({ location: 'Kunming' }); + await api.db.sync(); + const response = await api.resource('tests').create({ + values: { name: 'n1' }, }); + expect(response.body.name).toBe('n1'); + }); - it('create with options.fields.except by custom action', async () => { - const response = await agent - .post('/posts:create1') - .send({ - title: 'title1', - sort: 100, - user: { name: 'aaa', profile: { email: 'email' } }, - comments: [ - { content: 'comment1', status: 'published' }, - { content: 'comment2', status: 'draft' }, - ] - }); - expect(response.body.sort).toBe(1); - expect(response.body.user_id).toBe(1); - - const postWithUser = await agent - .get(`/posts/${response.body.id}?fields=user`); - expect(postWithUser.body.user.id).toBe(1); - - const user = await agent - .get(`/users/${postWithUser.body.user.id}?fields=profile`); - expect(user.body.profile).toBe(null); - - const postWithComments = await agent - .get(`/posts/${response.body.id}?fields=comments`); - const comments = postWithComments.body.comments.map(({ content, status }) => ({ content, status })); - expect(comments).toEqual([ - { content: 'comment1', status: null }, - { content: 'comment2', status: null }, - ]); + it('associations', async () => { + api.db.table({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, + ], }); - - it('create with options.fields.only by custom action', async () => { - const response = await agent - .post('/posts:create2') - .send({ - title: 'title1', - meta: { a: 1 } - }); - expect(response.body.title).toBe('title1'); - expect(response.body.meta).toBe(null); - - const result = await agent - .get(`/posts/${response.body.id}`); - - expect(result.body.title).toBe('title1'); - expect(result.body.meta).toBe(null); + api.db.table({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'hasMany', name: 'comments' }, + ], }); - }); - - describe('hasMany', () => { - it('create', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .post(`/posts/${post.id}/comments`) - .send({ - content: 'content1', - }); - expect(response.body.post_id).toBe(post.id); - expect(response.body.content).toBe('content1'); - - const comments = await agent - .get('/comments?fields=id,content'); - expect(comments.body.count).toBe(1); - expect(comments.body.rows).toEqual([{ - id: 1, - content: 'content1' - }]); + await api.db.sync(); + const [Post, Comment] = api.db.getModels(['posts', 'comments']); + const response = await api.resource('posts').create({ + values: { + title: 't1', + comments: [ + { content: 'c1' }, + { content: 'c2' }, + ] + }, + }); + expect(await Post.count()).toBe(1); + expect(await Comment.count()).toBe(2); + await api.resource('posts.comments').create({ + associatedKey: response.body.id, + values: { content: 'c1' }, }); + expect(await Comment.count()).toBe(3); }); }); diff --git a/packages/actions/src/__tests__/destroy.test.ts b/packages/actions/src/__tests__/destroy.test.ts index af85406b116c12a891312307a1e873a84ae3cc54..bad44aa08f8a0c0e3a1a6982a863c47238442a5d 100644 --- a/packages/actions/src/__tests__/destroy.test.ts +++ b/packages/actions/src/__tests__/destroy.test.ts @@ -1,148 +1,62 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('destroy', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); + api.db.table({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + api.db.table({ + name: 'comments', + fields: [{ type: 'string', name: 'content' }], + }); + await api.db.sync(); }); - afterAll(() => db.close()); - - describe('single', () => { - it('common1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .delete(`/posts/${post.id}`); - // console.log(response.body); - expect(response.body.count).toBe(1); - }); - - it('batch delete by filter', async () => { - const Post = db.getModel('posts'); - const posts = await Post.bulkCreate([ - { title: 'title1', status: 'published' }, - { title: 'title2', status: 'draft' }, - { title: 'title3', status: 'published' }, - { title: 'title4', status: 'draft' }, - ]); - - await agent - .delete('/posts?filter[status]=draft'); - - const published = await Post.findAll(); - expect(published.length).toBe(2); - expect(published.map(({ title, status }) => ({ title, status }))).toEqual([ - { title: 'title1', status: 'published' }, - { title: 'title3', status: 'published' } - ]); - }); - }); - - describe('hasOne', () => { - it('delete has-one item', async () => { - const User = db.getModel('users'); - const user = await User.create(); - await user.updateAssociations({ - profile: { - email: 'email1122', - } - }); - const response = await agent - .delete(`/users/${user.id}/profile`); - const profile = await user.getProfile(); - expect(profile).toBeNull(); - }); + afterEach(async () => { + return api.destroy(); }); - describe('hasMany', () => { - it('delete single item in has-many list', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - comments: [ - { content: 'content111222' }, - ], - }); - const [comment] = await post.getComments(); - await agent - .delete(`/posts/${post.id}/comments/${comment.id}`); - const count = await post.countComments(); - expect(count).toBe(0); - }); - - it('delete batch items in has-many list', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - comments: [ - { content: 'content1', status: 'published' }, - { content: 'content2', status: 'draft' }, - { content: 'content3', status: 'published' }, - { content: 'content4', status: 'draft' }, - ], - }); - await agent - .delete(`/posts/${post.id}/comments?filter[status]=draft`); - const comments = await post.getComments(); - expect(comments.length).toBe(2); - expect(comments.map(({ content }) => content)).toEqual(['content1', 'content3']); - }); + it('destroy', async () => { + const Post = api.db.getModel('posts'); + const post = await Post.create(); + expect( + await Post.count({ + where: { id: post.id }, + }), + ).toBe(1); + await api.resource('posts').destroy({ + resourceKey: post.id, + }); + expect( + await Post.count({ + where: { id: post.id }, + }), + ).toBe(0); }); - describe('belongsTo', () => { - it('delete belongs-to item', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - user: { name: 'name121234' }, - }); - await agent.delete(`/posts/${post.id}/user:destroy`); - const user = await post.getUser(); - expect(user).toBeNull(); + it('destroy associations', async () => { + const [Post, Comment] = api.db.getModels(['posts', 'comments']); + const post = await Post.create(); + const comment = await Comment.create(); + await post.updateAssociations({ + comments: [comment], }); - }); - - describe('belongsToMany', () => { - it('delete single target item', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - tags: [ - { name: 'tag112233' }, - ], - }); - const [tag] = await post.getTags(); - await agent - .delete(`/posts/${post.id}/tags:destroy/${tag.id}`); - const tags = await post.getTags(); - expect(tags.length).toBe(0); - - const PostsTags = db.getModel('posts_tags'); - const postsTags = await PostsTags.findAll(); - expect(postsTags.length).toBe(0); - }); - - it('delete batch target item by filter', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - tags: [ - { name: 'tag1', status: 'enabled' }, - { name: 'tag2', status: 'disabled' }, - { name: 'tag3', status: 'enabled' }, - { name: 'tag4', status: 'disabled' }, - ], - }); - await agent - .delete(`/posts/${post.id}/tags:destroy?filter[status]=disabled`); - const tags = await post.getTags(); - expect(tags.length).toBe(2); - - const PostsTags = db.getModel('posts_tags'); - const postsTags = await PostsTags.findAll(); - expect(postsTags.length).toBe(2); + await api.resource('posts.comments').destroy({ + resourceKey: comment.id, + associatedKey: post.id, }); + const comment2 = await Comment.findByPk(comment.id); + expect(comment2).toBeNull(); }); }); diff --git a/packages/actions/src/__tests__/get.test.ts b/packages/actions/src/__tests__/get.test.ts index a1bbceffb309caf5c0bef9280a4df9ad3222ed46..e8efffe31bed4952f4ead35ce547cc906a780562 100644 --- a/packages/actions/src/__tests__/get.test.ts +++ b/packages/actions/src/__tests__/get.test.ts @@ -1,91 +1,57 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('get', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); - }); - - afterAll(() => db.close()); - - it('common1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create({ - title: 'title11112222' + api = mockServer({ + dataWrapping: false, }); - const response = await agent - .get(`/posts/${post.id}`); - expect(response.body.title).toBe('title11112222'); - }); - - it('hasOne1', async () => { - const User = db.getModel('users'); - const user = await User.create(); - const response = await agent - .get(`/users/${user.id}/profile?fields=email`); - expect(response.body).toEqual({}); - }); - - it('hasOne2', async () => { - const User = db.getModel('users'); - const user = await User.create(); - await user.updateAssociations({ - profile: { - email: 'email1', - }, + registerActions(api); + api.db.table({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'hasMany', name: 'comments' }, + ], }); - const response = await agent - .get(`/users/${user.id}/profile?fields=email`); - expect(response.body).toEqual({ email: 'email1' }); - }); - - it('hasMany1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - comments: [ - { content: 'content111222' }, + api.db.table({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, ], }); - const [comment] = await post.getComments(); - const response = await agent - .get(`/posts/${post.id}/comments/${comment.id}`); - expect(response.body.post_id).toBe(post.id); - expect(response.body.content).toBe('content111222'); + await api.db.sync(); }); - it('belongsTo1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .get(`/posts/${post.id}/user?fields=name`); - expect(response.body).toEqual({}); + afterEach(async () => { + return api.destroy(); }); - it('belongsTo2', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - user: { name: 'name121234' }, + it('get', async () => { + const Post = api.db.getModel('posts'); + const post = await Post.create({ title: 't1' }); + const response = await api.resource('posts').get({ + resourceKey: post.id, + fields: ['id', 'title'] }); - const response = await agent - .get(`/posts/${post.id}/user?fields=name`); - expect(response.body).toEqual({ name: 'name121234' }); + expect(post.toJSON()).toMatchObject(response.body); }); - it('belongsToMany', async () => { - const Post = db.getModel('posts'); + it('get associations', async () => { + const [Post, Comment] = api.db.getModels(['posts', 'comments']); const post = await Post.create(); + const comment = await Comment.create({ content: 'c2' }); await post.updateAssociations({ - tags: [ - { name: 'tag112233' }, - ], + comments: [comment] + }); + const response = await api.resource('posts.comments').get({ + resourceKey: comment.id, + associatedKey: post.id, + fields: ['id', 'post_id', 'content'] }); - const [tag] = await post.getTags(); - const response = await agent - .get(`/posts/${post.id}/tags/${tag.id}?fields=name,posts.id`); - expect(response.body.posts[0].id).toBe(post.id); - expect(response.body.name).toBe('tag112233'); + const comment2 = await Comment.findByPk(comment.id); + expect(comment2.toJSON()).toMatchObject(response.body); }); }); diff --git a/packages/actions/src/__tests__/index.ts b/packages/actions/src/__tests__/index.ts deleted file mode 100644 index 1607855d07f10e77236f8f57bb927b8d557b2029..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/index.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { resolve } from 'path'; - -import glob from 'glob'; -import Koa from 'koa'; -import { Dialect } from 'sequelize'; -import bodyParser from 'koa-bodyparser'; -import supertest from 'supertest'; - -import Database, { requireModule } from '@nocobase/database'; -import Resourcer from '@nocobase/resourcer'; - -import associated from '../middlewares/associated'; -import actions from '..'; -import list1 from './actions/list1'; -import create1 from './actions/create1'; -import create2 from './actions/create2'; -import update1 from './actions/update1'; -import update2 from './actions/update2'; - -function getTestKey() { - const { id } = require.main; - const key = id - .replace(`${process.env.PWD}/packages`, '') - .replace(/src\/__tests__/g, '') - .replace('.test.ts', '') - .replace(/[^\w]/g, '_') - .replace(/_+/g, '_') - .replace(/^_|_$/g, ''); - return key -} - -const connection = { - config: { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: Number.parseInt(process.env.DB_PORT, 10), - dialect: process.env.DB_DIALECT as Dialect, - define: { - hooks: { - beforeCreate(model, options) { - - }, - }, - }, - logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, - }, - database: null, - create() { - this.database = new Database(this.config); - }, - get() { - return this.database; - } -}; - -const tableFiles = glob.sync(`${resolve(__dirname, './tables')}/*.ts`); - -// resourcer 在内存中是单例,需要谨慎使用 -export const resourcer = new Resourcer(); -resourcer.use(associated); -resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); -resourcer.define({ - name: 'posts', - actions: { - ...actions.common, - list1, - create1, - create2, - update1, - update2 - }, -}); -resourcer.define({ - name: 'comments', - actions: actions.common, -}); -resourcer.define({ - name: 'users', - actions: actions.common, -}); -resourcer.define({ - name: 'profiles', - actions: actions.common, -}); -resourcer.define({ - type: 'hasOne', - name: 'users.profile', - actions: actions.associate, -}); -resourcer.define({ - type: 'hasMany', - name: 'posts.comments', - actions: actions.associate, -}); -resourcer.define({ - type: 'hasMany', - name: 'users.posts', - actions: actions.associate, -}); -resourcer.define({ - type: 'belongsTo', - name: 'posts.user', - actions: actions.associate, -}); -resourcer.define({ - type: 'belongsToMany', - name: 'posts.tags', - actions: actions.associate, -}); - -const app = new Koa(); -app.use(async (ctx, next) => { - ctx.db = connection.get(); - await next(); -}); -app.use(bodyParser()); -app.use(resourcer.middleware()); - -// 使用 agent 可以减少部分模板代码 -export const agent = supertest.agent(app.callback()); - -export async function initDatabase() { - if (!connection.get()) { - connection.create(); - } - - const database = connection.get(); - - // 由于 jest 每个测试文件是独立 worker 进程的机制,各个进程使用的是不同的数据库连接实例,但又对应到同一个数据库。 - // 所以不同测试文件会存在表结构冲突,这里使用了基于文件唯一的 key 作为后缀区分不同进程使用的数据库表,以满足并行测试。 - const key = getTestKey(); - tableFiles.forEach(file => { - const options = requireModule(file); - database.table(typeof options === 'function' ? options(database) : { - ...options, - tableName: `${key}_${options.tableName}` - }); - }); - await database.sync({ - force: true, - }); - - return database; -} diff --git a/packages/actions/src/__tests__/list.test.ts b/packages/actions/src/__tests__/list.test.ts index 05bb99b540d92ccdf15ab224b259dcc8bbf3cb4b..85b2aee009620caf927ad1e9d3c73d9c42818f1c 100644 --- a/packages/actions/src/__tests__/list.test.ts +++ b/packages/actions/src/__tests__/list.test.ts @@ -1,626 +1,135 @@ -import { literal, Op } from 'sequelize'; - -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('list', () => { - let db; - let now: Date; - let nowString: string; - let timestamps: { created_at: Date; updated_at: Date; }; - let timestampsStrings; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); - now = new Date(); - nowString = now.toISOString() - timestamps = { created_at: now, updated_at: now }; - timestampsStrings = { created_at: nowString, updated_at: nowString }; - }); - - afterAll(() => db.close()); - - describe('common', () => { - beforeEach(async () => { - const User = db.getModel('users'); - await User.bulkCreate([ - { name: 'a', ...timestamps, nicknames: ['aa', 'aaa'] }, - { name: 'b', ...timestamps, nicknames: [] }, - { name: 'c', ...timestamps } - ]); - const users = await User.findAll(); - users[0].updateSingleAssociation('profile', { city: '1101', interest: [1] }); - users[1].updateSingleAssociation('profile', { city: '3710', interest: [1, 2] }); - users[2].updateSingleAssociation('profile', { city: '5301', interest: [] }); - - const Post = db.getModel('posts'); - await Post.bulkCreate(Array(25).fill(null).map((_, index) => ({ - title: `title${index}`, - status: index % 2 ? 'published' : 'draft', - published_at: index % 2 ? new Date(now.getFullYear(), now.getMonth(), now.getDate() - index, 0, 0, 0) : null, - user_id: users[index % users.length].id, - ...timestamps - }))); + api = mockServer({ + dataWrapping: false, }); - - describe('filter', () => { - describe('equal', () => { - it('should be filtered by `status` equal to `published`', async () => { - const Post = db.getModel('posts'); - const response = await agent.get('/posts?filter[status]=published'); - expect(response.body.count).toBe(await Post.count({ where: { status: 'published' } })); - }); - - it('should be filtered by `title` equal to `title1`', async () => { - const Post = db.getModel('posts'); - const response = await agent.get('/posts?filter[title]=title1'); - expect(response.body.count).toBe(await Post.count({ - where: { - title: 'title1', - }, - })); - }); - }); - - describe('not equal', () => { - it('filter[status][ne]=published', async () => { - const Post = db.getModel('posts'); - const drafts = (await Post.findAll({ - where: { - status: { - [Op.ne]: 'published' - } - } - })).map(item => item.get('title')); - const response = await agent.get('/posts?filter[status][ne]=published'); - expect(response.body.count).toBe(drafts.length); - expect(response.body.rows[0].title).toBe(drafts[0]); - }); - }); - - describe('null', () => { - it('filter[published_at]', async () => { - const Post = db.getModel('posts'); - const expected = await Post.findAll({ - where: { - published_at: null - } - }); - const response = await agent.get('/posts?filter[published_at]'); - expect(response.body.count).toBe(expected.length); - }); - - it('filter[published_at.is]', async () => { - const Post = db.getModel('posts'); - const expected = await Post.findAll({ - where: { - published_at: { - [Op.is]: null - } - } - }); - const response = await agent.get('/posts?filter[published_at.is]'); - expect(response.body.count).toBe(expected.length); - }); - - it('filter[published_at.not]', async () => { - const Post = db.getModel('posts'); - const expected = await Post.findAll({ - where: { - published_at: { - [Op.not]: null - } - } - }); - const response = await agent.get('/posts?filter[published_at.not]'); - expect(response.body.count).toBe(expected.length); - }); - - // TODO(bug): should use `user.is` - it('filter[user_id.is]', async () => { - const Post = db.getModel('posts'); - const expected = await Post.findAll({ - where: { - user_id: { - [Op.is]: null - } - } - }); - const response = await agent.get('/posts?filter[user_id.is]'); - expect(response.body.count).toBe(expected.length); - }); - }); - - describe('merge params with action options', () => { - it('plain key-value filter', async () => { - const response = await agent.get('/posts:list1?filter[status]=draft'); - expect(response.body.count).toBe(0); - }); - - it('date filter', async () => { - // const before1Days = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); - const before3Days = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 3); - const response = await agent.get(`/posts:list1?filter[published_at.gt]=${before3Days.toISOString()}`); - expect(response.body.count).toBe(1); - expect(response.body.rows[0].id).toBe(2); - }); - }); - - describe('custom ops', () => { - it('$null', async () => { - const Post = db.getModel('posts'); - const expected = await Post.findAll({ - where: { - published_at: null - } - }); - const response = await agent.get('/posts?filter[published_at.$null]='); - expect(response.body.count).toBe(expected.length); - }); - - describe('$anyOf', () => { - describe('single', () => { - // TODO(question): 是否应该用 in/notIn 来处理单项? - // 或者单项存值也使用 JSON 类型也可以。 - it.skip('$anyOf', async () => { - // const Profile = db.getModel('profiles'); - // const profiles = await Profile.findAll(); - const response = await agent.get('/profiles?filter[city.$anyOf]=Beijing,Weihai'); - console.log(response.body); - // expect(response.body.count).toBe(2); - }); - }); - - describe('multiple', () => { - it('$anyOf for 1 element in definition', async () => { - const User = db.getModel('users'); - const expected = await User.findOne({ - where: { - nicknames: { [Op.contains]: 'aa' } - } - }); - const response = await agent.get('/users?filter[nicknames.$anyOf][]=aa'); - expect(response.body.count).toBe(1); - expect(response.body.rows[0].name).toBe(expected.name); - }); - - it('$anyOf for all elements in definition', async () => { - const User = db.getModel('users'); - const expected = await User.findOne({ - where: { - nicknames: { - [Op.or]: [ - { [Op.contains]: 'aaa' }, - { [Op.contains]: 'aa' } - ] - } - } - }); - const response = await agent.get('/users?filter[nicknames.$anyOf]=aaa,aa'); - expect(response.body.count).toBe(1); - expect(response.body.rows[0].name).toBe(expected.name); - }); - - it('$anyOf for some element not in definition', async () => { - const User = db.getModel('users'); - const expected = await User.findOne({ - where: { - nicknames: { [Op.or]: [{ [Op.contains]: ['aaa'] }, { [Op.contains]: ['a'] }] } - } - }); - const response = await agent.get('/users?filter[nicknames.$anyOf]=aaa,a'); - expect(response.body.count).toBe(1); - expect(response.body.rows[0].name).toBe(expected.name); - }); - - it('$anyOf for no element', async () => { - const User = db.getModel('users'); - const expected = await User.findAll(); - const response = await agent.get('/users?filter={"nicknames.$anyOf":[]}'); - expect(response.body.count).toBe(expected.length); - }); - }); - }); - - describe('$allOf', () => { - it('$allOf for no element', async () => { - const response = await agent.get('/users?filter={"nicknames.$allOf":[]}'); - expect(response.body.count).toBe(3); - }); - - it('$allOf for different element', async () => { - const response = await agent.get('/users?filter[nicknames.$allOf]=a,aa'); - expect(response.body.count).toBe(0); - }); - - it('$allOf for less element', async () => { - const response = await agent.get('/users?filter[nicknames.$allOf][]=aa&fields=name,nicknames'); - expect(response.body.count).toBe(1); - expect(response.body.rows).toEqual([ - { name: 'a', nicknames: ['aa', 'aaa'] } - ]); - }); - - it('$allOf for same element', async () => { - const response = await agent.get('/users?filter[nicknames.$allOf]=aa,aaa&fields=name,nicknames'); - expect(response.body.count).toBe(1); - expect(response.body.rows).toEqual([ - { name: 'a', nicknames: ['aa', 'aaa'] } - ]); - }); - - it('$allOf for more element', async () => { - const response = await agent.get('/users?filter[nicknames.$allOf]=a,aa,aaa'); - expect(response.body.count).toBe(0); - }); - }); - - // TODO(bug): 需要 toWhere 重构和操作符函数修改 - describe.skip('$noneOf', () => { - it('$noneOf for no element', async () => { - const response = await agent.get('/users?filter={"nicknames.$noneOf":[]}'); - expect(response.body.count).toBe(3); - }); - - it('$noneOf for different element', async () => { - const User = db.getModel('users'); - const users = await User.findAll({ - where: { - [Op.not]: { - // 不使用 or 包装两个同一个 col 的条件会被转化成 and,与官方文档不符 - // WHERE NOT ("users"."nicknames" @> '"aa"' AND "users"."nicknames" @> '"a"') - [Op.or]: [ - { nicknames: { [Op.contains]: 'aa' } }, - { nicknames: { [Op.contains]: 'a' } }, - ] - } - } - }); - console.log(users); - // const response = await agent.get('/users?filter[nicknames.$noneOf]=a,aa'); - // expect(response.body.count).toBe(2); - }); - - it('$noneOf for less element', async () => { - const response = await agent.get('/users?filter[nicknames.$noneOf][]=aa&fields=name,nicknames'); - expect(response.body.count).toBe(2); - }); - - it('$noneOf for same element', async () => { - const response = await agent.get('/users?filter[nicknames.$noneOf]=aa,aaa&fields=name,nicknames'); - expect(response.body.count).toBe(2); - }); - - it('$noneOf for more element', async () => { - const response = await agent.get('/users?filter[nicknames.$noneOf]=a,aa,aaa'); - expect(response.body.count).toBe(2); - }); - }); - - describe('$match', () => { - // TODO(bug) - it.skip('$match for no element', async () => { - const response = await agent.get('/users?filter={"nicknames.$match":[]}'); - expect(response.body.count).toBe(2); - }); - - it('$match for different element', async () => { - const response = await agent.get('/users?filter[nicknames.$match]=a,aa'); - expect(response.body.count).toBe(0); - }); - - it('$match for less element', async () => { - const response = await agent.get('/users?filter[nicknames.$match][]=aa&fields=name,nicknames'); - expect(response.body.count).toBe(0); - }); - - it('$match for same element', async () => { - const response = await agent.get('/users?filter[nicknames.$match]=aa,aaa&fields=name,nicknames'); - expect(response.body.count).toBe(1); - }); - - it('$match for more element', async () => { - const response = await agent.get('/users?filter[nicknames.$match]=a,aa,aaa'); - expect(response.body.count).toBe(0); - }); - }); - }); + registerActions(api); + api.db.table({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, + { type: 'string', name: 'status', defaultValue: 'draft' }, + ], }); - - describe('page', () => { - it('default page and size(20) should be ok', async () => { - const response = await agent.get('/posts?fields=title'); - expect(response.body).toEqual({ - count: 25, - page: 1, - per_page: 20, - rows: Array(20).fill(null).map((_, index) => ({ title: `title${index}` })), - }); - }); - - it('page 1 by size(1) should be ok', async () => { - const response = await agent.get('/posts?fields=title&page=1&perPage=1'); - expect(response.body).toEqual({ - count: 25, - page: 1, - per_page: 1, - rows: [{ title: 'title0' }], - }); - }); - - it('page 2 by size(1) should be ok', async () => { - const response = await agent.get('/posts?fields=title&page=2&per_page=1'); - expect(response.body).toEqual({ - count: 25, - page: 2, - per_page: 1, - rows: [{ title: 'title1' }], - }); - }); - - it('page 1 by size(101) should be change to 100', async () => { - const response = await agent.get('/posts?fields=title&page=1&per_page=101'); - expect(response.body).toEqual({ - count: 25, - page: 1, - per_page: 100, - rows: Array(25).fill(null).map((_, index) => ({ title: `title${index}` })), - }); - }); - - it('page 2 by size(101) should be change to 100 and result is empty', async () => { - const response = await agent.get('/posts?fields=title&page=2&per_page=101'); - expect(response.body).toEqual({ - count: 25, - page: 2, - per_page: 100, - rows: [], - }); - }); - - it('default page by size(-1) should be change to 100 and result will be 25 items', async () => { - const response = await agent.get('/posts?fields=title&per_page=-1'); - expect(response.body).toEqual({ - count: 25, - page: 1, - per_page: 100, - rows: Array(25).fill(null).map((_, index) => ({ title: `title${index}` })), - }); - }); - - it('page 2 by size(-1) should be change to 100 and result is empty', async () => { - const response = await agent.get('/posts?fields=title&page=2&per_page=-1'); - expect(response.body).toEqual({ - count: 25, - page: 2, - per_page: 100, - rows: [], - }); - }); + api.db.table({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'hasMany', name: 'comments' }, + { type: 'string', name: 'status', defaultValue: 'draft' }, + ], }); - - describe('fields', () => { - it('custom field', async () => { - const response = await agent.get('/posts?fields=title&filter[customTitle]=title0'); - expect(response.body).toEqual({ - count: 1, - page: 1, - per_page: 20, - rows: [{ title: 'title0' }] - }); - }); - - it('self field and belongs to field', async () => { - const response = await agent.get('/posts?fields=title,user.name&filter[title]=title0'); - expect(response.body).toEqual({ - count: 1, - page: 1, - per_page: 20, - rows: [ - { - title: 'title0', - user: { - name: 'a' - } - } - ] - }); - }); - - // TODO(question): 当 fields 只填写了关联字段时,当前表的其他字段是否需要输出? - it.skip('only belongs to', async () => { - const response = await agent.get('/posts?fields=user&filter[title]=title0'); - expect(response.body).toEqual({ - count: 1, - rows: [ - { - title: 'title0', - user: { name: 'a' } - } - ] - }); - }); - - it('except fields', async () => { - const response = await agent.get('/posts?fields[except]=status&filter[title]=title0'); - expect(response.body.rows[0].status).toBeUndefined(); - }); - - it('only and except fields', async () => { - const response = await agent.get('/posts?fields=title&fields[except]=status&filter[title]=title0'); - expect(response.body.rows[0].status).toBeUndefined(); - expect(response.body.rows).toEqual([{ title: 'title0' }]); - }); - - it('only with belongs to fields', async () => { - const response = await agent.get('/posts?fields[only]=title&fields[only]=user.name&filter[title]=title0'); - expect(response.body.rows[0].user.name).toEqual('a'); - expect(response.body.rows).toEqual([{ title: 'title0', user: { name: 'a' } }]); - }); - - it('appends fields', async () => { - const response = await agent.get('/posts?fields[only]=title&fields[appends]=user.name&filter[title]=title0'); - expect(response.body.rows[0].user.name).toEqual('a'); - expect(response.body.rows).toEqual([{ - title: 'title0', user: { id: 1, nicknames: ['aa', 'aaa'], name: 'a', ...timestampsStrings } - }]); + await api.db.sync(); + const [Post, Comment] = api.db.getModels(['posts', 'comments']); + for (let index = 1; index < 4; index++) { + const post = await Post.create({ title: `t${index}` }); + await post.updateAssociations({ + comments: [{ content: 'c1', status: 'publish' }, { content: 'c2' }, { content: 'c3' }], }); - }); + } }); - describe('hasMany', () => { - beforeEach(async () => { - const User = db.getModel('users'); - await User.bulkCreate([ - { name: 'a' }, - { name: 'b' }, - { name: 'c' } - ]); - const users = await User.findAll(); - const Post = db.getModel('posts'); - const post = await Post.create({ user_id: users[0].id }); - await post.updateAssociations({ - comments: Array(6).fill(null).map((_, index) => ({ - content: `content${index}`, - status: index % 2 ? 'published' : 'draft', - user_id: users[index % users.length].id - })) - }); - }); + afterEach(async () => { + return api.destroy(); + }); - it('get comments of a post', async () => { - const Post = db.getModel('posts'); - const post = await Post.findByPk(1); - const response = await agent - .get(`/posts/${post.id}/comments?page=2&perPage=2&sort=content&fields=content&filter[published]=1`); - expect(response.body).toEqual({ - rows: [{ content: 'content5' }], - count: 3, - page: 2, - per_page: 2 + describe('fields', () => { + it('fields', async () => { + const response = await api.resource('posts').list({ + fields: ['title'], + filter: { + title: 't1', + }, }); - }); - - it('get comments within a post, order by comments.content', async () => { - const response = await agent - .get('/posts?fields=title,comments.content&filter[comments.status]=draft&page=1&perPage=2&sort=-comments.content'); expect(response.body).toEqual({ - rows: [{ - title: null, - comments: [{ content: 'content4' }, { content: 'content2' }, { content: 'content0' }] - }], count: 1, + rows: [{ title: 't1' }], page: 1, - per_page: 2 + per_page: 20, }); }); - it('get comments of a post, and user of each comment', async () => { - const Post = db.getModel('posts'); - const post = await Post.findByPk(1); - const response = await agent - .get(`/posts/${post.id}/comments?fields=content,user.name&filter[status]=draft&sort=-content&page=1&perPage=2`); - - expect(response.body).toEqual({ - count: 3, - page: 1, - per_page: 2, - rows: [ - { content: 'content4', user: { name: 'b' } }, - { content: 'content2', user: { name: 'c' } } - ] + it('fields#appends', async () => { + const response = await api.resource('posts').list({ + fields: { + appends: ['comments'], + }, + filter: { + title: 't1', + }, }); - }); - - // TODO(bug) - it.skip('get posts of user with comments', async () => { - const response = await agent - .get(`/users/1/posts?fields=comments.content,user.name&filter[comments.status]=draft&sort=-comments.content&page=1&perPage=2`); - - expect(response.body).toEqual({ + expect(response.body).toMatchObject({ count: 1, - page: 1, - per_page: 2, rows: [ { + title: 't1', comments: [ - { content: 'content4' }, - { content: 'content2' } + { + content: 'c1', + }, + { + content: 'c2', + }, + { + content: 'c3', + }, ], - user: { name: 'a' } - } - ] + }, + ], + page: 1, + per_page: 20, }); }); - - it('count field in hasMany', async () => { - try { - const response = await agent - .get(`/users/1?fields=name,posts_count`); - console.log(response.body); - } catch (err) { - console.error(err); - } - }); - - it('count field in hasMany', async () => { - try { - const response = await agent - .get(`/users/1/posts?fields=title,comments_count`); - console.log(response.body); - } catch (err) { - console.error(err); - } - }); }); - describe('belongsToMany', () => { - beforeEach(async () => { - const Tag = db.getModel('tags'); - const tags = await Tag.bulkCreate([ - { name: 'tag1', status: 'published' }, - { name: 'tag2', status: 'draft' }, - { name: 'tag3', status: 'published' }, - { name: 'tag4', status: 'draft' }, - { name: 'tag5', status: 'published' }, - { name: 'tag6', status: 'draft' }, - { name: 'tag7', status: 'published' }, - { name: 'tag8', status: 'published' }, - { name: 'tag9', status: 'draft' }, - { name: 'tag10', status: 'published' }, - ]); - const Post = db.getModel('posts'); - const [post1, post2] = await Post.bulkCreate([{}, {}]); - await post1.updateAssociations({ - tags: [1, 2, 3, 4, 5, 6, 7] - }); - await post2.updateAssociations({ - tags: [2, 5, 8] - }); - const User = db.getModel('users'); - const user = await User.create(); - await user.updateAssociations({ - posts: [post1] + describe('filter', () => { + it('and', async () => { + const response = await api.resource('posts').list({ + filter: { + and: [ + { title: 't1' }, + { status: 'draft' }, + ], + }, + }); + expect(response.body).toMatchObject({ + count: 1, + rows: [ + { + title: 't1', + }, + ], + page: 1, + per_page: 20 }); }); - - it('list1', async () => { - const Post = db.getModel('posts'); - const post = await Post.findByPk(1); - const response = await agent - .get(`/posts/${post.id}/tags?page=2&perPage=2&sort=-name&fields=name&filter[status]=published`); - expect(response.body).toEqual({ - rows: [{ name: 'tag3' }, { name: 'tag1' }], - count: 4, - page: 2, - per_page: 2 + it('or', async () => { + const response = await api.resource('posts').list({ + filter: { + or: [ + { title: 't1' }, + { title: 't2' }, + ], + }, + }); + expect(response.body).toMatchObject({ + count: 2, + rows: [ + { + title: 't1', + }, + { + title: 't2', + } + ], + page: 1, + per_page: 20 }); }); - - // TODO(bug): SQL 报错 - it.skip('list2', async () => { - const response = await agent - .get(`/users/1/posts?fields=tags`); - console.log(response.body); - }); }); }); diff --git a/packages/actions/src/__tests__/middleware.test.ts b/packages/actions/src/__tests__/middleware.test.ts deleted file mode 100644 index b6199822031365ad1055110787f08ae2e8344d07..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/middleware.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import actions from '..'; -import { Context } from '../actions'; -import { dataWrapping } from '../middlewares'; -import { initDatabase, agent, resourcer } from './index'; - -describe('list', () => { - let db; - - beforeAll(async () => { - resourcer.define({ - name: 'articles', - middlewares: [ - dataWrapping, - ], - actions: actions.common, - }); - db = await initDatabase(); - db.table({ - name: 'articles', - tableName: 'actions__articles', - fields: [ - { - type: 'string', - name: 'title', - }, - { - type: 'string', - name: 'status', - defaultValue: 'publish', - } - ], - scopes: { - customTitle: (title, ctx: Context) => { - return { - where: { - title: title, - }, - } - }, - } - }); - await db.sync({ - force: true, - }); - }); - - afterAll(() => db.close()); - - it('create', async () => { - const response = await agent - .post('/articles') - .send({ - title: 'title1', - }); - expect(response.body.data.title).toBe('title1'); - }); - - it('list', async () => { - const response = await agent.get('/articles?fields=title&page=1'); - expect(response.body).toEqual({ - data: [{ title: 'title1' }], - meta: { count: 1, page: 1, per_page: 20 } - }); - }); -}); diff --git a/packages/actions/src/__tests__/remove.test.ts b/packages/actions/src/__tests__/remove.test.ts index 2721e143d08033fa4404236bcff1c688d584905f..6278b833a0481d822f4008a48a34f85cbc603ea4 100644 --- a/packages/actions/src/__tests__/remove.test.ts +++ b/packages/actions/src/__tests__/remove.test.ts @@ -1,76 +1,21 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('remove', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); - }); - - afterAll(() => db.close()); - - it('hasOne1', async () => { - const User = db.getModel('users'); - const user = await User.create(); - await user.updateAssociations({ - profile: { - email: 'email1122', - } + api = mockServer({ + dataWrapping: false, }); - const response = await agent - .post(`/users/${user.id}/profile:remove`); - const profile = await user.getProfile(); - expect(profile).toBeNull(); + registerActions(api); }); - it('hasMany1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - comments: [ - { content: 'content111222' }, - ], - }); - let [comment] = await post.getComments(); - await agent - .post(`/posts/${post.id}/comments:remove/${comment.id}`); - const count = await post.countComments(); - expect(count).toBe(0); + afterEach(async () => { + return api.destroy(); }); - it('belongsTo1', async () => { - const Post = db.getModel('posts'); - let post = await Post.create(); - await post.updateAssociations({ - user: { name: 'name121234' }, - }); - await agent.post(`/posts/${post.id}/user:remove`); - post = await Post.findOne({ - where: { - id: post.id, - } - }); - const user = await post.getUser(); - expect(user).toBeNull(); - }); - - it('belongsToMany', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - tags: [ - { - name: 'tag112233', - posts_tags: { - test: 'test1', - } - }, - ], - }); - const [tag] = await post.getTags(); - await agent - .delete(`/posts/${post.id}/tags:remove/${tag.id}`); - const tags = await post.getTags(); - expect(tags.length).toBe(0); + it('remove', async () => { + }); }); diff --git a/packages/actions/src/__tests__/set.test.ts b/packages/actions/src/__tests__/set.test.ts index 695e47eea3bb0ffbc46ffe46a506ebbaff0cf682..edeedf2dc734eda24af42a5561f5d8d2a2c540ba 100644 --- a/packages/actions/src/__tests__/set.test.ts +++ b/packages/actions/src/__tests__/set.test.ts @@ -1,44 +1,21 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('set', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); }); - afterAll(() => db.close()); - - it('belongsTo1', async () => { - const Post = db.getModel('posts'); - const User = db.getModel('users'); - let post = await Post.create(); - let user = await User.create(); - await agent.post(`/posts/${post.id}/user:set/${user.id}`); - post = await Post.findOne({ - where: { - id: post.id, - } - }); - const postUser = await post.getUser(); - expect(user.id).toBe(postUser.id); + afterEach(async () => { + return api.destroy(); }); - // TODO: 关系暂不关注,先注释了 - it.skip('belongsToMany1', async () => { - const [Post, Tag] = db.getModels(['posts', 'tags']); - let post = await Post.create(); - let tag1 = await Tag.create({ name: 'tag1' }); - let tag2 = await Tag.create({ name: 'tag2' }); - await agent.post(`/posts/${post.id}/tags:set/${tag1.id}`); - // 单独跑 ok,和上面的 it 一起跑就无法获取到 - const tags = await post.getTags(); - console.log(post, tags); - expect(tag1.id).toBe(tags[0].id); - expect(await post.countTags()).toBe(1); - await agent.post(`/posts/${post.id}/tags:set/${tag2.id}`); - const [tag02] = await post.getTags(); - expect(tag2.id).toBe(tag02.id); - expect(await post.countTags()).toBe(1); + it('set', async () => { + }); }); diff --git a/packages/actions/src/__tests__/sort.test.ts b/packages/actions/src/__tests__/sort.test.ts index 058e304ee7e505dec642a7bcbe486bdd31d05e75..0180e77be67a8e99e64fcdc608bdd28897d295d8 100644 --- a/packages/actions/src/__tests__/sort.test.ts +++ b/packages/actions/src/__tests__/sort.test.ts @@ -1,302 +1,513 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; -describe('get', () => { - let db; +describe('sort', () => { - beforeEach(async () => { - db = await initDatabase(); - const User = db.getModel('users'); - const users = await User.bulkCreate(Array.from('abcdefg').map(name => ({ name }))); + describe('same scope', () => { + let api: MockServer; - const Post = db.getModel('posts'); - const posts = await Post.bulkCreate(Array(10).fill(null).map((_, i) => ({ - title: `title_${i}`, - status: i % 2 ? 'publish' : 'draft', - user_id: users[i % users.length].id - }))); - - await posts.reduce((promise, post) => promise.then(() => post.updateAssociations({ - comments: Array(post.sort % 5).fill(null).map((_, index) => ({ - content: `content_${index}`, - status: index % 2 ? 'published' : 'draft', - user_id: users[index % users.length].id - })) - })), Promise.resolve()); - }); - - afterAll(() => db.close()); - - describe('sort value initialization', () => { - it('initialization by bulkCreate', async () => { - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - order: [['id', 'ASC']] - }); - expect(posts.map(({ id, sort, sort_in_status, sort_in_user }) => ({ id, sort, sort_in_status, sort_in_user }))).toEqual([ - { id: 1, sort: 1, sort_in_status: 1, sort_in_user: 1 }, - { id: 2, sort: 2, sort_in_status: 1, sort_in_user: 1 }, - { id: 3, sort: 3, sort_in_status: 2, sort_in_user: 1 }, - { id: 4, sort: 4, sort_in_status: 2, sort_in_user: 1 }, - { id: 5, sort: 5, sort_in_status: 3, sort_in_user: 1 }, - { id: 6, sort: 6, sort_in_status: 3, sort_in_user: 1 }, - { id: 7, sort: 7, sort_in_status: 4, sort_in_user: 1 }, - { id: 8, sort: 8, sort_in_status: 4, sort_in_user: 2 }, - { id: 9, sort: 9, sort_in_status: 5, sort_in_user: 2 }, - { id: 10, sort: 10, sort_in_status: 5, sort_in_user: 2 } - ]); + beforeEach(async () => { + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); + api.db.table({ + name: 'tests', + fields: [ + { type: 'string', name: 'title' }, + { type: 'sort', name: 'sort' }, + { type: 'sort', name: 'sort2' }, + ], + }); + await api.db.sync(); + const Test = api.db.getModel('tests'); + for (let index = 1; index < 5; index++) { + await Test.create({ title: `t${index}` }); + } }); - it('initialization by updateAssociations', async () => { - const Comment = db.getModel('comments'); - const comments = await Comment.findAll({ - order: [['id', 'ASC']] - }); - expect(comments.map(({ id, sort, sort_in_status, sort_in_post }) => ({ id, sort, sort_in_status, sort_in_post }))).toEqual([ - { id: 1, sort: 1, sort_in_status: 1, sort_in_post: 1 }, - { id: 2, sort: 2, sort_in_status: 2, sort_in_post: 1 }, - { id: 3, sort: 3, sort_in_status: 1, sort_in_post: 2 }, - { id: 4, sort: 4, sort_in_status: 3, sort_in_post: 1 }, - { id: 5, sort: 5, sort_in_status: 2, sort_in_post: 2 }, - { id: 6, sort: 6, sort_in_status: 4, sort_in_post: 3 }, - { id: 7, sort: 7, sort_in_status: 5, sort_in_post: 1 }, - { id: 8, sort: 8, sort_in_status: 3, sort_in_post: 2 }, - { id: 9, sort: 9, sort_in_status: 6, sort_in_post: 3 }, - { id: 10, sort: 10, sort_in_status: 4, sort_in_post: 4 }, - { id: 11, sort: 11, sort_in_status: 7, sort_in_post: 1 }, - { id: 12, sort: 12, sort_in_status: 8, sort_in_post: 1 }, - { id: 13, sort: 13, sort_in_status: 5, sort_in_post: 2 }, - { id: 14, sort: 14, sort_in_status: 9, sort_in_post: 1 }, - { id: 15, sort: 15, sort_in_status: 6, sort_in_post: 2 }, - { id: 16, sort: 16, sort_in_status: 10, sort_in_post: 3 }, - { id: 17, sort: 17, sort_in_status: 11, sort_in_post: 1 }, - { id: 18, sort: 18, sort_in_status: 7, sort_in_post: 2 }, - { id: 19, sort: 19, sort_in_status: 12, sort_in_post: 3 }, - { id: 20, sort: 20, sort_in_status: 8, sort_in_post: 4 } - ]); + afterEach(async () => { + return api.destroy(); }); - it('sort value of append item', async () => { - const Post = db.getModel('posts'); - const post = await Post.create({ user_id: 1 }); - expect(post.sort).toBe(11); - expect(post.sort_in_status).toBe(6); - expect(post.sort_in_user).toBe(3); + it('targetId', async () => { + await api.resource('tests').sort({ + sourceId: 1, + targetId: 3, + }); + const response = await api.resource('tests').list({ + sort: ['sort'], + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't2', + sort: 1, + }, + { + title: 't3', + sort: 2, + }, + { + title: 't1', + sort: 3, + }, + { + title: 't4', + sort: 4, + } + ], + }); }); - }); - - describe('sort in whole table', () => { - it('move id=1 to position at id=2', async () => { - await agent - .post('/posts:sort/1') - .send({ - field: 'sort', - target: { id: 2 }, - }); - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - attributes: ['id', 'sort'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort: 2 }, - { id: 2, sort: 1 }, - { id: 3, sort: 3 }, - { id: 4, sort: 4 }, - { id: 5, sort: 5 }, - { id: 6, sort: 6 }, - { id: 7, sort: 7 }, - { id: 8, sort: 8 }, - { id: 9, sort: 9 }, - { id: 10, sort: 10 } - ]); + it('targetId', async () => { + await api.resource('tests').sort({ + sourceId: 3, + targetId: 1, + }); + const response = await api.resource('tests').list({ + sort: ['sort'], + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't3', + sort: 1, + }, + { + title: 't1', + sort: 2, + }, + { + title: 't2', + sort: 3, + }, + { + title: 't4', + sort: 4, + } + ], + }); }); - it('move id=2 to position at id=1', async () => { - await agent - .post('/posts:sort/2') - .send({ - field: 'sort', - target: { id: 1 }, - }); - - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - attributes: ['id', 'sort'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort: 2 }, - { id: 2, sort: 1 }, - { id: 3, sort: 3 }, - { id: 4, sort: 4 }, - { id: 5, sort: 5 }, - { id: 6, sort: 6 }, - { id: 7, sort: 7 }, - { id: 8, sort: 8 }, - { id: 9, sort: 9 }, - { id: 10, sort: 10 } - ]); + it('sortField', async () => { + await api.resource('tests').sort({ + sortField: 'sort2', + sourceId: 1, + targetId: 3, + }); + const response = await api.resource('tests').list({ + sort: ['sort2'], + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't2', + sort2: 1, + }, + { + title: 't3', + sort2: 2, + }, + { + title: 't1', + sort2: 3, + }, + { + title: 't4', + sort2: 4, + } + ], + }); }); - it('move id=1 to position at id=10', async () => { - await agent - .post('/posts:sort/1') - .send({ - field: 'sort', - target: { id: 10 }, - }); - - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - attributes: ['id', 'sort'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort: 10 }, - { id: 2, sort: 1 }, - { id: 3, sort: 2 }, - { id: 4, sort: 3 }, - { id: 5, sort: 4 }, - { id: 6, sort: 5 }, - { id: 7, sort: 6 }, - { id: 8, sort: 7 }, - { id: 9, sort: 8 }, - { id: 10, sort: 9 } - ]); + it('sticky', async () => { + await api.resource('tests').sort({ + sourceId: 3, + sticky: true, + }); + const response = await api.resource('tests').list({ + sort: ['sort'], + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't3', + sort: 0, + }, + { + title: 't1', + sort: 1, + }, + { + title: 't2', + sort: 2, + }, + { + title: 't4', + sort: 4, + } + ], + }); }); }); - describe('sort in filtered scope', () => { - it('move id=2 to position at id=8 (same scope value)', async () => { - await agent - .post('/posts:sort/2') - .send({ - field: 'sort_in_status', - target: { id: 8 }, - }); + describe('different scope', () => { + let api: MockServer; - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - where: { - status: 'publish' - }, - attributes: ['id', 'sort_in_status'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 2, sort_in_status: 4 }, - { id: 4, sort_in_status: 1 }, - { id: 6, sort_in_status: 2 }, - { id: 8, sort_in_status: 3 }, - { id: 10, sort_in_status: 5 } - ]); + beforeEach(async () => { + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); + api.db.table({ + name: 'tests', + fields: [ + { type: 'string', name: 'title' }, + { type: 'integer', name: 'state' }, + { type: 'sort', name: 'sort', scope: ['state'] }, + ], + }); + await api.db.sync(); + const Test = api.db.getModel('tests'); + for (let index = 1; index < 5; index++) { + await Test.create({ title: `t1${index}`, state: 1 }); + } + for (let index = 1; index < 5; index++) { + await Test.create({ title: `t2${index}`, state: 2 }); + } }); - it('move id=1 to position at id=8 (different scope value)', async () => { - await agent - .post('/posts:sort/1') - .send({ - field: 'sort_in_status', - target: { id: 8 }, - }); + afterEach(async () => { + return api.destroy(); + }); - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - where: { - status: 'publish' - }, - attributes: ['id', 'sort_in_status'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort_in_status: 4 }, - { id: 2, sort_in_status: 1 }, - { id: 4, sort_in_status: 2 }, - { id: 6, sort_in_status: 3 }, - { id: 8, sort_in_status: 5 }, - { id: 10, sort_in_status: 6 } - ]); + it('targetId/1->6', async () => { + await api.resource('tests').sort({ + sourceId: 1, + targetId: 6, + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't12', + sort: 2, + }, + { + title: 't13', + sort: 3, + }, + { + title: 't14', + sort: 4, + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't21', + sort: 1, + }, + { + title: 't11', + sort: 2, + }, + { + title: 't22', + sort: 3, + }, + { + title: 't23', + sort: 4, + }, + { + title: 't24', + sort: 5, + }, + ], + }); }); - it('move id=1 to new empty list of scope', async () => { - await agent - .post('/posts:sort/1') - .send({ - field: 'sort_in_status', - target: { status: 'archived' }, - }); + it('targetId/1->6 - method=insertAfter', async () => { + await api.resource('tests').sort({ + sourceId: 1, + targetId: 6, + method: 'insertAfter', + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't12', + sort: 2, + }, + { + title: 't13', + sort: 3, + }, + { + title: 't14', + sort: 4, + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't21', + sort: 1, + }, + { + title: 't22', + sort: 2, + }, + { + title: 't11', + sort: 3, + }, + { + title: 't23', + sort: 4, + }, + { + title: 't24', + sort: 5, + }, + ], + }); + }); - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - attributes: ['id', 'sort_in_status'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort_in_status: 1 }, - { id: 2, sort_in_status: 1 }, - { id: 3, sort_in_status: 2 }, - { id: 4, sort_in_status: 2 }, - { id: 5, sort_in_status: 3 }, - { id: 6, sort_in_status: 3 }, - { id: 7, sort_in_status: 4 }, - { id: 8, sort_in_status: 4 }, - { id: 9, sort_in_status: 5 }, - { id: 10, sort_in_status: 5 } - ]); + it('targetId/6->2', async () => { + await api.resource('tests').sort({ + sourceId: 6, + targetId: 2, + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't11', + sort: 1, + }, + { + title: 't22', + sort: 2, + }, + { + title: 't12', + sort: 3, + }, + { + title: 't13', + sort: 4, + }, + { + title: 't14', + sort: 5, + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't21', + sort: 1, + }, + { + title: 't23', + sort: 3, + }, + { + title: 't24', + sort: 4, + }, + ], + }); }); - it('move id=1 to scope without target primary key', async () => { - await agent - .post('/posts:sort/1') - .send({ - field: 'sort_in_status', - target: { status: 'publish' }, - }); + it('targetId/6->2 - method=insertAfter', async () => { + await api.resource('tests').sort({ + sourceId: 6, + targetId: 2, + method: 'insertAfter', + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't11', + sort: 1, + }, + { + title: 't12', + sort: 2, + }, + { + title: 't22', + sort: 3, + }, + { + title: 't13', + sort: 4, + }, + { + title: 't14', + sort: 5, + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't21', + sort: 1, + }, + { + title: 't23', + sort: 3, + }, + { + title: 't24', + sort: 4, + }, + ], + }); + }); - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - where: { - status: 'publish' + it('targetScope', async () => { + await api.resource('tests').sort({ + sourceId: 1, + targetScope: { + state: 2, }, - attributes: ['id', 'sort_in_status'], - order: [['id', 'ASC']] - }); - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort_in_status: 6 }, - { id: 2, sort_in_status: 1 }, - { id: 4, sort_in_status: 2 }, - { id: 6, sort_in_status: 3 }, - { id: 8, sort_in_status: 4 }, - { id: 10, sort_in_status: 5 } - ]); + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't12', + sort: 2, + }, + { + title: 't13', + sort: 3, + }, + { + title: 't14', + sort: 4, + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't21', + sort: 1, + }, + { + title: 't22', + sort: 2, + }, + { + title: 't23', + sort: 3, + }, + { + title: 't24', + sort: 4, + }, + { + title: 't11', + sort: 5, + }, + ], + }); }); - }); - describe('associations', () => { - describe('hasMany', () => { - it('move id=1 to position at id=3 (different scope value)', async () => { - await agent - .post('/users/1/posts:sort/1') - .send({ - field: 'sort_in_user', - target: { id: 3 }, - }); - - const Post = db.getModel('posts'); - const posts = await Post.findAll({ - where: { - user_id: 3 - }, - attributes: ['id', 'sort_in_user'], - order: [['id', 'ASC']] - }); - - expect(posts.map(item => item.get())).toEqual([ - { id: 1, sort_in_user: 1 }, - { id: 3, sort_in_user: 2 }, - { id: 10, sort_in_user: 3 }, - ]); + it('targetScope - method=prepend', async () => { + await api.resource('tests').sort({ + sourceId: 1, + targetScope: { + state: 2, + }, + method: 'prepend', + }); + let response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 1 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't12', + }, + { + title: 't13', + }, + { + title: 't14', + }, + ], + }); + response = await api.resource('tests').list({ + sort: ['sort'], + filter: { state: 2 }, + }); + expect(response.body).toMatchObject({ + rows: [ + { + title: 't11', + }, + { + title: 't21', + }, + { + title: 't22', + }, + { + title: 't23', + }, + { + title: 't24', + }, + ], }); }); }); diff --git a/packages/actions/src/__tests__/tables/comments.ts b/packages/actions/src/__tests__/tables/comments.ts deleted file mode 100644 index 9497b187a64329cd2e3a9f75456fc882d543ae84..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/comments.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'comments', - tableName: 'actions__comments', - fields: [ - { - type: 'string', - name: 'content', - }, - { - type: 'string', - name: 'status', - }, - { - type: 'belongsTo', - name: 'post', - }, - { - type: 'belongsTo', - name: 'user', - }, - { - type: 'sort', - name: 'sort' - }, - { - type: 'sort', - name: 'sort_in_status', - scope: ['status'] - }, - { - type: 'sort', - name: 'sort_in_post', - scope: ['post'] - } - ], - scopes: { - published: { - where: { - status: 'published' - } - } - } -} as TableOptions; diff --git a/packages/actions/src/__tests__/tables/posts.ts b/packages/actions/src/__tests__/tables/posts.ts deleted file mode 100644 index 2f9462ca8cc60b4c0be88030a36199b31ff34327..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/posts.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'posts', - tableName: 'actions__posts', - fields: [ - { - type: 'string', - name: 'title', - }, - { - type: 'string', - name: 'status', - defaultValue: 'publish', - }, - { - type: 'date', - name: 'published_at' - }, - { - type: 'belongsTo', - name: 'user', - }, - { - type: 'hasMany', - name: 'comments', - }, - { - type: 'belongsToMany', - name: 'tags', - }, - { - type: 'sort', - name: 'sort' - }, - { - type: 'sort', - name: 'sort_in_status', - scope: ['status'] - }, - { - type: 'sort', - name: 'sort_in_user', - scope: ['user'] - }, - { - type: 'json', - name: 'meta' - } - ], - scopes: { - customTitle: (title, ctx) => { - return { - where: { - title: title, - }, - } - } - } -} as TableOptions; diff --git a/packages/actions/src/__tests__/tables/posts_tags.ts b/packages/actions/src/__tests__/tables/posts_tags.ts deleted file mode 100644 index 039ddcda11666519a499f8f69e16a79b41b37e0d..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/posts_tags.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'posts_tags', - tableName: 'actions__posts_tags', - fields: [ - { - type: 'string', - name: 'test', - }, - ], -} as TableOptions; diff --git a/packages/actions/src/__tests__/tables/profiles.ts b/packages/actions/src/__tests__/tables/profiles.ts deleted file mode 100644 index be1e6e6167a5e4a27cf99c5e7d883f50aff73f63..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/profiles.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'profiles', - tableName: 'actions__profiles', - fields: [ - { - type: 'belongsTo', - name: 'user' - }, - { - type: 'string', - name: 'email', - }, - { - type: 'string', - name: 'city', - dataSource: [ - { value: '1101', title: 'Beijing' }, - { value: '3710', title: 'Weihai' }, - { value: '5301', title: 'Kunming' } - ] - }, - { - type: 'jsonb', - name: 'interest', - defaultValue: [], - multiple: true, - dataSource: [ - { value: 1, title: 'running' }, - { value: 2, title: 'climbing' }, - { value: 3, title: 'fishing' }, - ] - } - ], -} as TableOptions; diff --git a/packages/actions/src/__tests__/tables/tags.ts b/packages/actions/src/__tests__/tables/tags.ts deleted file mode 100644 index 63368e711523ee3fa8b050a2b4944984746ed821..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/tags.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'tags', - tableName: 'actions__tags', - fields: [ - { - type: 'string', - name: 'name', - }, - { - type: 'string', - name: 'status', - }, - { - type: 'belongsToMany', - name: 'posts', - }, - ], - scopes: { - published: { - where: { - status: 'published' - } - } - } -} as TableOptions; diff --git a/packages/actions/src/__tests__/tables/users.ts b/packages/actions/src/__tests__/tables/users.ts deleted file mode 100644 index 5ded5bc7b2deacfc43721193d9df0a63f947252f..0000000000000000000000000000000000000000 --- a/packages/actions/src/__tests__/tables/users.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'users', - tableName: 'actions__users', - fields: [ - { - type: 'string', - name: 'name', - }, - { - type: 'jsonb', - name: 'nicknames', - defaultValue: [] - }, - { - type: 'hasOne', - name: 'profile', - }, - { - type: 'hasMany', - name: 'posts' - } - ], -} as TableOptions; diff --git a/packages/actions/src/__tests__/toggle.test.ts b/packages/actions/src/__tests__/toggle.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..aca90f665bc804f91843add8f0a9811ab79b31c0 --- /dev/null +++ b/packages/actions/src/__tests__/toggle.test.ts @@ -0,0 +1,21 @@ +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; + +describe('toggle', () => { + let api: MockServer; + + beforeEach(async () => { + api = mockServer({ + dataWrapping: false, + }); + registerActions(api); + }); + + afterEach(async () => { + return api.destroy(); + }); + + it('toggle', async () => { + + }); +}); diff --git a/packages/actions/src/__tests__/update.test.ts b/packages/actions/src/__tests__/update.test.ts index aa03874caa2e7c5a0a708b9f07069a9146bb1154..e1723915c44c372bc8ab392c4273551268432579 100644 --- a/packages/actions/src/__tests__/update.test.ts +++ b/packages/actions/src/__tests__/update.test.ts @@ -1,192 +1,66 @@ -import { initDatabase, agent } from './index'; +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '..'; describe('update', () => { - let db; + let api: MockServer; beforeEach(async () => { - db = await initDatabase(); - }); - - afterAll(() => db.close()); - - describe('common', () => { - it('basic', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .put(`/posts/${post.id}`).send({ - title: 'title11112222' - }); - expect(response.body.title).toBe('title11112222'); - }); - - it('update json field by replacing', async () => { - const Post = db.getModel('posts'); - const post = await Post.create({ meta: { a: 1, b: 'c', c: { d: false } } }); - const updated = await agent - .put(`/posts/${post.id}`).send({ - meta: {} - }); - expect(updated.body.meta).toEqual({}); - }); - - it.skip('update json field by path based update', async () => { - const Post = db.getModel('posts'); - const post = await Post.create({ meta: { a: 1, b: 'c', c: { d: false } } }); - const updated = await agent - .put(`/posts/${post.id}?options[json]=merge`).send({ - meta: { - b: 'b', - c: { d: true } - } - }); - // console.log(updated.body); - }); - - // TODO(question): json 字段的覆盖/合并策略 - it.skip('update with fields overwrite default values', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .put(`/posts:update1/${post.id}`).send({ - meta: { a: 1 }, - }); - expect(response.body.meta).toEqual({ a: 1 }); - - const result = await agent - .get(`/posts/${post.id}`); - - expect(result.body.meta).toEqual({ a: 1 }); - }); - - // TODO(bug): action 的默认值处理时机不对 - it.skip('update with different fields to default values', async () => { - const Post = db.getModel('posts'); - const post = await Post.create({ - meta: { location: 'Beijing' } - }); - const response = await agent - .put(`/posts:update1/${post.id}`).send({ - meta: { a: 1 }, - }); - expect(response.body.meta).toEqual({ location: 'Beijing', a: 1 }); - }); - - it('update with options.fields.expect in action', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .put(`/posts:update1/${post.id}`).send({ - title: 'title11112222', - }); - expect(response.body.title).toBe(null); - expect(response.body.meta).toEqual({ - location: 'Kunming' - }); - - const result = await agent - .get(`/posts/${post.id}`); - - expect(result.body.title).toBe(null); - expect(result.body.meta).toEqual({ - location: 'Kunming' - }); + api = mockServer({ + dataWrapping: false, }); - - it('update with options.fields.only in action', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - const response = await agent - .put(`/posts:update2/${post.id}`).send({ - title: 'title11112222', - meta: { a: 1 } - }); - expect(response.body.title).toBe('title11112222'); - expect(response.body.meta).toBe(null); - - const result = await agent - .get(`/posts/${post.id}`); - - expect(result.body.title).toBe('title11112222'); - expect(result.body.meta).toBe(null); + registerActions(api); + api.db.table({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'hasMany', name: 'comments' }, + ], }); - }); - - it('hasOne', async () => { - const User = db.getModel('users'); - const user = await User.create(); - await user.updateAssociations({ - profile: { email: 'email1122' } + api.db.table({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, + ], }); - const response = await agent - .put(`/users/${user.id}/profile`).send({ - email: 'email1111', - }); - expect(response.body.email).toEqual('email1111'); + await api.db.sync(); }); - it('hasOne without exist target', async () => { - const User = db.getModel('users'); - const user = await User.create(); - const response = await agent - .put(`/users/${user.id}/profile`).send({ - email: 'email1122', - }); - expect(response.body).toEqual({}); + afterEach(async () => { + return api.destroy(); }); - it('hasMany1', async () => { - const Post = db.getModel('posts'); + it('update', async () => { + const Post = api.db.getModel('posts'); const post = await Post.create(); - await post.updateAssociations({ - comments: [ - { content: 'content111222' }, - ], + await api.resource('posts').update({ + resourceKey: post.id, + values: { + title: 't1', + }, }); - const [comment] = await post.getComments(); - const response = await agent - .put(`/posts/${post.id}/comments/${comment.id}`).send({ content: 'content111222333' }); - expect(response.body.post_id).toBe(post.id); - expect(response.body.content).toBe('content111222333'); - }); - - it('belongsTo1', async () => { - const Post = db.getModel('posts'); - const post = await Post.create(); - await post.updateAssociations({ - user: { name: 'name121234' }, + const post2 = await Post.findByPk(post.id); + expect(post2.toJSON()).toMatchObject({ + title: 't1', }); - const response = await agent - .post(`/posts/${post.id}/user:update`).send({ name: 'name1212345' }); - expect(response.body.name).toEqual('name1212345'); }); - it('belongsToMany', async () => { - const Post = db.getModel('posts'); + it('update associations', async () => { + const [Post, Comment] = api.db.getModels(['posts', 'comments']); const post = await Post.create(); + const comment = await Comment.create(); await post.updateAssociations({ - tags: [ - { name: 'tag112233' }, - ], + comments: [comment] + }); + await api.resource('posts.comments').update({ + resourceKey: comment.id, + associatedKey: post.id, + values: { + content: 'c2', + }, + }); + const comment2 = await Comment.findByPk(comment.id); + expect(comment2.toJSON()).toMatchObject({ + content: 'c2', }); - const [tag] = await post.getTags(); - let response = await agent - .post(`/posts/${post.id}/tags:update/${tag.id}`).send({ - name: 'tag11223344', - posts_tags: { - test: 'test1', - }, - }); - const [tag1] = await post.getTags(); - expect(tag1.posts_tags.test).toBe('test1'); - expect(response.body.name).toBe('tag11223344'); - response = await agent - .post(`/posts/${post.id}/tags:update/${tag.id}`).send({ - posts_tags: { - test: 'test112233', - }, - }); - const [tag2] = await post.getTags(); - expect(tag2.posts_tags.test).toBe('test112233'); }); }); diff --git a/packages/actions/src/__tests__/utils.test.ts b/packages/actions/src/__tests__/utils.test.ts index 298fe7441c98f19c5d81ed1930318641ef530e8d..b001b63174cc3978095cac1c2fcd32eb6e82250f 100644 --- a/packages/actions/src/__tests__/utils.test.ts +++ b/packages/actions/src/__tests__/utils.test.ts @@ -1,4 +1,3 @@ -import { initDatabase, agent } from './index'; import { filterByFields } from '../utils'; describe('utils', () => { diff --git a/packages/actions/src/actions/add.ts b/packages/actions/src/actions/add.ts new file mode 100644 index 0000000000000000000000000000000000000000..4debcceceabc5c6f7a4e97f6d6ba5973b98981d0 --- /dev/null +++ b/packages/actions/src/actions/add.ts @@ -0,0 +1,48 @@ +import { Context, Next } from '..'; +import { + Model, + Relation, +} from '@nocobase/database'; + +/** + * 附加关联 + * + * BlongsToMany + * + * @param ctx + * @param next + */ +export async function add(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + } = ctx.action.params as { + associated: Model, + associatedName: string, + resourceField: Relation, + values: any, + }; + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const { add: addAccessor } = resourceField.getAccessors(); + const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + // const options = TargetModel.parseApiJson({ + // fields, + // }); + const model = await TargetModel.findOne({ + // ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + // @ts-ignore + context: ctx, + }); + ctx.body = await associated[addAccessor](model); + await next(); +} + +export default add; diff --git a/packages/actions/src/actions/associate.ts b/packages/actions/src/actions/associate.ts deleted file mode 100644 index 1bbdf6ad8d825d1b0001026707799b0690d6b099..0000000000000000000000000000000000000000 --- a/packages/actions/src/actions/associate.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { Context, Next } from '.'; -import { list, get, create, update, destroy } from './common'; -import { - Model, - Relation, - HASONE, - BELONGSTO, - BELONGSTOMANY, - HASMANY, -} from '@nocobase/database'; - -/** - * 建立关联 - * - * BlongsTo - * BlongsToMany - * - * @param ctx - * @param next - */ -export async function set(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - } = ctx.action.params as { - associated: Model, - associatedName: string, - resourceField: Relation, - values: any, - }; - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const { set: setAccessor } = resourceField.getAccessors(); - const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - // const options = TargetModel.parseApiJson({ - // fields, - // }); - const model = await TargetModel.findOne({ - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - // @ts-ignore - context: ctx, - }); - ctx.body = await associated[setAccessor](model); - await next(); -} - -/** - * 附加关联 - * - * BlongsToMany - * - * @param ctx - * @param next - */ -export async function add(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - } = ctx.action.params as { - associated: Model, - associatedName: string, - resourceField: Relation, - values: any, - }; - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const { add: addAccessor } = resourceField.getAccessors(); - const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - // const options = TargetModel.parseApiJson({ - // fields, - // }); - const model = await TargetModel.findOne({ - // ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - // @ts-ignore - context: ctx, - }); - ctx.body = await associated[addAccessor](model); - await next(); -} - -/** - * 删除关联 - * - * BlongsTo - * BlongsToMany - * - * @param ctx - * @param next - */ -export async function remove(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - } = ctx.action.params as { - associated: Model, - associatedName: string, - resourceField: Relation, - values: any, - }; - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const { get: getAccessor, remove: removeAccessor, set: setAccessor } = resourceField.getAccessors(); - const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - const options = TargetModel.parseApiJson({ - fields, - }); - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - ctx.body = await associated[setAccessor](null); - } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { - const [model]: Model[] = await associated[getAccessor]({ - ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - context: ctx, - }); - await associated[removeAccessor](model); - ctx.body = { id: model.id }; - } - await next(); -} - -export async function toggle(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - } = ctx.action.params as { - associated: Model, - associatedName: string, - resourceField: Relation, - values: any, - }; - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const { get: getAccessor, remove: removeAccessor, set: setAccessor, add: addAccessor } = resourceField.getAccessors(); - const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - const options = TargetModel.parseApiJson({ - fields, - }); - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - const m1 = await associated[getAccessor](); - if (m1 && m1[resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute] == resourceKey) { - ctx.body = await associated[setAccessor](null); - } else { - const m2 = await TargetModel.findOne({ - // ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - // @ts-ignore - context: ctx, - }); - ctx.body = await associated[setAccessor](m2); - } - } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { - const [model]: Model[] = await associated[getAccessor]({ - ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - context: ctx, - }); - if (model) { - ctx.body = await associated[removeAccessor](model); - } else { - const m2 = await TargetModel.findOne({ - // ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - // @ts-ignore - context: ctx, - }); - ctx.body = await associated[addAccessor](m2); - } - } - await next(); -} - -export default { - list, // hasMany、belongsToMany - get, // 所有关系都有 - create, // hasMany - update, // hasOne, hasMany, blongsToMany 中间表的数据更新 - destroy, // 所有情况 - set, // belongsTo、blongsToMany - add, // blongsToMany - remove, // belongsTo、blongsToMany - toggle, // blongsToMany -} diff --git a/packages/actions/src/actions/common.ts b/packages/actions/src/actions/common.ts deleted file mode 100644 index d5afaf2d118a11bdbcce8830cf54578225fa14e9..0000000000000000000000000000000000000000 --- a/packages/actions/src/actions/common.ts +++ /dev/null @@ -1,655 +0,0 @@ -import { Utils, Op, Sequelize } from 'sequelize'; -import _ from 'lodash'; -import { Context, Next } from '.'; -import { - Model, - HASONE, - HASMANY, - BELONGSTO, - BELONGSTOMANY, - whereCompare -} from '@nocobase/database'; -import { PageParameter } from '@nocobase/resourcer'; -import { filterByFields } from '../utils'; - -async function hasManyGet(instances, options: any = {}) { - const where = {}; - - let Model = this.target; - Model = Model.database.getModel(Model.name); - - let instance; - let values; - - if (!Array.isArray(instances)) { - instance = instances; - instances = undefined; - } - - options = { ...options }; - - if (this.scope) { - Object.assign(where, this.scope); - } - - if (instances) { - values = instances.map(_instance => _instance.get(this.sourceKey, { raw: true })); - - if (options.limit && instances.length > 1) { - options.groupedLimit = { - limit: options.limit, - on: this, // association - values - }; - - delete options.limit; - } else { - where[this.foreignKey] = { - [Op.in]: values - }; - delete options.groupedLimit; - } - } else { - where[this.foreignKey] = instance.get(this.sourceKey, { raw: true }); - } - - options.where = options.where ? - { [Op.and]: [where, options.where] } : - where; - - if (Object.prototype.hasOwnProperty.call(options, 'scope')) { - if (!options.scope) { - Model = Model.unscoped(); - } else { - Model = Model.scope(options.scope); - } - } - - if (Object.prototype.hasOwnProperty.call(options, 'schema')) { - Model = Model.schema(options.schema, options.schemaDelimiter); - } - - const results = await Model.findAndCountAll(options); - if (instance) return results; - - const result = {}; - for (const _instance of instances) { - result[_instance.get(this.sourceKey, { raw: true })] = []; - } - - for (const _instance of results) { - result[_instance.get(this.foreignKey, { raw: true })].push(_instance); - } - - return result; -} - -async function belongsToManyGet(instance, options) { - options = Utils.cloneDeep(options) || {}; - - const through = this.through; - let scopeWhere; - let throughWhere; - - if (this.scope) { - scopeWhere = { ...this.scope }; - } - - options.where = { - [Op.and]: [ - scopeWhere, - options.where - ] - }; - - if (Object(through.model) === through.model) { - throughWhere = {}; - throughWhere[this.foreignKey] = instance.get(this.sourceKey); - - if (through.scope) { - Object.assign(throughWhere, through.scope); - } - - //If a user pass a where on the options through options, make an "and" with the current throughWhere - if (options.through && options.through.where) { - throughWhere = { - [Op.and]: [throughWhere, options.through.where] - }; - } - - options.include = options.include || []; - options.include.push({ - association: this.oneFromTarget, - attributes: options.joinTableAttributes, - required: true, - paranoid: _.get(options.through, 'paranoid', true), - where: throughWhere - }); - } - - let model = this.target; - if (Object.prototype.hasOwnProperty.call(options, 'scope')) { - if (!options.scope) { - model = model.unscoped(); - } else { - model = model.scope(options.scope); - } - } - - if (Object.prototype.hasOwnProperty.call(options, 'schema')) { - model = model.schema(options.schema, options.schemaDelimiter); - } - - return model.findAndCountAll(options); -} - - -/** - * 查询数据列表 - * - * - Signle - * - HasMany - * - BelongsToMany - * - * HasOne 和 belongsTo 不涉及到 list - * - * @param ctx - * @param next - */ -export async function list(ctx: Context, next: Next) { - const { - page = PageParameter.DEFAULT_PAGE, - perPage = PageParameter.DEFAULT_PER_PAGE, - sort = [], - fields = [], - filter = {}, - associated, - associatedName, - resourceName, - resourceField, - } = ctx.action.params; - let data = {}; - let options: any = {}; - let Model; - if (associated && resourceField) { - const AssociatedModel = ctx.db.getModel(associatedName); - Model = ctx.db.getModel(resourceField.options.target); - options = Model.parseApiJson({ - sort, - page, - perPage, - filter, - fields, - context: ctx, - }); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - // const getAccessor = resourceField.getAccessors().get; - // const countAccessor = resourceField.getAccessors().count; - options.scope = options.scopes || []; - const association = AssociatedModel.associations[resourceField.options.name]; - if (resourceField instanceof BELONGSTOMANY) { - data = await belongsToManyGet.call(association, associated, { - joinTableAttributes: [], - ...options, - context: ctx, - }); - } - if (resourceField instanceof HASMANY) { - data = await hasManyGet.call(association, associated, { - joinTableAttributes: [], - ...options, - context: ctx, - }); - } - } else { - Model = ctx.db.getModel(resourceName); - options = Model.parseApiJson({ - sort, - page, - perPage, - filter, - fields, - context: ctx, - }); - data = await Model.scope(options.scopes || []).findAndCountAll({ - ...options, - // @ts-ignore hooks 里添加 context - context: ctx, - }); - } - if (options.limit || typeof options.offset !== 'undefined') { - // Math.round 避免精度问题 - data['page'] = Math.round((options.offset || 0) / options.limit + 1); - data[Utils.underscoredIf('perPage', Model.options.underscored)] = options.limit; - } - ctx.body = data; - await next(); -} - -/** - * 新增数据 - * - * Signle - * HasMany - * - * resource action 层面一般不开放 HasOne、BelongsTo、BelongsToMany 的新增数据操作 - * 如果需要这类操作建议使用 model.updateAssociations 方法 - * - * TODO 字段验证 - * - * @param ctx - * @param next - */ -export async function create(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - resourceName, - values: data, - fields - } = ctx.action.params; - const values = filterByFields(data, fields); - const transaction = await ctx.db.sequelize.transaction(); - const options = { transaction, context: ctx }; - let model: Model; - if (associated && resourceField) { - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const { create } = resourceField.getAccessors(); - model = await associated[create](values, options); - } else { - const ResourceModel = ctx.db.getModel(resourceName); - model = await ResourceModel.create(values, options); - } - await model.updateAssociations(values, options); - await transaction.commit(); - ctx.body = model; - await next(); -} - -/** - * 查询数据详情 - * - * @param ctx - * @param next - */ -export async function get(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - resourceName, - resourceKey, - resourceKeyAttribute, - fields = [] - } = ctx.action.params; - if (associated && resourceField) { - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - throw new Error(`${associatedName} associated model invalid`); - } - const getAccessor = resourceField.getAccessors().get; - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - const options = TargetModel.parseApiJson({ - fields, - }); - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - let model: Model = await associated[getAccessor]({ context: ctx }); - if (model) { - model = await TargetModel.findOne({ - ...options, - context: ctx, - where: { - [TargetModel.primaryKeyAttribute]: model[TargetModel.primaryKeyAttribute], - }, - }); - } - ctx.body = model; - } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { - const [model]: Model[] = await associated[getAccessor]({ - ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - }, - context: ctx, - }); - ctx.body = model; - } - } else { - const Model = ctx.db.getModel(resourceName); - const options = Model.parseApiJson({ - fields, - }); - const data = await Model.findOne({ - ...options, - where: { - [resourceKeyAttribute || Model.primaryKeyAttribute]: resourceKey, - }, - // @ts-ignore hooks 里添加 context - context: ctx, - }); - ctx.body = data; - } - await next(); -} - -/** - * 更新数据 - * - * TODO 字段验证 - * - * @param ctx - * @param next - */ -export async function update(ctx: Context, next: Next) { - const { - associated, - associatedName, - resourceField, - resourceName, - resourceKey, - // TODO(question): 这个属性从哪设置的? - resourceKeyAttribute, - fields, - values: data - } = ctx.action.params; - const values = filterByFields(data, fields); - const transaction = await ctx.db.sequelize.transaction(); - const options = { transaction, context: ctx }; - if (associated && resourceField) { - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - await transaction.rollback(); - throw new Error(`${associatedName} associated model invalid`); - } - const { get: getAccessor } = resourceField.getAccessors(); - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - let model: Model = await associated[getAccessor](options); - if (model) { - // @ts-ignore - await model.update(values, options); - await model.updateAssociations(values, options); - ctx.body = model; - } - } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - const [model]: Model[] = await associated[getAccessor]({ - ...options, - where: { - [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, - } - }); - - if (resourceField instanceof BELONGSTOMANY) { - const throughName = resourceField.getThroughName(); - if (typeof values[throughName] === 'object') { - const ThroughModel = resourceField.getThroughModel(); - const throughValues = values[throughName]; - const { foreignKey, sourceKey, otherKey } = resourceField.options; - const through = await ThroughModel.findOne({ - where: { - [foreignKey]: associated[sourceKey], - [otherKey]: resourceKey, - }, - transaction - }); - // TODO: 中间表的 Model 有问题,关联数据更新有 BUG - // await through.updateAssociations(throughValues, options); - await through.update(throughValues, options); - delete values[throughName]; - } - } - if (!_.isEmpty(values)) { - // @ts-ignore - await model.update(values, options); - await model.updateAssociations(values, options); - } - ctx.body = model; - } - } else { - const Model = ctx.db.getModel(resourceName); - const model = await Model.findOne({ - ...options, - where: { - [resourceKeyAttribute || Model.primaryKeyAttribute]: resourceKey, - } - }); - // @ts-ignore - await model.update(values, options); - // @ts-ignore - await model.updateAssociations(values, options); - ctx.body = model; - } - await transaction.commit(); - await next(); -} - -/** - * 删除数据,支持批量 - * - * Single - * HasOne - * HasMany - * - * TODO 关联数据的删除,建议在 onUpdate/onDelete 层面处理 - * - * @param ctx - * @param next - */ -export async function destroy(ctx: Context, next: Next) { - const { - associated, - resourceField, - associatedName, - resourceName, - resourceKey, - resourceKeyAttribute, - filter - } = ctx.action.params; - const transaction = await ctx.db.sequelize.transaction(); - const commonOptions = { transaction, context: ctx }; - let count; - if (associated && resourceField) { - const AssociatedModel = ctx.db.getModel(associatedName); - if (!(associated instanceof AssociatedModel)) { - await transaction.rollback(); - throw new Error(`${associatedName} associated model invalid`); - } - const { get: getAccessor, remove: removeAccessor, set: setAccessor } = resourceField.getAccessors(); - const TargetModel = ctx.db.getModel(resourceField.getTarget()); - const { where } = TargetModel.parseApiJson({ filter, context: ctx }); - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - const model: Model = await associated[getAccessor](commonOptions); - // TODO:不能程序上解除关系,直接通过 onDelete 触发,或者通过 afterDestroy 处理 - // await associated[setAccessor](null, commonOptions); - // @ts-ignore - count = await model.destroy(commonOptions); - } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { - const primaryKey = resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute; - const models: Model[] = await associated[getAccessor]({ - where: resourceKey ? { [primaryKey]: resourceKey } : where, - ...commonOptions - }); - // TODO:不能程序上解除关系,直接通过 onDelete 触发,或者通过 afterDestroy 处理 - // await associated[removeAccessor](models, commonOptions); - // @ts-ignore - count = await TargetModel.destroy({ - where: { [primaryKey]: { [Op.in]: models.map(item => item[primaryKey]) } }, - ...commonOptions, - individualHooks: true, - }); - } - } else { - const Model = ctx.db.getModel(resourceName); - const { where } = Model.parseApiJson({ filter, context: ctx }); - const primaryKey = resourceKeyAttribute || Model.primaryKeyAttribute; - count = await Model.destroy({ - where: resourceKey ? { [primaryKey]: resourceKey } : where, - // @ts-ignore hooks 里添加 context - ...commonOptions, - individualHooks: true, - }); - } - ctx.body = { count }; - await transaction.commit(); - await next(); -} - -/** - * 人工排序 - * - * 基于偏移量策略实现的排序方法 - * - * TODO 字段验证 - * - * @param ctx - * @param next - */ -export async function sort(ctx: Context, next: Next) { - const { - resourceName, - resourceKey, - resourceField, - associatedName, - associatedKey, - associated, - values - } = ctx.action.params; - - if (associated && resourceField) { - if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { - throw new Error(`the association (${resourceName} belongs to ${associatedName}) cannot be sorted`); - } - // TODO(feature) - if (resourceField instanceof BELONGSTOMANY) { - throw new Error('sorting for belongs to many association has not been implemented'); - } - } - - const Model = ctx.db.getModel(resourceName); - const table = ctx.db.getTable(resourceName); - - const { sticky, field, target } = values; - if (!values.field || typeof target === 'undefined') { - return next(); - } - const sortField = table.getField(field); - if (!sortField) { - return next(); - } - const { primaryKeyAttribute } = Model; - const { name: sortAttr, scope = [] } = sortField.options; - - const transaction = await ctx.db.sequelize.transaction(); - - const where = {}; - if (associated && resourceField instanceof HASMANY) { - where[resourceField.options.foreignKey] = associatedKey; - } - - // 找到操作对象 - const source = await Model.findOne({ - where: { - ...where, - [primaryKeyAttribute]: resourceKey - }, - transaction - }); - - if (!source) { - await transaction.rollback(); - throw new Error(`resource(${resourceKey}) does not exist`); - } - const sourceScopeWhere = source.getValuesByFieldNames(scope); - - let targetScopeWhere: any; - let targetObject; - const { [primaryKeyAttribute]: targetId } = target; - if (targetId) { - targetObject = await Model.findByPk(targetId, { transaction }); - - if (!targetObject) { - await transaction.rollback(); - throw new Error(`resource(${targetId}) does not exist`); - } - - targetScopeWhere = targetObject.getValuesByFieldNames(scope); - } else { - targetScopeWhere = { ...sourceScopeWhere, ...target }; - } - - const sameScope = whereCompare(sourceScopeWhere, targetScopeWhere); - - const updates = { ...targetScopeWhere }; - if (targetObject) { - let increment: number; - const updateWhere = { ...targetScopeWhere }; - if (sameScope) { - const direction = source[sortAttr] < targetObject[sortAttr] ? { - sourceOp: Op.gt, - targetOp: Op.lte, - increment: -1 - } : { - sourceOp: Op.lt, - targetOp: Op.gte, - increment: 1 - }; - - increment = direction.increment; - - Object.assign(updateWhere, { - [sortAttr]: { - [direction.sourceOp]: source[sortAttr], - [direction.targetOp]: targetObject[sortAttr] - } - }); - } else { - increment = 1; - Object.assign(updateWhere, { - [sortAttr]: { - [Op.gte]: targetObject[sortAttr] - } - }); - } - - await Model.increment(sortAttr, { - by: increment, - where: updateWhere, - transaction - }); - - Object.assign(updates, { - [sortAttr]: targetObject[sortAttr] - }); - } else { - Object.assign(updates, { - [sortAttr]: await sortField.getNextValue({ - next: sticky ? 'min' : 'max', - where: targetScopeWhere, - transaction - }) - }); - } - - await source.update(updates, { transaction }); - - await transaction.commit(); - - ctx.body = source; - - await next(); -} - -export default { - list, // single、hasMany、belongsToMany - create, // signle、hasMany - get, // all - update, // single、 - destroy, - sort -}; diff --git a/packages/actions/src/actions/create.ts b/packages/actions/src/actions/create.ts new file mode 100644 index 0000000000000000000000000000000000000000..e84f035a7e6ae0509dba650252d49abfd61d92c6 --- /dev/null +++ b/packages/actions/src/actions/create.ts @@ -0,0 +1,55 @@ +import _ from 'lodash'; +import { Context, Next } from '..'; +import { Model } from '@nocobase/database'; +import { filterByFields } from '../utils'; + +/** + * 新增数据 + * + * Signle + * HasMany + * + * resource action 层面一般不开放 HasOne、BelongsTo、BelongsToMany 的新增数据操作 + * 如果需要这类操作建议使用 model.updateAssociations 方法 + * + * TODO 字段验证 + * + * @param ctx + * @param next + */ +export async function create(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + resourceName, + values: data, + fields, + } = ctx.action.params; + const values = filterByFields(data, fields); + const transaction = await ctx.db.sequelize.transaction(); + const options = { transaction, context: ctx }; + let model: Model; + try { + if (associated && resourceField) { + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const { create } = resourceField.getAccessors(); + model = await associated[create](values, options); + } else { + const ResourceModel = ctx.db.getModel(resourceName); + model = await ResourceModel.create(values, options); + } + await model.updateAssociations(values, options); + await transaction.commit(); + ctx.body = model; + await next(); + } catch (error) { + await transaction.rollback(); + throw error; + } +} + +export default create; diff --git a/packages/actions/src/actions/destroy.ts b/packages/actions/src/actions/destroy.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e05ef77278ad313e031cf63ca51309be6d3c961 --- /dev/null +++ b/packages/actions/src/actions/destroy.ts @@ -0,0 +1,95 @@ +import _ from 'lodash'; +import { Op } from 'sequelize'; +import { + Model, + HASONE, + HASMANY, + BELONGSTO, + BELONGSTOMANY, +} from '@nocobase/database'; +import { Context, Next } from '..'; + +/** + * 删除数据,支持批量 + * + * Single + * HasOne + * HasMany + * + * TODO 关联数据的删除,建议在 onUpdate/onDelete 层面处理 + * + * @param ctx + * @param next + */ +export async function destroy(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + resourceName, + resourceKey, + resourceKeyAttribute, + filter, + } = ctx.action.params; + const transaction = await ctx.db.sequelize.transaction(); + const commonOptions = { transaction, context: ctx }; + let count; + if (associated && resourceField) { + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + await transaction.rollback(); + throw new Error(`${associatedName} associated model invalid`); + } + const { + get: getAccessor, + remove: removeAccessor, + set: setAccessor, + } = resourceField.getAccessors(); + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + const { where } = TargetModel.parseApiJson({ filter, context: ctx }); + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + const model: Model = await associated[getAccessor](commonOptions); + // TODO:不能程序上解除关系,直接通过 onDelete 触发,或者通过 afterDestroy 处理 + // await associated[setAccessor](null, commonOptions); + // @ts-ignore + count = await model.destroy(commonOptions); + } else if ( + resourceField instanceof HASMANY || + resourceField instanceof BELONGSTOMANY + ) { + const primaryKey = + resourceKeyAttribute || + resourceField.options.targetKey || + TargetModel.primaryKeyAttribute; + const models: Model[] = await associated[getAccessor]({ + where: resourceKey ? { [primaryKey]: resourceKey } : where, + ...commonOptions, + }); + // TODO:不能程序上解除关系,直接通过 onDelete 触发,或者通过 afterDestroy 处理 + // await associated[removeAccessor](models, commonOptions); + // @ts-ignore + count = await TargetModel.destroy({ + where: { + [primaryKey]: { [Op.in]: models.map((item) => item[primaryKey]) }, + }, + ...commonOptions, + individualHooks: true, + }); + } + } else { + const Model = ctx.db.getModel(resourceName); + const { where } = Model.parseApiJson({ filter, context: ctx }); + const primaryKey = resourceKeyAttribute || Model.primaryKeyAttribute; + count = await Model.destroy({ + where: resourceKey ? { [primaryKey]: resourceKey } : where, + // @ts-ignore hooks 里添加 context + ...commonOptions, + individualHooks: true, + }); + } + ctx.body = { count }; + await transaction.commit(); + await next(); +} + +export default destroy; diff --git a/packages/actions/src/actions/get.ts b/packages/actions/src/actions/get.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6fe2efbf4b0b7ca9aa26076988f1fd1d7adc7b1 --- /dev/null +++ b/packages/actions/src/actions/get.ts @@ -0,0 +1,77 @@ +import _ from 'lodash'; +import { Context, Next } from '..'; +import { + Model, + HASONE, + HASMANY, + BELONGSTO, + BELONGSTOMANY, +} from '@nocobase/database'; + +/** + * 查询数据详情 + * + * @param ctx + * @param next + */ +export async function get(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + resourceName, + resourceKey, + resourceKeyAttribute, + fields = [] + } = ctx.action.params; + if (associated && resourceField) { + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const getAccessor = resourceField.getAccessors().get; + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + const options = TargetModel.parseApiJson({ + fields, + }); + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + let model: Model = await associated[getAccessor]({ context: ctx }); + if (model) { + model = await TargetModel.findOne({ + ...options, + context: ctx, + where: { + [TargetModel.primaryKeyAttribute]: model[TargetModel.primaryKeyAttribute], + }, + }); + } + ctx.body = model; + } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { + const [model]: Model[] = await associated[getAccessor]({ + ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + context: ctx, + }); + ctx.body = model; + } + } else { + const Model = ctx.db.getModel(resourceName); + const options = Model.parseApiJson({ + fields, + }); + const data = await Model.findOne({ + ...options, + where: { + [resourceKeyAttribute || Model.primaryKeyAttribute]: resourceKey, + }, + // @ts-ignore hooks 里添加 context + context: ctx, + }); + ctx.body = data; + } + await next(); +} + +export default get; diff --git a/packages/actions/src/actions/index.ts b/packages/actions/src/actions/index.ts index c31b38ba9903b4887c9ec81bd8a3c957d02af73d..53466517960aea52bd1e45981b1db6f2c1e8309d 100644 --- a/packages/actions/src/actions/index.ts +++ b/packages/actions/src/actions/index.ts @@ -1,14 +1,10 @@ -import Koa from 'koa'; -import Database from '@nocobase/database'; -import { Action } from '@nocobase/resourcer'; - -export type Next = () => Promise; - -export interface Context extends Koa.Context { - db: Database; - action: Action; - body: any; -}; - -export { default as common } from './common'; -export { default as associate } from './associate'; +export * from './add'; +export * from './create'; +export * from './destroy'; +export * from './get'; +export * from './list'; +export * from './remove'; +export * from './set'; +export * from './sort'; +export * from './toggle'; +export * from './update'; diff --git a/packages/actions/src/actions/list.ts b/packages/actions/src/actions/list.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff47c26e4fdfde1cb54ed0fdffbdec3b6008d349 --- /dev/null +++ b/packages/actions/src/actions/list.ts @@ -0,0 +1,229 @@ +import { Utils, Op, Sequelize } from 'sequelize'; +import _ from 'lodash'; +import { Context, Next } from '..'; +import { + Model, + HASONE, + HASMANY, + BELONGSTO, + BELONGSTOMANY, + whereCompare +} from '@nocobase/database'; +import { PageParameter } from '@nocobase/resourcer'; + +async function hasManyGet(instances, options: any = {}) { + const where = {}; + + let Model = this.target; + Model = Model.database.getModel(Model.name); + + let instance; + let values; + + if (!Array.isArray(instances)) { + instance = instances; + instances = undefined; + } + + options = { ...options }; + + if (this.scope) { + Object.assign(where, this.scope); + } + + if (instances) { + values = instances.map(_instance => _instance.get(this.sourceKey, { raw: true })); + + if (options.limit && instances.length > 1) { + options.groupedLimit = { + limit: options.limit, + on: this, // association + values + }; + + delete options.limit; + } else { + where[this.foreignKey] = { + [Op.in]: values + }; + delete options.groupedLimit; + } + } else { + where[this.foreignKey] = instance.get(this.sourceKey, { raw: true }); + } + + options.where = options.where ? + { [Op.and]: [where, options.where] } : + where; + + if (Object.prototype.hasOwnProperty.call(options, 'scope')) { + if (!options.scope) { + Model = Model.unscoped(); + } else { + Model = Model.scope(options.scope); + } + } + + if (Object.prototype.hasOwnProperty.call(options, 'schema')) { + Model = Model.schema(options.schema, options.schemaDelimiter); + } + + const results = await Model.findAndCountAll(options); + if (instance) return results; + + const result = {}; + for (const _instance of instances) { + result[_instance.get(this.sourceKey, { raw: true })] = []; + } + + for (const _instance of results) { + result[_instance.get(this.foreignKey, { raw: true })].push(_instance); + } + + return result; +} + +async function belongsToManyGet(instance, options) { + options = Utils.cloneDeep(options) || {}; + + const through = this.through; + let scopeWhere; + let throughWhere; + + if (this.scope) { + scopeWhere = { ...this.scope }; + } + + options.where = { + [Op.and]: [ + scopeWhere, + options.where + ] + }; + + if (Object(through.model) === through.model) { + throughWhere = {}; + throughWhere[this.foreignKey] = instance.get(this.sourceKey); + + if (through.scope) { + Object.assign(throughWhere, through.scope); + } + + //If a user pass a where on the options through options, make an "and" with the current throughWhere + if (options.through && options.through.where) { + throughWhere = { + [Op.and]: [throughWhere, options.through.where] + }; + } + + options.include = options.include || []; + options.include.push({ + association: this.oneFromTarget, + attributes: options.joinTableAttributes, + required: true, + paranoid: _.get(options.through, 'paranoid', true), + where: throughWhere + }); + } + + let model = this.target; + if (Object.prototype.hasOwnProperty.call(options, 'scope')) { + if (!options.scope) { + model = model.unscoped(); + } else { + model = model.scope(options.scope); + } + } + + if (Object.prototype.hasOwnProperty.call(options, 'schema')) { + model = model.schema(options.schema, options.schemaDelimiter); + } + + return model.findAndCountAll(options); +} + +/** + * 查询数据列表 + * + * - Signle + * - HasMany + * - BelongsToMany + * + * HasOne 和 belongsTo 不涉及到 list + * + * @param ctx + * @param next + */ +export async function list(ctx: Context, next: Next) { + const { + page = PageParameter.DEFAULT_PAGE, + perPage = PageParameter.DEFAULT_PER_PAGE, + sort = [], + fields = [], + filter = {}, + associated, + associatedName, + resourceName, + resourceField, + } = ctx.action.params; + let data = {}; + let options: any = {}; + let Model; + if (associated && resourceField) { + const AssociatedModel = ctx.db.getModel(associatedName); + Model = ctx.db.getModel(resourceField.options.target); + options = Model.parseApiJson({ + sort, + page, + perPage, + filter, + fields, + context: ctx, + }); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + // const getAccessor = resourceField.getAccessors().get; + // const countAccessor = resourceField.getAccessors().count; + options.scope = options.scopes || []; + const association = AssociatedModel.associations[resourceField.options.name]; + if (resourceField instanceof BELONGSTOMANY) { + data = await belongsToManyGet.call(association, associated, { + joinTableAttributes: [], + ...options, + context: ctx, + }); + } + if (resourceField instanceof HASMANY) { + data = await hasManyGet.call(association, associated, { + joinTableAttributes: [], + ...options, + context: ctx, + }); + } + } else { + Model = ctx.db.getModel(resourceName); + options = Model.parseApiJson({ + sort, + page, + perPage, + filter, + fields, + context: ctx, + }); + data = await Model.scope(options.scopes || []).findAndCountAll({ + ...options, + // @ts-ignore hooks 里添加 context + context: ctx, + }); + } + if (options.limit || typeof options.offset !== 'undefined') { + // Math.round 避免精度问题 + data['page'] = Math.round((options.offset || 0) / options.limit + 1); + data[Utils.underscoredIf('perPage', Model.options.underscored)] = options.limit; + } + ctx.body = data; + await next(); +} + +export default list; diff --git a/packages/actions/src/actions/remove.ts b/packages/actions/src/actions/remove.ts new file mode 100644 index 0000000000000000000000000000000000000000..2003dd3cedca02a6708174e93ac0491cd425953a --- /dev/null +++ b/packages/actions/src/actions/remove.ts @@ -0,0 +1,57 @@ +import { Context, Next } from '..'; +import { + Model, + Relation, + HASONE, + BELONGSTO, + BELONGSTOMANY, + HASMANY, +} from '@nocobase/database'; + +/** + * 删除关联 + * + * BlongsTo + * BlongsToMany + * + * @param ctx + * @param next + */ +export async function remove(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + } = ctx.action.params as { + associated: Model, + associatedName: string, + resourceField: Relation, + values: any, + }; + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const { get: getAccessor, remove: removeAccessor, set: setAccessor } = resourceField.getAccessors(); + const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + const options = TargetModel.parseApiJson({ + fields, + }); + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + ctx.body = await associated[setAccessor](null); + } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { + const [model]: Model[] = await associated[getAccessor]({ + ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + context: ctx, + }); + await associated[removeAccessor](model); + ctx.body = { id: model.id }; + } + await next(); +} + +export default remove; diff --git a/packages/actions/src/actions/set.ts b/packages/actions/src/actions/set.ts new file mode 100644 index 0000000000000000000000000000000000000000..c30667006baef736caa7f9871fb54c053d1a1f83 --- /dev/null +++ b/packages/actions/src/actions/set.ts @@ -0,0 +1,52 @@ +import { Context, Next } from '..'; +import { + Model, + Relation, + HASONE, + BELONGSTO, + BELONGSTOMANY, + HASMANY, +} from '@nocobase/database'; + +/** + * 建立关联 + * + * BlongsTo + * BlongsToMany + * + * @param ctx + * @param next + */ +export async function set(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + } = ctx.action.params as { + associated: Model, + associatedName: string, + resourceField: Relation, + values: any, + }; + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const { set: setAccessor } = resourceField.getAccessors(); + const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + // const options = TargetModel.parseApiJson({ + // fields, + // }); + const model = await TargetModel.findOne({ + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + // @ts-ignore + context: ctx, + }); + ctx.body = await associated[setAccessor](model); + await next(); +} + +export default set; diff --git a/packages/actions/src/actions/sort.ts b/packages/actions/src/actions/sort.ts new file mode 100644 index 0000000000000000000000000000000000000000..f61559a82b81947cf316119f5952de35c4f578d0 --- /dev/null +++ b/packages/actions/src/actions/sort.ts @@ -0,0 +1,170 @@ +import { Utils, Op, Sequelize } from 'sequelize'; +import _ from 'lodash'; +import { Context, Next } from '..'; +import { + HASONE, + HASMANY, + BELONGSTO, + BELONGSTOMANY, + whereCompare +} from '@nocobase/database'; + +/** + * 人工排序 + * + * 同 scope 时,往前挪动,插入到目标位置前面;往后挪动,插入到目标位置后面 + * 不同 scope 时,挪动到往目标位置时,默认插入后面位置,可指定 insertBefore + */ +export async function sort(ctx: Context, next: Next) { + const { + resourceName, + resourceKey, + resourceField, + associatedName, + associatedKey, + associated, + values = {}, + ...others + } = ctx.action.params; + + if (associated && resourceField) { + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + throw new Error(`the association (${resourceName} belongs to ${associatedName}) cannot be sorted`); + } + // TODO(feature) + if (resourceField instanceof BELONGSTOMANY) { + throw new Error('sorting for belongs to many association has not been implemented'); + } + } + + const Model = ctx.db.getModel(resourceName); + const table = ctx.db.getTable(resourceName); + const { primaryKeyAttribute } = Model; + + const sourceId = others.sourceId || resourceKey; + const field = others.sortField || values?.sortField || values?.field || 'sort'; + const targetId = others.targetId || values?.targetId || values?.target?.[primaryKeyAttribute]; + const method = others.method || values?.method; + const insertAfter = method === 'insertAfter'; + const sticky = others.sticky || values?.sticky || method === 'prepend'; + const targetScope = others.targetScope || values?.targetScope; + + if (!sourceId) { + throw new Error('source id invalid'); + } + + if (!(sticky || targetId || targetScope)) { + throw new Error('target id/scope invalid'); + } + + const sortField = table.getField(field); + + if (!sortField) { + return next(); + } + + const { name: sortAttr, scope = [] } = sortField.options; + + const transaction = await ctx.db.sequelize.transaction(); + + const where = {}; + + if (associated && resourceField instanceof HASMANY) { + where[resourceField.options.foreignKey] = associatedKey; + } + + // 找到操作对象 + const source = await Model.findOne({ + where: { + ...where, + [primaryKeyAttribute]: sourceId + }, + transaction + }); + + if (!source) { + await transaction.rollback(); + throw new Error(`resource ${sourceId} does not exist`); + } + + const sourceScopeWhere = source.getValuesByFieldNames(scope); + + let targetScopeWhere: any; + let targetObject; + + if (targetId) { + targetObject = await Model.findByPk(targetId, { transaction }); + if (!targetObject) { + await transaction.rollback(); + throw new Error(`resource ${targetId} does not exist`); + } + targetScopeWhere = targetObject.getValuesByFieldNames(scope); + } else { + targetScopeWhere = { ...sourceScopeWhere, ...targetScope }; + } + + const sameScope = whereCompare(sourceScopeWhere, targetScopeWhere); + const updates = { ...targetScopeWhere }; + + if (targetObject) { + let increment: number; + const updateWhere = { ...targetScopeWhere }; + if (sameScope) { + const direction = source[sortAttr] < targetObject[sortAttr] ? { + sourceOp: Op.gt, + targetOp: insertAfter ? Op.lt : Op.lte, + increment: -1 + } : { + sourceOp: Op.lt, + targetOp: insertAfter ? Op.gt : Op.gte, + increment: 1 + }; + + increment = direction.increment; + + Object.assign(updateWhere, { + [sortAttr]: { + [direction.sourceOp]: source[sortAttr], + [direction.targetOp]: targetObject[sortAttr] + } + }); + } else { + increment = 1; + Object.assign(updateWhere, { + [sortAttr]: { + [insertAfter ? Op.gt : Op.gte]: targetObject[sortAttr] + } + }); + } + + console.log({ insertAfter, updateWhere }) + + await Model.increment(sortAttr, { + by: increment, + where: updateWhere, + transaction + }); + + Object.assign(updates, { + [sortAttr]: insertAfter ? targetObject[sortAttr] + 1 : targetObject[sortAttr] + }); + } else { + Object.assign(updates, { + [sortAttr]: await sortField.getNextValue({ + next: sticky ? 'min' : 'max', + where: targetScopeWhere, + transaction + }) + }); + } + + await source.update(updates, { transaction }); + + await transaction.commit(); + + ctx.body = source; + + await next(); +} + +export default sort; diff --git a/packages/actions/src/actions/toggle.ts b/packages/actions/src/actions/toggle.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ad7ee3d6d4e2f6f00b4cd6fd71514c688b691b5 --- /dev/null +++ b/packages/actions/src/actions/toggle.ts @@ -0,0 +1,72 @@ +import { Context, Next } from '..'; +import { + Model, + Relation, + HASONE, + BELONGSTO, + BELONGSTOMANY, + HASMANY, +} from '@nocobase/database'; + +export async function toggle(ctx: Context, next: Next) { + const { + associated, + resourceField, + associatedName, + } = ctx.action.params as { + associated: Model, + associatedName: string, + resourceField: Relation, + values: any, + }; + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + throw new Error(`${associatedName} associated model invalid`); + } + const { get: getAccessor, remove: removeAccessor, set: setAccessor, add: addAccessor } = resourceField.getAccessors(); + const { resourceKey, resourceKeyAttribute, fields = [] } = ctx.action.params; + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + const options = TargetModel.parseApiJson({ + fields, + }); + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + const m1 = await associated[getAccessor](); + if (m1 && m1[resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute] == resourceKey) { + ctx.body = await associated[setAccessor](null); + } else { + const m2 = await TargetModel.findOne({ + // ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + // @ts-ignore + context: ctx, + }); + ctx.body = await associated[setAccessor](m2); + } + } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { + const [model]: Model[] = await associated[getAccessor]({ + ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + context: ctx, + }); + if (model) { + ctx.body = await associated[removeAccessor](model); + } else { + const m2 = await TargetModel.findOne({ + // ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + }, + // @ts-ignore + context: ctx, + }); + ctx.body = await associated[addAccessor](m2); + } + } + await next(); +} + +export default toggle; diff --git a/packages/actions/src/actions/update.ts b/packages/actions/src/actions/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ab4cc5ded6417ca68ad708b4e71cb9c806a5a60 --- /dev/null +++ b/packages/actions/src/actions/update.ts @@ -0,0 +1,104 @@ +import _ from 'lodash'; +import { Context, Next } from '..'; +import { + Model, + HASONE, + HASMANY, + BELONGSTO, + BELONGSTOMANY, + whereCompare +} from '@nocobase/database'; +import { filterByFields } from '../utils'; + +/** + * 更新数据 + * + * TODO 字段验证 + * + * @param ctx + * @param next + */ +export async function update(ctx: Context, next: Next) { + const { + associated, + associatedName, + resourceField, + resourceName, + resourceKey, + // TODO(question): 这个属性从哪设置的? + resourceKeyAttribute, + fields, + values: data + } = ctx.action.params; + const values = filterByFields(data, fields); + const transaction = await ctx.db.sequelize.transaction(); + const options = { transaction, context: ctx }; + if (associated && resourceField) { + const AssociatedModel = ctx.db.getModel(associatedName); + if (!(associated instanceof AssociatedModel)) { + await transaction.rollback(); + throw new Error(`${associatedName} associated model invalid`); + } + const { get: getAccessor } = resourceField.getAccessors(); + if (resourceField instanceof HASONE || resourceField instanceof BELONGSTO) { + let model: Model = await associated[getAccessor](options); + if (model) { + // @ts-ignore + await model.update(values, options); + await model.updateAssociations(values, options); + ctx.body = model; + } + } else if (resourceField instanceof HASMANY || resourceField instanceof BELONGSTOMANY) { + const TargetModel = ctx.db.getModel(resourceField.getTarget()); + const [model]: Model[] = await associated[getAccessor]({ + ...options, + where: { + [resourceKeyAttribute || resourceField.options.targetKey || TargetModel.primaryKeyAttribute]: resourceKey, + } + }); + + if (resourceField instanceof BELONGSTOMANY) { + const throughName = resourceField.getThroughName(); + if (typeof values[throughName] === 'object') { + const ThroughModel = resourceField.getThroughModel(); + const throughValues = values[throughName]; + const { foreignKey, sourceKey, otherKey } = resourceField.options; + const through = await ThroughModel.findOne({ + where: { + [foreignKey]: associated[sourceKey], + [otherKey]: resourceKey, + }, + transaction + }); + // TODO: 中间表的 Model 有问题,关联数据更新有 BUG + // await through.updateAssociations(throughValues, options); + await through.update(throughValues, options); + delete values[throughName]; + } + } + if (!_.isEmpty(values)) { + // @ts-ignore + await model.update(values, options); + await model.updateAssociations(values, options); + } + ctx.body = model; + } + } else { + const Model = ctx.db.getModel(resourceName); + const model = await Model.findOne({ + ...options, + where: { + [resourceKeyAttribute || Model.primaryKeyAttribute]: resourceKey, + } + }); + // @ts-ignore + await model.update(values, options); + // @ts-ignore + await model.updateAssociations(values, options); + ctx.body = model; + } + await transaction.commit(); + await next(); +} + +export default update; diff --git a/packages/actions/src/index.ts b/packages/actions/src/index.ts index 366bb2de917c224e9b526b8d33d8f93d44101fb3..876e6e9c6120b4934644b7f92cd22b83a195c62f 100644 --- a/packages/actions/src/index.ts +++ b/packages/actions/src/index.ts @@ -1,6 +1,27 @@ +import Koa from 'koa'; +import Database from '@nocobase/database'; +import Resourcer, { Action } from '@nocobase/resourcer'; + import * as actions from './actions'; +import * as middlewares from './middlewares'; + +export type Next = () => Promise; + +export interface Context extends Koa.Context { + db: Database; + action: Action; + body: any; +}; export * as utils from './utils'; export * as actions from './actions'; export * as middlewares from './middlewares'; + +export function registerActions(api: any) { + const resourcer = api.resourcer as Resourcer; + resourcer.use(middlewares.associated); + resourcer.registerActions({ ...actions }); +} + export default actions; + diff --git a/packages/actions/src/middlewares/associated.ts b/packages/actions/src/middlewares/associated.ts index c14896da6610fca0491bd67389dd1d96fb0a57f1..9715df1ae871d685a2c83581788ef5a9550f87f6 100644 --- a/packages/actions/src/middlewares/associated.ts +++ b/packages/actions/src/middlewares/associated.ts @@ -1,4 +1,4 @@ -import { Context, Next } from '../actions'; +import { Context, Next } from '..'; import { Action } from '@nocobase/resourcer'; import { HASONE, HASMANY, BELONGSTO, BELONGSTOMANY } from '@nocobase/database'; diff --git a/packages/actions/src/middlewares/data-wrapping.ts b/packages/actions/src/middlewares/data-wrapping.ts deleted file mode 100644 index 3a64432dde89c8c635b522f73635a8162da22376..0000000000000000000000000000000000000000 --- a/packages/actions/src/middlewares/data-wrapping.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Context, Next } from '../actions'; -import { Action } from '@nocobase/resourcer'; - -export async function dataWrapping(ctx: Context, next: Next) { - await next(); - if (!(ctx.action instanceof Action)) { - return; - } - if (ctx.withoutDataWrapping) { - return; - } - if (ctx.body instanceof Buffer) { - return; - } - if (!ctx.body) { - ctx.body = {}; - } - const { rows, ...meta } = ctx.body; - if (rows) { - ctx.body = { - data: rows, - meta, - }; - } else { - ctx.body = { - data: ctx.body, - }; - } -} - -export default dataWrapping; diff --git a/packages/actions/src/middlewares/index.ts b/packages/actions/src/middlewares/index.ts index 6455ad0be1c41b45359c88c00ac1ef87532662ce..7531ec27023d6d77011688e4d95d6ced7bba6875 100644 --- a/packages/actions/src/middlewares/index.ts +++ b/packages/actions/src/middlewares/index.ts @@ -1,2 +1 @@ export * from './associated'; -export * from './data-wrapping'; diff --git a/packages/api/bin/nocobase.js b/packages/api/bin/nocobase.js old mode 100644 new mode 100755 index f2ffb6626f2704e06544be353d232ef09bbb03c5..6304c46c2a6f683608a7cdea0ff21e0ea04d3a68 --- a/packages/api/bin/nocobase.js +++ b/packages/api/bin/nocobase.js @@ -1,15 +1,6 @@ #!/usr/bin/env node const keys = process.argv; - -const key = keys.pop(); - const dotenv = require('dotenv'); - dotenv.config(); - -if (key === 'start') { - require('../lib/index'); -} else if (key === 'db-init') { - require('../lib/migrations/init'); -} +require('../lib/index'); diff --git a/packages/api/package.json b/packages/api/package.json index fd56eba67b678106a6f7fe8db0b2bae6dc53ab77..56ac9a557502b07afb063560afe1aa935274b467 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,7 @@ { "name": "@nocobase/api", - "version": "0.4.0-alpha.7", + "private": true, + "version": "0.5.0-alpha.25", "main": "./lib/index.js", "types": "./lib/index.d.ts", "license": "MIT", @@ -9,19 +10,18 @@ "nocobase": "bin/nocobase.js" }, "dependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/client": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/plugin-action-logs": "^0.4.0-alpha.7", - "@nocobase/plugin-automations": "^0.4.0-alpha.7", - "@nocobase/plugin-china-region": "^0.4.0-alpha.7", - "@nocobase/plugin-collections": "^0.4.0-alpha.7", - "@nocobase/plugin-export": "^0.4.0-alpha.7", - "@nocobase/plugin-file-manager": "^0.4.0-alpha.7", - "@nocobase/plugin-pages": "^0.4.0-alpha.7", - "@nocobase/plugin-permissions": "^0.4.0-alpha.7", - "@nocobase/plugin-users": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7", + "@nocobase/actions": "^0.5.0-alpha.25", + "@nocobase/client": "^0.5.0-alpha.25", + "@nocobase/database": "^0.5.0-alpha.25", + "@nocobase/plugin-action-logs": "^0.5.0-alpha.25", + "@nocobase/plugin-china-region": "^0.5.0-alpha.25", + "@nocobase/plugin-collections": "^0.5.0-alpha.25", + "@nocobase/plugin-file-manager": "^0.5.0-alpha.25", + "@nocobase/plugin-permissions": "^0.5.0-alpha.25", + "@nocobase/plugin-ui-router": "^0.5.0-alpha.25", + "@nocobase/plugin-ui-schema": "^0.5.0-alpha.25", + "@nocobase/plugin-users": "^0.5.0-alpha.25", + "@nocobase/server": "^0.5.0-alpha.25", "koa-static": "^5.0.0" }, "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" diff --git a/packages/api/src/app.ts b/packages/api/src/app.ts deleted file mode 100644 index 687e0f4687e8d76347fb9d3881c0123b02d9a5b2..0000000000000000000000000000000000000000 --- a/packages/api/src/app.ts +++ /dev/null @@ -1,56 +0,0 @@ -import Api from '@nocobase/server'; - -// @ts-ignore -const sync = global.sync || { - force: false, - alter: { - drop: false, - }, -}; - -console.log('process.env.NOCOBASE_ENV', process.env.NOCOBASE_ENV); - -const api = Api.create({ - database: { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: process.env.DB_PORT, - dialect: process.env.DB_DIALECT, - dialectOptions: { - charset: 'utf8mb4', - collate: 'utf8mb4_unicode_ci', - }, - pool: { - max: 5, - min: 0, - acquire: 30000, - idle: 10000, - }, - logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, - define: {}, - sync, - }, - resourcer: { - prefix: '/api', - }, -}); - -const plugins = [ - '@nocobase/plugin-collections', - '@nocobase/plugin-action-logs', - '@nocobase/plugin-pages', - '@nocobase/plugin-users', - '@nocobase/plugin-file-manager', - '@nocobase/plugin-permissions', - '@nocobase/plugin-automations', - '@nocobase/plugin-china-region', - '@nocobase/plugin-export', -]; - -for (const plugin of plugins) { - api.registerPlugin(plugin, [require(`${plugin}/${__filename.endsWith('.ts') ? 'src' : 'lib'}/server`).default]); -} - -export default api; diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 855a5354e4afd4bf6047bc7fe2150c7410da9eb3..75aecc11225409f0b4bd71ac3badc68e1de3a8ca 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,29 +1,63 @@ -import api from './app'; -import { middlewares } from '@nocobase/server'; +import Server from '@nocobase/server'; -(async () => { - api.resourcer.use(middlewares.actionParams()); +const start = Date.now(); - await api.loadPlugins(); +const api = new Server({ + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + pool: { + max: 5, + min: 0, + acquire: 60000, + idle: 10000, + }, + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + define: {}, + sync: { + force: false, + alter: { + drop: false, + }, + }, + }, + resourcer: { + prefix: '/api', + }, +}); - if (process.env.NOCOBASE_ENV === 'demo') { - api.resourcer.use(middlewares.demoBlacklistedActions({ - emails: [process.env.ADMIN_EMAIL], - })); - } +const plugins = [ + '@nocobase/plugin-ui-router', + '@nocobase/plugin-ui-schema', + '@nocobase/plugin-collections', + '@nocobase/plugin-users', + '@nocobase/plugin-action-logs', + '@nocobase/plugin-file-manager', + '@nocobase/plugin-permissions', + '@nocobase/plugin-export', + '@nocobase/plugin-system-settings', + '@nocobase/plugin-china-region', +]; - await api.database.getModel('collections').load({skipExisting: true}); - await api.database.getModel('collections').load({where: { - name: 'users', - }}); - await api.database.getModel('automations').load(); +for (const plugin of plugins) { + api.plugin(require(`${plugin}/${__filename.endsWith('.ts') ? 'src' : 'lib'}/server`).default); +} - api.use(middlewares.appDistServe({ - root: process.env.APP_DIST, - useStaticServer: !(process.env.APP_USE_STATIC_SERVER === 'false' || !process.env.APP_USE_STATIC_SERVER), - })); +if (process.argv.length < 3) { + // @ts-ignore + process.argv.push('start', '--port', process.env.API_PORT); +} - api.listen(process.env.API_PORT, () => { - console.log(`http://localhost:${process.env.API_PORT}/`); - }); -})(); +console.log(process.argv); + +api.parse(process.argv).then(() => { + console.log(`Start-up time: ${(Date.now() - start) / 1000}s`); +}); diff --git a/packages/api/src/migrate.ts b/packages/api/src/migrate.ts deleted file mode 100644 index 52371acae871b2ae5f7740db5bdc1933a99c37cf..0000000000000000000000000000000000000000 --- a/packages/api/src/migrate.ts +++ /dev/null @@ -1,15 +0,0 @@ -// @ts-ignore -const keys = process.argv; - -// @ts-ignore -global.sync = { - force: false, - alter: { - drop: false, - }, -}; - -// @ts-ignore -const filename: string = keys.pop(); - -require(`./migrations/${filename}`); diff --git a/packages/api/src/migrations/init.ts b/packages/api/src/migrations/init.ts deleted file mode 100644 index c2250fa367932d7473e73e4ebbe57dd22b0ebf0f..0000000000000000000000000000000000000000 --- a/packages/api/src/migrations/init.ts +++ /dev/null @@ -1,261 +0,0 @@ -// @ts-ignore -global.sync = { - force: true, - alter: { - drop: true, - }, -}; - -import Database from '@nocobase/database'; -import api from '../app'; - -const data = [ - { - title: '后台应用', - path: '/', - type: 'layout', - template: 'TopMenuLayout', - sort: 10, - redirect: '/admin', - }, - { - title: '后台', - path: '/admin', - type: 'page', - inherit: false, - template: 'AdminLoader', - order: 230, - }, - { - title: '登录页面', - path: '/login', - type: 'page', - inherit: false, - template: 'login', - order: 120, - }, - { - title: '注册页面', - path: '/register', - type: 'page', - inherit: false, - template: 'register', - order: 130, - }, - { - title: '忘记密码', - path: '/lostpassword', - type: 'page', - inherit: false, - template: 'lostpassword', - order: 140, - }, - { - title: '重置密码', - path: '/resetpassword', - type: 'page', - inherit: false, - template: 'resetpassword', - order: 150, - }, -]; - -(async () => { - await api.loadPlugins(); - const database: Database = api.database; - await database.sync({ - // tables: ['collections', 'fields', 'actions', 'views', 'tabs'], - }); - const [Collection, Page, User] = database.getModels(['collections', 'pages', 'users']); - const tables = database.getTables([]); - for (let table of tables) { - // console.log(table.getName()); - if (table.getName() === 'roles') { - // console.log('roles', table.getOptions()) - } - await Collection.import(table.getOptions(), { update: true, migrate: false }); - } - await Page.import(data); - - const user = await User.create({ - email: process.env.ADMIN_EMAIL, - password: process.env.ADMIN_PASSWORD, - }); - const Storage = database.getModel('storages'); - await Storage.create({ - title: '本地存储', - name: `local`, - type: 'local', - baseUrl: process.env.LOCAL_STORAGE_BASE_URL, - default: process.env.STORAGE_TYPE === 'local', - }); - await Storage.create({ - name: `ali-oss`, - type: 'ali-oss', - baseUrl: process.env.ALI_OSS_STORAGE_BASE_URL, - options: { - region: process.env.ALI_OSS_REGION, - accessKeyId: process.env.ALI_OSS_ACCESS_KEY_ID, - accessKeySecret: process.env.ALI_OSS_ACCESS_KEY_SECRET, - bucket: process.env.ALI_OSS_BUCKET, - }, - default: process.env.STORAGE_TYPE === 'ali-oss', - }); - const Role = database.getModel('roles'); - if (Role) { - const roles = await Role.bulkCreate([ - { title: '系统开发组', type: -1 }, - // { title: '匿名用户组', type: 0 }, - { title: '普通用户组', default: true }, - ]); - await roles[0].updateAssociations({ - users: user - }); - } - - const Action = database.getModel('actions'); - // 全局 - await Action.bulkCreate([ - ]); - - // 导入地域数据 - const ChinaRegion = database.getModel('china_regions'); - ChinaRegion && await ChinaRegion.importData(); - - const Menu = database.getModel('menus'); - - const menus = [ - { - title: '仪表盘', - icon: 'DashboardOutlined', - type: 'group', - children: [ - { - title: '欢迎光临', - icon: 'DatabaseOutlined', - type: 'page', - views: [], - name: 'welcome', - }, - ], - }, - { - title: '数据', - icon: 'DatabaseOutlined', - type: 'group', - children: [], - }, - { - title: '用户', - icon: 'TeamOutlined', - type: 'group', - children: [ - { - title: '用户管理', - icon: 'DatabaseOutlined', - type: 'page', - views: ['users.table'], - name: 'users', - }, - ], - }, - { - title: '日志', - icon: 'NotificationOutlined', - type: 'group', - developerMode: true, - children: [ - { - title: '操作记录', - icon: 'DatabaseOutlined', - type: 'group', - developerMode: true, - children: [ - { - title: '全部数据', - type: 'page', - views: ['action_logs.table'], - developerMode: true, - name: 'auditing', - }, - { - title: '新增数据', - type: 'page', - views: ['action_logs.create'], - developerMode: true, - name: 'create-auditing', - }, - { - title: '更新数据', - type: 'page', - views: ['action_logs.update'], - developerMode: true, - name: 'update-auditing', - }, - { - title: '删除数据', - type: 'page', - views: ['action_logs.destroy'], - developerMode: true, - name: 'destroy-auditing', - }, - ], - }, - ], - }, - { - title: '配置', - icon: 'SettingOutlined', - type: 'group', - developerMode: true, - children: [ - { - name: 'menus', - title: '菜单和页面配置', - icon: 'MenuOutlined', - type: 'page', - views: ['menus.table'], - developerMode: true, - }, - { - name: 'collections', - title: '数据表配置', - icon: 'DatabaseOutlined', - type: 'page', - views: ['collections.table'], - developerMode: true, - }, - { - name: 'permissions', - title: '权限配置', - icon: 'MenuOutlined', - type: 'page', - views: ['roles.table'], - developerMode: true, - }, - { - name: 'automations', - title: '自动化配置', - icon: 'MenuOutlined', - type: 'page', - views: ['automations.table'], - developerMode: true, - }, - { - name: 'system_settings', - title: '系统配置', - icon: 'DatabaseOutlined', - type: 'page', - views: ['system_settings.descriptions'], - developerMode: true, - }, - ], - }, - ]; - - for (const item of menus) { - const menu = await Menu.create(item); - await menu.updateAssociations(item); - } - await database.close(); -})(); diff --git a/packages/api/src/migrations/select.ts b/packages/api/src/migrations/select.ts deleted file mode 100644 index e9265f59cfbad5089cc3656394ed92d9aa71ec84..0000000000000000000000000000000000000000 --- a/packages/api/src/migrations/select.ts +++ /dev/null @@ -1,32 +0,0 @@ -import api from '../app'; -import Database from '@nocobase/database'; - -(async () => { - await api.loadPlugins(); - await api.database.getModel('collections').load({ skipExisting: true }); - const database: Database = api.database; - const [Field] = database.getModels(['fields']); - - const fields = await Field.findAll({ - where: { - interface: 'multipleSelect', - }, - }); - - for (const field of fields) { - const M = database.getModel(field.collection_name); - const models = await M.findAll(); - for (const model of models) { - let value = model.get(field.name); - if (!value) { - continue; - } - if (!Array.isArray(value)) { - value = [value]; - } - model.set(field.name, value); - await model.save(); - console.log(field.name, value); - } - } -})(); diff --git a/packages/api/src/migrations/sync.ts b/packages/api/src/migrations/sync.ts deleted file mode 100644 index 90dba33aa711129aaa3543f7583e64683d945b74..0000000000000000000000000000000000000000 --- a/packages/api/src/migrations/sync.ts +++ /dev/null @@ -1,18 +0,0 @@ -import api from '../app'; -import Database from '@nocobase/database'; - -(async () => { - await api.loadPlugins(); - const database: Database = api.database; - await api.database.sync({ - }); - - const [Collection] = database.getModels(['collections']); - - const tables = database.getTables(); - - for (let table of tables) { - console.log(table.getName()); - await Collection.import(table.getOptions(), { migrate: false }); - } -})(); diff --git a/packages/app/.fatherrc.ts b/packages/app/.fatherrc.ts deleted file mode 100755 index 491de68f67457a6c9e36c0ff843973f2f9600b05..0000000000000000000000000000000000000000 --- a/packages/app/.fatherrc.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default { - entry: 'src/api', - target: 'node', - cjs: { type: 'babel', lazy: true }, - include: 'api/*', - disableTypeCheck: true, - // pkgs: [ - // 'api', - // ], -}; diff --git a/packages/app/.gitignore b/packages/app/.gitignore index 88ce629c4c4dd9fd6cc6e4970b5ece600d898308..bee1cf61ce749bc0d6ad0509e15d900cc72b7b3a 100644 --- a/packages/app/.gitignore +++ b/packages/app/.gitignore @@ -9,7 +9,7 @@ # production /dist -.env + # misc .DS_Store @@ -18,4 +18,3 @@ /src/.umi-production /src/.umi-test /.env.local -report.*.json \ No newline at end of file diff --git a/packages/app/.npmignore b/packages/app/.npmignore deleted file mode 100644 index 7ef32b6acf5981b487bf33310f6beafb8c200345..0000000000000000000000000000000000000000 --- a/packages/app/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -lib -mock -node_modules -*.log -docs -__tests__ -jest.config.js -tsconfig.json -src -.fatherrc.ts -.umirc.ts -nodemon.json \ No newline at end of file diff --git a/packages/app/.prettierignore b/packages/app/.prettierignore old mode 100755 new mode 100644 diff --git a/packages/app/.prettierrc b/packages/app/.prettierrc old mode 100755 new mode 100644 diff --git a/packages/app/.umirc.ts b/packages/app/.umirc.ts index 110d3852e78277e34c6257b125873f43ae93cb7e..22add7d68ebc807714114b9998be8a4027ef6d8e 100644 --- a/packages/app/.umirc.ts +++ b/packages/app/.umirc.ts @@ -6,24 +6,25 @@ dotenv.config({ path: path.resolve(__dirname, '../../.env'), }); -console.log('process.env.API_PORT', process.env.API_PORT); - export default defineConfig({ - title: false, nodeModulesTransform: { type: 'none', }, define: { - 'process.env.API': `/api`, - // 'process.env.API': `http://localhost:${process.env.API_PORT}/api`, + 'process.env.API_URL': process.env.API_URL, + 'process.env.API_PORT': process.env.API_PORT, }, proxy: { '/api': { 'target': `http://localhost:${process.env.API_PORT}/`, 'changeOrigin': true, - 'pathRewrite': { '^/api' : '/api' }, + 'pathRewrite': { '^/api': '/api' }, }, }, + routes: [ + { path: '/', exact: false, component: '@/pages/index' }, + ], + fastRefresh: {}, locale: { default: 'zh-CN', // antd: false, @@ -31,11 +32,4 @@ export default defineConfig({ baseNavigator: false, baseSeparator: '-', }, - routes: [ - { - exact: false, - path: '/:path(.*)', - component: '@/pages/index', - }, - ], }); diff --git a/packages/app/README.md b/packages/app/README.md old mode 100755 new mode 100644 index e521300a000ee6304a64bc031fdc608ad680223f..07afeb7fd6d717d5a30fc7453c91a0f7a8ee71ba --- a/packages/app/README.md +++ b/packages/app/README.md @@ -1,11 +1,11 @@ -# NocoBase Application +# umi project ## Getting Started Install dependencies, ```bash -$ yarn install +$ yarn ``` Start the dev server, diff --git a/packages/app/package.json b/packages/app/package.json index cd64587521d5f59e31beb0fb23d37021ee354a03..a576eb5d24bc12f3586a065174cfb6541e60fe10 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,10 +1,15 @@ { - "name": "@nocobase/app", - "version": "0.4.0-alpha.7", + "name": "nocobase-app", + "private": true, "scripts": { - "start": "concurrently \"cd ../../ && nodemon\" \"umi dev\"", - "dev": "umi dev", - "build": "umi build", + "start": "concurrently \"npm run start-server\" \"umi dev\"", + "start-client": "umi dev", + "start-server": "ts-node-dev -r dotenv/config --project tsconfig.apis.json ./src/apis/index.ts", + "nocobase": "ts-node-dev -r dotenv/config --project tsconfig.apis.json ./src/apis/index.ts", + "serve": "node -r dotenv/config ./lib/apis/index.js", + "build": "npm run build-server && npm run build-client", + "build-client": "umi build", + "build-server": "rimraf -rf lib && tsc --project tsconfig.apis.json", "postinstall": "node ./umi.js generate tmp", "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", "test": "umi-test", @@ -21,34 +26,35 @@ "prettier --parser=typescript --write" ] }, + "dependencies": { + "@nocobase/plugin-action-logs": "^0.5.0-alpha.16", + "@nocobase/plugin-china-region": "^0.5.0-alpha.16", + "@nocobase/plugin-client": "^0.5.0-alpha.16", + "@nocobase/plugin-collections": "^0.5.0-alpha.16", + "@nocobase/plugin-export": "^0.5.0-alpha.16", + "@nocobase/plugin-file-manager": "^0.5.0-alpha.16", + "@nocobase/plugin-multi-apps": "^0.5.0-alpha.16", + "@nocobase/plugin-permissions": "^0.5.0-alpha.16", + "@nocobase/plugin-system-settings": "^0.5.0-alpha.16", + "@nocobase/plugin-ui-router": "^0.5.0-alpha.16", + "@nocobase/plugin-ui-schema": "^0.5.0-alpha.16", + "@nocobase/plugin-users": "^0.5.0-alpha.16", + "@nocobase/server": "^0.5.0-alpha.16" + }, "devDependencies": { - "@ant-design/pro-layout": "^5.0.12", - "@formily/antd-components": "^1.3.6", - "@lourenci/react-kanban": "^2.1.0", - "@nocobase/client": "^0.4.0-alpha.7", - "@types/react-big-calendar": "^0.24.8", + "@nocobase/client": "^0.5.0-alpha.16", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", "@umijs/preset-react": "1.x", - "@umijs/test": "^3.2.23", - "ahooks": "^2.9.3", - "antd": "^4.13.0", - "array-move": "^3.0.1", - "attr-accept": "^2.2.2", - "clean-deep": "^3.4.0", + "@umijs/test": "^3.4.15", "concurrently": "^5.3.0", - "lint-staged": "^10.0.7", - "marked": "^2.0.0", - "nodemon": "^2.0.6", - "prettier": "^1.19.1", - "react": "16.14.0", - "react-big-calendar": "^0.30.0", - "react-dom": "16.14.0", - "react-drag-listview": "^0.1.8", - "react-image-lightbox": "^5.1.1", - "react-sortable-hoc": "^1.11.0", - "react-to-print": "^2.12.3", - "styled-components": "^4.1.1", - "umi": "^3.2.23", + "cross-env": "^7.0.3", + "mockjs": "^1.1.0", + "prettier": "^2.2.0", + "react": "17.x", + "react-dom": "17.x", + "ts-node-dev": "^1.1.8", + "umi": "^3.0.0", "yorkie": "^2.0.0" - }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + } } diff --git a/packages/app/src/api-client.ts b/packages/app/src/api-client.ts deleted file mode 100644 index b3e190dcde6247e27833dc82d636aaaf17e53d2e..0000000000000000000000000000000000000000 --- a/packages/app/src/api-client.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { request } from 'umi'; - -interface ActionParams { - resourceKey?: string | number; - // resourceName?: string; - // associatedName?: string; - associatedKey?: string | number; - fields?: any; - filter?: any; - values?: any; - page?: any; - perPage?: any; - [key: string]: any; -} - -interface Resource { - get: (params?: ActionParams, options?: any) => Promise; - list: (params?: ActionParams, options?: any) => Promise; - create: (params?: ActionParams, options?: any) => Promise; - update: (params?: ActionParams, options?: any) => Promise; - destroy: (params?: ActionParams, options?: any) => Promise; - [name: string]: (params?: ActionParams, options?: any) => Promise; -} - -// TODO 待改进,提供一个封装度更完整的 SDK,request 可以自由替换 -class ApiClient { - resource(name: string): Resource { - const proxy: any = new Proxy( - {}, - { - get(target, method, receiver) { - return (params: ActionParams = {}, options: any = {}) => { - let { - associatedKey, - resourceKey, - filter, - sorter, - sort = [], - values, - ...restParams - } = params; - let url = `/${name}`; - sort = sort || []; - options.params = restParams; - if (['list', 'get', 'export'].indexOf(method as string) !== -1) { - options.method = 'get'; - } else { - options.method = 'post'; - options.data = values; - } - if (associatedKey) { - url = `/${name.split('.').join(`/${associatedKey}/`)}`; - } - url += `:${method as string}`; - // console.log(name, name.split('.'), associatedKey, name.split('.').join(`/${associatedKey}/`)); - if (resourceKey) { - url += `/${resourceKey}`; - } - if (filter) { - options.params['filter'] = JSON.stringify(filter); - } - if (sorter) { - sort = []; - const arr = Array.isArray(sorter) ? sorter : [sorter]; - arr.forEach(({ order, field }) => { - if (order === 'descend') { - sort.push(`-${field}`); - } else if (order === 'ascend') { - sort.push(field); - } - }); - } - if (sort.length === 0) { - delete options.params['sort']; - } else { - options.params['sort'] = sort.join(','); - } - console.log({ url, params }); - return request(url, options); - }; - }, - }, - ); - return proxy; - } -} - -const api = new ApiClient(); - -export default api; diff --git a/packages/app/src/apis/index.ts b/packages/app/src/apis/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e948f732237676854d44bae5b449dd13f6bc3012 --- /dev/null +++ b/packages/app/src/apis/index.ts @@ -0,0 +1,84 @@ +import Server from '@nocobase/server'; +import path from 'path'; + +const start = Date.now(); + +const api = new Server({ + database: process.env.DB_DIALECT === 'sqlite' ? { + dialect: process.env.DB_DIALECT as any, + storage: path.resolve(process.cwd(), './db.sqlite'), + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + define: {}, + sync: { + force: false, + alter: { + drop: false, + }, + }, + } : { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + pool: { + max: 5, + min: 0, + acquire: 60000, + idle: 10000, + }, + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + define: {}, + sync: { + force: false, + alter: { + drop: false, + }, + }, + }, + resourcer: { + prefix: '/api', + }, +}); + +const plugins = [ + '@nocobase/plugin-ui-router', + '@nocobase/plugin-ui-schema', + '@nocobase/plugin-collections', + '@nocobase/plugin-users', + '@nocobase/plugin-action-logs', + '@nocobase/plugin-file-manager', + '@nocobase/plugin-permissions', + '@nocobase/plugin-export', + '@nocobase/plugin-system-settings', + '@nocobase/plugin-china-region', +]; + +const libDir = __filename.endsWith('.ts') ? 'src' : 'lib'; + +for (const plugin of plugins) { + api.plugin( + require(`${plugin}/${libDir}/server`).default, + ); +} + +api.plugin( + require(`@nocobase/plugin-client/${libDir}/server`).default, { + dist: path.resolve(process.cwd(), './dist'), + // importDemo: true, +}); + +if (process.argv.length < 3) { + // @ts-ignore + process.argv.push('start', '--port', process.env.API_PORT); +} + + +api.parse(process.argv).then(() => { + console.log(`Start-up time: ${(Date.now() - start) / 1000}s`); +}); diff --git a/packages/app/src/app.ts b/packages/app/src/app.ts index 1ddd3c01a75364b8ae49fab35c9daf65390c7cef..817ee6ce324f975d238511894cf3c8286e9541a4 100644 --- a/packages/app/src/app.ts +++ b/packages/app/src/app.ts @@ -1,77 +1 @@ import './css_browser_selector'; -import { RequestConfig, request as umiRequest, history } from 'umi'; - -import { configResponsive } from 'ahooks'; - -configResponsive({ - small: 0, - middle: 800, - large: 1200, -}); - -export const request: RequestConfig = { - prefix: process.env.API, - errorConfig: { - adaptor: resData => { - return { - ...resData, - success: true, - showType: 0, - }; - }, - }, - middlewares: [ - async (ctx, next) => { - const { headers } = ctx.req.options as any; - const token = localStorage.getItem('NOCOBASE_TOKEN'); - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - await next(); - }, - ], -}; - -// TODO:目前这块是写在代码里的,待改进 -const pathnames = ['/login', '/register', '/lostpassword', '/resetpassword']; - -export async function getInitialState() { - const { pathname, search } = location; - console.log(location); - const { data: systemSettings = {} } = await umiRequest( - '/system_settings:get?fields[appends]=logo,logo.storage', - { - method: 'get', - }, - ); - let redirect = `?redirect=${pathname}${search}`; - - if (!pathnames.includes(pathname)) { - try { - const { data = {} } = await umiRequest('/users:check', { - method: 'post', - }); - - if (!data.id) { - history.push('/login' + redirect); - return { - systemSettings, - currentUser: {}, - }; - } - - return { - systemSettings, - currentUser: data, - }; - } catch (error) { - console.log(error); - history.push('/login' + redirect); - } - } - - return { - systemSettings, - currentUser: {}, - }; -} diff --git a/packages/app/src/components/actions/index.tsx b/packages/app/src/components/actions/index.tsx deleted file mode 100644 index 98c32ae9d7d4d86e75d93d4bff51cae0fac38278..0000000000000000000000000000000000000000 --- a/packages/app/src/components/actions/index.tsx +++ /dev/null @@ -1,379 +0,0 @@ -import React, { useState } from 'react'; -import { Space, Button, Popconfirm, Popover } from 'antd'; -import { - FilterOutlined, - PlusOutlined, - SelectOutlined, - DeleteOutlined, - PrinterOutlined, - ExportOutlined, -} from '@ant-design/icons'; -import Drawer from '@/components/drawer'; -import View from '@/components/views'; -import get from 'lodash/get'; -import set from 'lodash/set'; -import ReactToPrint from 'react-to-print'; -import api from '@/api-client'; -import './style.less'; - -const ACTIONS = new Map(); - -export function Create(props) { - const { size, onFinish, schema = {}, associatedKey, ...restProps } = props; - const { title, pageTitle, viewName, transform, componentProps = {} } = schema; - return ( - <> - - - ); -} - -export function Update(props) { - const { onFinish, data, schema = {}, associatedKey, ...restProps } = props; - const { title, viewName } = schema; - return ( - <> - - - ); -} - -export function Add(props) { - const { size, onFinish, schema = {}, associatedKey, ...restProps } = props; - console.log({ associatedKey }, 'add'); - const { filter, title, viewName, transform, componentProps = {} } = schema; - return ( - <> - - - - - - ); - }, - }); - }} - icon={} - {...componentProps} - > - {title} - - - ); -} - -export function Destroy(props) { - const { size, schema = {}, onFinish } = props; - const { title, componentProps = {} } = schema; - return ( - { - onFinish && (await onFinish()); - }} - > - - - ); -} - -export function Filter(props) { - const { schema = {}, onFinish } = props; - const { title, fields = [] } = schema; - const [visible, setVisible] = useState(false); - const [data, setData] = useState({}); - const [filterCount, setFilterCount] = useState(0); - console.log('Filter', { visible, data }); - - return ( - <> - {visible && ( -
setVisible(false)} - >
- )} - { - setVisible(visible); - }} - className={'filters-popover'} - style={{}} - overlayStyle={{ - minWidth: 500, - }} - content={ - <> - { - if (values) { - const items = values.filter.and || values.filter.or; - setFilterCount(Array.isArray(items) ? items.length : 0); - setData(values); - onFinish && (await onFinish(values)); - } - setVisible(false); - }} - schema={{ - type: 'filterForm', - fields: [ - { - dataIndex: ['filter'], - name: 'filter', - interface: 'json', - type: 'json', - component: { - type: 'filter', - 'x-component-props': { - fields, - }, - }, - }, - ], - }} - /> - - } - > - - - - ); -} - -export function Print(props) { - const { schema = {}, contentRef } = props; - const { title, buttonProps = {} } = schema; - return ( - ( - - )} - content={() => contentRef.current} - pageStyle={` - @page { - margin: 1cm; - } - table { page-break-inside:auto } - tr { page-break-inside:avoid; page-break-after:auto } - `} - documentTitle={' '} - /> - ); -} - -export function Export(props) { - const { schema = {}, onFinish } = props; - const { title, buttonProps = {} } = schema; - return ( - - ); -} - -export function Actions(props) { - const { onTrigger = {}, actions = [], style, ...restProps } = props; - return ( - actions.length > 0 && ( -
- {actions.map( - action => - ACTIONS.has(action.type) && ( -
- -
- ), - )} -
- ) - ); -} - -export default Actions; - -export function registerAction(type: string, Action: any) { - ACTIONS.set(type, Action); -} - -export function getAction(type: string) { - return ACTIONS.get(type); -} - -export function Action(props) { - const { schema = {} } = props; - // cnsole.log(schema); - const { type } = schema; - const Component = getAction(type); - return Component && ; -} - -registerAction('add', Add); -registerAction('update', Update); -registerAction('create', Create); -registerAction('destroy', Destroy); -registerAction('filter', Filter); -registerAction('print', Print); -registerAction('export', Export); diff --git a/packages/app/src/components/actions/style.less b/packages/app/src/components/actions/style.less deleted file mode 100644 index d226bbbbf9fed7e1341ee65b0928ee97b3d8aabf..0000000000000000000000000000000000000000 --- a/packages/app/src/components/actions/style.less +++ /dev/null @@ -1,15 +0,0 @@ -.action-buttons { - display: flex; - // justify-content: flex-end; - min-height: 32px; - flex-direction: row-reverse; - align-items: flex-start; - .action-button { - margin-left: 8px; - } - .filter-action-button { - position: absolute; - left: 24px; - margin-left: 0; - } -} \ No newline at end of file diff --git a/packages/app/src/components/drawer/index.tsx b/packages/app/src/components/drawer/index.tsx deleted file mode 100644 index 31d21314febca3fc2e5cf3fbafe530cb28f2f614..0000000000000000000000000000000000000000 --- a/packages/app/src/components/drawer/index.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import React, { Fragment, useLayoutEffect, useRef, useState } from 'react'; -import ReactDOM, { createPortal } from 'react-dom'; -import { isNum, isStr, isBool, isFn } from '@formily/shared'; -import { Modal, Drawer } from 'antd'; -import { DrawerProps } from 'antd/lib/drawer'; -import { useContext } from 'react'; -import { ConfigProvider } from 'antd'; -import zhCN from 'antd/lib/locale/zh_CN'; - -export const usePrefixCls = ( - tag?: string, - props?: { - prefixCls?: string; - }, -) => { - const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); - return getPrefixCls(tag, props?.prefixCls); -}; - -type DrawerTitle = string | number | React.ReactElement; - -const isDrawerTitle = (props: any): props is DrawerTitle => { - return ( - isNum(props) || isStr(props) || isBool(props) || React.isValidElement(props) - ); -}; - -const getDrawerProps = (props: any): DrawerProps => { - if (isDrawerTitle(props)) { - return { - title: props, - }; - } else { - return props; - } -}; - -const createElement = (content, props?: any) => { - if (!content) { - return null; - } - if (typeof content === 'string') { - return content; - } - if (React.isValidElement(content)) { - return content; - } - return React.createElement(content, props); -}; - -export interface IFormDrawer { - open(props?: any): void; - close(): void; -} - -export function FormDrawer(title: DrawerProps, content: any): IFormDrawer; -export function FormDrawer(title: DrawerTitle, content: any): IFormDrawer; -export function FormDrawer(title: any, content: any): IFormDrawer { - document.querySelectorAll('.env-root').forEach(el => { - el.className = 'env-root env-root-push'; - }); - const env = { - root: document.createElement('div'), - promise: null, - }; - env.root.className = 'env-root'; - const props = getDrawerProps(title); - const drawer = { - width: '75%', - ...props, - onClose: (e: any) => { - props?.onClose?.(e); - formDrawer.close(); - }, - afterVisibleChange: (visible: boolean) => { - props?.afterVisibleChange?.(visible); - if (visible) return; - ReactDOM.unmountComponentAtNode(env.root); - env.root?.parentNode?.removeChild(env.root); - env.root = undefined; - }, - }; - - const formDrawer = { - open: (props: any) => { - render( - false, - () => { - formDrawer.closeWithConfirm = false; - formDrawer.close(); - }, - () => { - formDrawer.close(); - }, - ); - setTimeout(() => { - render( - true, - () => { - formDrawer.closeWithConfirm = false; - formDrawer.close(); - }, - () => { - formDrawer.close(); - }, - ); - }); - }, - close: () => { - if (!env.root) return; - if (formDrawer.closeWithConfirm) { - Modal.confirm({ - title: '表单内容发生变化,确定不保存吗?', - okText: '确定', - cancelText: '取消', - onOk() { - formDrawer.closeWithConfirm = false; - const els = document.querySelectorAll('.env-root-push'); - if (els.length) { - const last = els[els.length - 1]; - last.className = 'env-root'; - } - render(false); - }, - }); - } else { - const els = document.querySelectorAll('.env-root-push'); - if (els.length) { - const last = els[els.length - 1]; - last.className = 'env-root'; - } - render(false); - } - }, - closeWithConfirm: false, - }; - - const closeWithConfirm = bool => { - formDrawer.closeWithConfirm = bool; - }; - - const render = (visible = true, resolve?: () => any, reject?: () => any) => { - ReactDOM.render( - - - {createElement(content, { - resolve, - reject, - closeWithConfirm, - })} - - , - env.root, - ); - }; - document.body.appendChild(env.root); - - return formDrawer; -} - -const DrawerFooter: React.FC = props => { - const ref = useRef(); - const [footer, setFooter] = useState(); - const footerRef = useRef(); - const prefixCls = usePrefixCls('drawer'); - useLayoutEffect(() => { - const content = ref.current?.closest(`.${prefixCls}-wrapper-body`); - if (content) { - if (!footerRef.current) { - footerRef.current = content.querySelector(`.${prefixCls}-footer`); - if (!footerRef.current) { - footerRef.current = document.createElement('div'); - footerRef.current.classList.add(`${prefixCls}-footer`); - content.appendChild(footerRef.current); - } - } - setFooter(footerRef.current); - } - }); - - footerRef.current = footer; - - return ( -
- {footer && createPortal(props.children, footer)} -
- ); -}; - -FormDrawer.open = props => { - const { content, visible, ...rest } = props; - return FormDrawer(rest, content).open({ visible }); -}; - -FormDrawer.Footer = DrawerFooter; - -export default FormDrawer; diff --git a/packages/app/src/components/fields/array-cards/index.tsx b/packages/app/src/components/fields/array-cards/index.tsx deleted file mode 100644 index 41e78d7525ea9f4177766898561f291824bc85fd..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/array-cards/index.tsx +++ /dev/null @@ -1,200 +0,0 @@ -import React, { Fragment } from 'react'; -import { - ISchemaFieldComponentProps, - SchemaField, -} from '@formily/react-schema-renderer'; -import { toArr, isFn, FormPath } from '@formily/shared'; -import { ArrayList } from '@formily/react-shared-components'; -import { CircleButton } from '../circle-button'; -import { TextButton } from '../text-button'; -import { Card } from 'antd'; -import { - PlusOutlined, - DeleteOutlined, - DownOutlined, - UpOutlined, -} from '@ant-design/icons'; -import styled from 'styled-components'; - -const ArrayComponents = { - CircleButton, - TextButton, - AdditionIcon: () => , - RemoveIcon: () => , - MoveDownIcon: () => , - MoveUpIcon: () => , -}; - -export const ArrayCards: any = styled( - (props: ISchemaFieldComponentProps & { className: string }) => { - const { value, schema, className, editable, path, mutators } = props; - const { - renderAddition, - renderRemove, - renderMoveDown, - renderMoveUp, - renderEmpty, - renderExtraOperations, - ...componentProps - } = schema.getExtendsComponentProps() || {}; - - const schemaItems = Array.isArray(schema.items) - ? schema.items[schema.items.length - 1] - : schema.items; - - const onAdd = () => { - if (schemaItems) { - mutators.push(schemaItems.getEmptyValue()); - } - }; - return ( -
- - {toArr(value).map((item, index) => { - return ( - - {index + 1} - . {componentProps.title || schema.title} - - } - extra={ - - mutators.remove(index)} - /> - mutators.moveDown(index)} - /> - mutators.moveUp(index)} - /> - {isFn(renderExtraOperations) - ? renderExtraOperations(index) - : renderExtraOperations} - - } - > - {schemaItems && ( - - )} - - ); - })} - - {({ children, allowAddition }) => { - return ( - -
{children}
-
- ); - }} -
- - {({ children, isEmpty }) => { - if (!isEmpty) { - return ( -
- {children} -
- ); - } - }} -
-
-
- ); - }, -)` - width: 100%; - .ant-card { - .ant-card { - box-shadow: none; - } - .ant-card-body { - padding: 20px 10px 0 10px; - } - .array-cards-addition { - box-shadow: none; - border: 1px solid #eee; - transition: all 0.35s ease-in-out; - &:hover { - border: 1px solid #ccc; - } - } - .empty-wrapper { - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 10px; - img { - height: 85px; - } - .ant-btn { - color: #888; - } - } - } - .card-list-empty.card-list-item.add-pointer { - cursor: pointer; - } - - .array-cards-addition { - margin-top: 10px; - margin-bottom: 3px; - background: #fff; - display: flex; - cursor: pointer; - padding: 5px 0; - justify-content: center; - box-shadow: 1px 1px 4px 0 rgba(0, 0, 0, 0.1); - } - .card-list-item { - margin-top: 10px; - border: 1px solid #eee; - } - .card-list-item:first-child { - margin-top: 0 !important; - } - .ant-card-extra { - display: flex; - button { - margin-right: 8px; - } - } -`; - -ArrayCards.isFieldComponent = true; - -export default ArrayCards; diff --git a/packages/app/src/components/fields/array-cards/style.ts b/packages/app/src/components/fields/array-cards/style.ts deleted file mode 100644 index d9079150a1cb08a6178a06d8dbc779481358796f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/array-cards/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/card/style/index'; diff --git a/packages/app/src/components/fields/array-table/index.tsx b/packages/app/src/components/fields/array-table/index.tsx deleted file mode 100644 index a7e1fa787346e8e547157ea0ecc1f0fb3dc65134..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/array-table/index.tsx +++ /dev/null @@ -1,238 +0,0 @@ -import React, { useContext } from 'react'; -import { - ISchemaFieldComponentProps, - SchemaField, - Schema, - complieExpression, - FormExpressionScopeContext, -} from '@formily/react-schema-renderer'; -import { toArr, isFn, isArr, FormPath } from '@formily/shared'; -import { ArrayList, DragListView } from '@formily/react-shared-components'; -import { CircleButton } from '../circle-button'; -import { TextButton } from '../text-button'; -import { Table, Form, Button } from 'antd'; -import { FormItemShallowProvider } from '@formily/antd'; -import { - PlusOutlined, - DeleteOutlined, - DownOutlined, - UpOutlined, -} from '@ant-design/icons'; -import styled from 'styled-components'; - -const ArrayComponents = { - CircleButton, - TextButton, - AdditionIcon: () => ( - <> - 新增 - - ), - RemoveIcon: () => , - MoveDownIcon: () => , - MoveUpIcon: () => , -}; - -const DragHandler = styled.span` - width: 7px; - display: inline-block; - height: 14px; - border: 2px dotted #c5c5c5; - border-top: 0; - border-bottom: 0; - cursor: move; - margin-bottom: 24px; -`; - -export const ArrayTable: any = styled( - (props: ISchemaFieldComponentProps & { className: string }) => { - const expressionScope = useContext(FormExpressionScopeContext); - const { value, schema, className, editable, path, mutators } = props; - const { - renderAddition, - renderRemove, - renderMoveDown, - renderMoveUp, - renderEmpty, - renderExtraOperations, - operationsWidth, - operations, - draggable, - ...componentProps - } = schema.getExtendsComponentProps() || {}; - const schemaItems = Array.isArray(schema.items) - ? schema.items[schema.items.length - 1] - : schema.items; - const onAdd = () => { - if (schemaItems) { - mutators.push(schemaItems.getEmptyValue()); - } - }; - const onMove = (dragIndex, dropIndex) => { - mutators.move(dragIndex, dropIndex); - }; - const renderColumns = (items: Schema) => { - return items.mapProperties((props, key) => { - const itemProps = { - ...props.getExtendsItemProps(), - ...props.getExtendsProps(), - }; - return { - title: complieExpression(props.title, expressionScope), - ...itemProps, - key, - dataIndex: key, - render: (value: any, record: any, index: number) => { - const newPath = FormPath.parse(path).concat(index, key); - return ( - - - - ); - }, - }; - }); - }; - // 兼容异步items schema传入 - let columns = []; - if (schema.items) { - columns = isArr(schema.items) - ? schema.items.reduce((buf, items) => { - return buf.concat(renderColumns(items)); - }, []) - : renderColumns(schema.items); - } - if (editable && operations !== false) { - columns.push({ - ...operations, - key: 'operations', - dataIndex: 'operations', - width: operationsWidth || 200, - render: (value: any, record: any, index: number) => { - return ( - -
- mutators.remove(index)} - /> - mutators.moveDown(index)} - /> - mutators.moveUp(index)} - /> - {isFn(renderExtraOperations) - ? renderExtraOperations(index) - : renderExtraOperations} -
-
- ); - }, - }); - } - if (draggable) { - columns.unshift({ - width: 20, - key: 'dragHandler', - render: () => { - return ; - }, - }); - } - const renderTable = () => { - return ( - { - return toArr(value).indexOf(record); - }} - pagination={false} - columns={columns} - dataSource={toArr(value)} - >
- ); - }; - return ( -
- - {draggable ? ( - - {renderTable()} - - ) : ( - renderTable() - )} - - {({ children }) => { - return ( - children && ( -
- {children} -
- ) - ); - }} -
-
-
- ); - }, -)` - width: 100%; - margin-bottom: 10px; - table { - margin-bottom: 0 !important; - } - .array-table-addition { - background: #fbfbfb; - cursor: pointer; - margin-top: 3px; - border-radius: 3px; - .next-btn-text { - color: #888; - } - .next-icon:before { - width: 16px !important; - font-size: 16px !important; - margin-right: 5px; - } - } - .ant-btn { - color: #888; - } - .array-item-operator { - display: flex; - button { - margin-right: 8px; - } - } -`; - -ArrayTable.isFieldComponent = true; - -export default ArrayTable; diff --git a/packages/app/src/components/fields/array-table/style.ts b/packages/app/src/components/fields/array-table/style.ts deleted file mode 100644 index fb324a70cafef76a3827fc0e789eaba46f217595..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/array-table/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/table/style/index'; diff --git a/packages/app/src/components/fields/automations/index.tsx b/packages/app/src/components/fields/automations/index.tsx deleted file mode 100644 index bd7e6849b599452d5c18f3115a52f1c78d14878e..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/automations/index.tsx +++ /dev/null @@ -1,361 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import { - Button, - Select, - DatePicker, - Tag, - InputNumber, - TimePicker, - Input, -} from 'antd'; -import { - Select as AntdSelect, - mapStyledProps, - mapTextComponent, -} from '../shared'; -import moment from 'moment'; -import './style.less'; -import api from '@/api-client'; -import { useRequest } from 'umi'; - -export const DateTime = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(props => { - const { associatedKey, automationType, filter, onChange } = props; - const [aKey, setaKey] = useState(associatedKey); - const [aType, setaType] = useState(automationType); - console.log('Automations.DateTime', aKey, associatedKey); - const [value, setValue] = useState(props.value || {}); - const [offsetType, setOffsetType] = useState(() => { - if (!value.offset) { - return 'current'; - } - if (value.offset > 0) { - return 'after'; - } - if (value.offset < 0) { - return 'before'; - } - return 'current'; - }); - - useEffect(() => { - if (associatedKey !== aKey || automationType !== aType) { - setOffsetType('current'); - setValue({ - value: null, - byField: null, - offset: 0, - unit: undefined, - }); - onChange({ - value: null, - byField: null, - offset: 0, - unit: undefined, - }); - setaKey(associatedKey); - } - }, [associatedKey, automationType, aKey, aType]); - const { data = [], loading = true } = useRequest( - () => { - return associatedKey && automationType !== 'schedule' - ? api.resource('collections.fields').list({ - associatedKey, - filter: filter || { - type: 'date', - }, - }) - : Promise.resolve({ data: [] }); - }, - { - refreshDeps: [associatedKey, automationType, filter], - }, - ); - console.log({ data }); - return ( -
-
- {automationType === 'schedule' ? ( - { - onChange({ value: m.toISOString() }); - setValue({ value: m.toISOString() }); - // console.log('Automations.DateTime', m.toISOString(), {m, dateString}) - }} - defaultValue={(() => { - if (!value.value) { - return undefined; - } - const m = moment(value.value); - return m.isValid() ? m : undefined; - })()} - /> - ) : ( - - - - {offsetType !== 'current' && ( - { - const values = { - unit: 'day', - ...value, - }; - if (offsetType === 'before') { - values.offset = -1 * Math.abs(offset); - } else if (offsetType === 'after') { - values.offset = Math.abs(offset); - } - setValue(values); - onChange(values); - console.log('Automations.DateTime', values); - // console.log(offsetType); - }} - placeholder={'数字'} - /> - )} - {offsetType !== 'current' && ( - - )} - {offsetType !== 'current' && - value.unit && - ['day', 'week', 'month'].indexOf(value.unit) !== -1 && ( - { - const m = moment(value.time, 'HH:mm:ss'); - return m.isValid() ? m : undefined; - })()} - onChange={(m, dateString) => { - console.log('Automations.DateTime', m, dateString); - setValue({ ...value, time: dateString }); - onChange({ ...value, time: dateString }); - }} - /> - )} - - )} -
-
- ); -}); - -const cronmap = { - none: '不重复', - everysecond: '每秒', - everyminute: '每分钟', - everyhour: '每小时', - everyday: '每天', - everyweek: '每周', - everymonth: '每月', - custom: '自定义', -}; - -export const Cron = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(props => { - const { value, onChange } = props; - - console.log('Automations.DateTime', { value }); - - const re = /every_(\d+)_(.+)/i; - - const match = cronmap[value] ? null : re.exec(value); - - const [unit, setUnit] = useState(match ? match[2] : 'days'); - const [num, setNum] = useState(match ? parseInt(match[1]) : undefined); - const [cron, setCron] = useState(() => { - if (!value) { - return 'none'; - } - return match ? 'custom' : cronmap[value]; - }); - - return ( -
- - - {cron === 'custom' && ( - { - const v = parseInt(e.target.value); - setNum(v); - onChange(`every_${v}_${unit}`); - }} - defaultValue={num} - addonBefore={'每'} - /> - )} - {cron === 'custom' && ( - - )} - -
- ); -}); - -export const EndMode = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(props => { - const { value = 'none', onChange, automationType } = props; - const re = /after_(\d+)_times/i; - const match = re.exec(value); - - const [mode, setMode] = useState(() => { - if (automationType === 'schedule' && value === 'byField') { - return 'none'; - } else if ( - automationType === 'collections:schedule' && - value === 'customTime' - ) { - return 'none'; - } - - return match ? 'times' : value; - }); - - const [num, setNum] = useState(match ? parseInt(match[1]) : undefined); - - useEffect(() => { - if (automationType === 'schedule' && value === 'byField') { - setMode('none'); - onChange('none'); - } else if ( - automationType === 'collections:schedule' && - value === 'customTime' - ) { - setMode('none'); - onChange('none'); - } - }, [automationType]); - console.log('Automations.DateTime', { value, automationType, mode }); - - return ( -
- - - {mode === 'times' && ( - { - const v = parseInt(e.target.value); - setNum(v); - onChange(`after_${v}_times`); - }} - defaultValue={num} - addonAfter={'次'} - /> - )} - -
- ); -}); - -export const Automations = { - DateTime, - Cron, - EndMode, -}; diff --git a/packages/app/src/components/fields/automations/style.less b/packages/app/src/components/fields/automations/style.less deleted file mode 100644 index 6848a12ab2eff4e0193b0a16158e7a8251263264..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/automations/style.less +++ /dev/null @@ -1,5 +0,0 @@ -.ant-input-group.ant-input-group-compact { - .ant-input-group-wrapper { - width: 120px; - } -} diff --git a/packages/app/src/components/fields/cascader/index.tsx b/packages/app/src/components/fields/cascader/index.tsx deleted file mode 100644 index e0db0c5be2d448fcf947815c4a91ce34b063c408..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/cascader/index.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import { Cascader as AntdCascader } from 'antd'; -import { useRequest } from 'umi'; -import api from '@/api-client'; -import { - transformDataSourceKey, - mapStyledProps, - mapTextComponent, -} from '../shared'; - -function findTreeNode( - tree, - values, - { value = 'value', children = 'children' }, -) { - let node, i; - for (node = tree, i = 0; node && values[i]; i++) { - node = (node[children] || []).find( - item => item[value] === values[i][value], - ); - } - - return node; -} - -export const Cascader = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(function(props) { - const { - disabled, - // target, - // labelField, - // valueField = 'id', - // parentField, - // maxLevel, - // changeOnSelect, - value = [], - onChange, - schema = {}, - placeholder, - // TODO(feature): 增加静态数据支持 - // dataSource: [] - } = props; - const { - target, - targetKey: valueField, - // 值字段 - // valueField: 'code', - // 名称字段 - labelField, - // TODO(refactor): 等 toWhere 重构完成后要改成 parent - // 上级字段名 - parentField, - maxLevel, - // valueField = 'id', - // 深度限制,默认:-1(代表不控制,即如果是数据表,则无限加载) - // limit: -1, - // 可选层级,默认:-1(代表可选的最深层级) - // maxLevel: null, - // 是否可以不选择到最深一级 - // 'x-component-props': { changeOnSelect: true } - incompletely: changeOnSelect, - } = schema; - - const fieldNames = { - label: labelField, - value: valueField, - children: 'children', - }; - const [options, setOptions] = useState([]); - - const { loading, run } = useRequest( - async (selectedOptions = []) => { - if (maxLevel != null && selectedOptions.length >= maxLevel) { - return; - } - - const last = selectedOptions[selectedOptions.length - 1] || null; - if (last) { - if (last.isLeaf) { - return; - } - last.loading = true; - } - - return api.resource(target).list({ - filter: { - [parentField]: last && last[valueField], - }, - perPage: -1, - sort: [valueField], - }); - // TODO(bug): 关联资源加载问题较多,暂时先用 filter 解决 - // return api.resource(`${target}.${target}`).list({ - // associatedKey: last, - // perPage: -1 - // }); - }, - { - manual: true, - onSuccess(result, [selectedOptions = []]) { - if (!result) { - return; - } - - const data = result.map(item => ({ - ...item, - isLeaf: maxLevel != null && item.level >= maxLevel, - })); - // 找到已有值指向的 options 节点 - const root = { [fieldNames.children]: options }; - const node = findTreeNode(root, selectedOptions, fieldNames); - - if (node && node !== root) { - node.children = data; - node.loading = false; - // use spread array to avoid popup to be collapsed - setOptions([...options]); - } else { - setOptions(data); - } - }, - }, - ); - - // 根据 value 的值,按需预加载相应的数据 - useEffect(() => { - if (value.length) { - value.reduce( - (promise, option, i) => promise.then(() => run(value.slice(0, i))), - Promise.resolve(), - ); - } else { - run([]); - } - }, []); - - return ( - item[valueField])} - onChange={(v, selected) => { - if (maxLevel != null && v.length < maxLevel) { - run(selected); - } - if (changeOnSelect || !v.length || v.length >= maxLevel) { - onChange(selected); - } - }} - loadData={run} - changeOnSelect={changeOnSelect} - fieldNames={fieldNames} - /> - ); -}); - -export default Cascader; diff --git a/packages/app/src/components/fields/cascader/style.ts b/packages/app/src/components/fields/cascader/style.ts deleted file mode 100644 index f37dbb622eda89589426d513d07c6eff3fb32379..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/cascader/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/cascader/style/index'; diff --git a/packages/app/src/components/fields/checkbox/index.tsx b/packages/app/src/components/fields/checkbox/index.tsx deleted file mode 100644 index ac51049d233a02bc4daf3e2b14f94e54670eeb39..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/checkbox/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import { Checkbox as AntdCheckbox } from 'antd'; -import { - transformDataSourceKey, - mapStyledProps, - mapTextComponent, -} from '../shared'; - -export const Checkbox = connect<'Group'>({ - valueName: 'checked', - getProps: mapStyledProps, -})(AntdCheckbox); - -Checkbox.Group = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(transformDataSourceKey(AntdCheckbox.Group, 'options')); - -export default Checkbox; diff --git a/packages/app/src/components/fields/checkbox/style.ts b/packages/app/src/components/fields/checkbox/style.ts deleted file mode 100644 index f6374b7e70d9268581fe73430a2825214bb9cc8d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/checkbox/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/checkbox/style/index'; diff --git a/packages/app/src/components/fields/circle-button/index.tsx b/packages/app/src/components/fields/circle-button/index.tsx deleted file mode 100644 index 6db278c2f0574a402fdb6e8aa0cf8b8d73eb62c0..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/circle-button/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { Button } from 'antd'; -import { ButtonProps } from 'antd/lib/button'; - -export const CircleButton: React.FC = props => { - const hasText = String(props.className || '').indexOf('has-text') > -1; - return ( - {' '} - - {showDeleteButton && ( - - )} - - - - ); -} - -interface FieldOptions { - name: string; - title: string; - interface: string; - [key: string]: any; -} - -interface FilterItemProps { - fields: FieldOptions[]; - [key: string]: any; -} - -const OP_MAP = { - string: [ - { label: '包含', value: '$includes', selected: true }, - { label: '不包含', value: '$notIncludes' }, - { label: '等于', value: 'eq' }, - { label: '不等于', value: 'ne' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - number: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'ne' }, - { label: '大于', value: 'gt' }, - { label: '大于等于', value: 'gte' }, - { label: '小于', value: 'lt' }, - { label: '小于等于', value: 'lte' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - file: [ - { label: '存在', value: 'id.gt' }, - { label: '不存在', value: 'id.$null' }, - ], - boolean: [ - { label: '是', value: '$isTruly', selected: true }, - { label: '否', value: '$isFalsy' }, - ], - select: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'ne' }, - { label: '包含', value: 'in' }, - { label: '不包含', value: 'notIn' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - multipleSelect: [ - { label: '等于', value: '$match', selected: true }, - { label: '不等于', value: '$notMatch' }, - { label: '包含', value: '$anyOf' }, - { label: '不包含', value: '$noneOf' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - datetime: [ - { label: '等于', value: '$dateOn', selected: true }, - { label: '不等于', value: '$dateNotOn' }, - { label: '早于', value: '$dateBefore' }, - { label: '晚于', value: '$dateAfter' }, - { label: '不早于', value: '$dateNotBefore' }, - { label: '不晚于', value: '$dateNotAfter' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - // {label: '是今天', value: 'now'}, - // {label: '在今天之前', value: 'before_today'}, - // {label: '在今天之后', value: 'after_today'}, - ], - time: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'neq' }, - { label: '大于', value: 'gt' }, - { label: '大于等于', value: 'gte' }, - { label: '小于', value: 'lt' }, - { label: '小于等于', value: 'lte' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - // {label: '是今天', value: 'now'}, - // {label: '在今天之前', value: 'before_today'}, - // {label: '在今天之后', value: 'after_today'}, - ], - // linkTo: [ - // {label: '包含', value: 'cont'}, - // {label: '不包含', value: 'ncont'}, - // {label: '非空', value: '$notNull'}, - // {label: '为空', value: '$null'}, - // ], -}; - -const op = { - string: OP_MAP.string, - textarea: OP_MAP.string, - number: OP_MAP.number, - percent: OP_MAP.number, - datetime: OP_MAP.datetime, - date: OP_MAP.datetime, - time: OP_MAP.time, - checkbox: OP_MAP.boolean, - boolean: OP_MAP.boolean, - select: OP_MAP.select, - multipleSelect: OP_MAP.multipleSelect, - checkboxes: OP_MAP.multipleSelect, - radio: OP_MAP.select, - upload: OP_MAP.file, - attachment: OP_MAP.file, -}; - -const StringInput = props => { - const { value, onChange, ...restProps } = props; - return ( - { - onChange(e.target.value); - }} - /> - ); -}; - -const controls = { - string: StringInput, - textarea: StringInput, - number: InputNumber, - percent: props => ( - (value ? `${value}%` : '')} - parser={value => value.replace('%', '')} - {...props} - /> - ), - boolean: BooleanControl, - checkbox: BooleanControl, - select: OptionControl, - radio: OptionControl, - checkboxes: OptionControl, - multipleSelect: OptionControl, - time: TimeControl, - date: DateControl, -}; - -function DateControl(props: any) { - const { field, value, onChange, ...restProps } = props; - let format = field.dateFormat; - // if (field.showTime) { - // format += ` ${field.timeFormat}`; - // } - const m = moment(value, format); - return ( - { - onChange(value ? value.format('YYYY-MM-DD') : null); - }} - /> - ); - // return ( - // { - // onChange(value ? value.format(field.showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD') : null) - // }}/> - // ); -} - -function TimeControl(props: any) { - const { field, value, onChange, ...restProps } = props; - let format = field.timeFormat; - const m = moment(value, format); - return ( - { - onChange(value ? value.format('HH:mm:ss') : null); - }} - /> - ); -} - -function OptionControl(props) { - const { multiple = true, op, options, value, onChange, ...restProps } = props; - let mode: any = 'multiple'; - if (!multiple && ['eq', 'ne'].indexOf(op) !== -1) { - mode = undefined; - } - return ( - - ); -} - -function BooleanControl(props) { - const { value, onChange, ...restProps } = props; - return ( - { - onChange(e.target.value); - }} - > - - - - ); -} - -function NullControl(props) { - return null; -} - -function getComponentTypeByField(field) { - if (!field.component) { - return 'string'; - } - let componentType = field.component.type; - if (field.component.type === 'select' && field.multiple) { - componentType = 'multipleSelect'; - } - return componentType; -} - -export function FilterItem(props: FilterItemProps) { - const { - index, - fields = [], - sourceFields = [], - showDeleteButton = true, - onDelete, - onChange, - } = props; - const defaultField: any = - fields.find(field => field.name === props.dataSource.column) || {}; - const componentType = getComponentTypeByField(defaultField); - // const [type, setType] = useState(defaultField.interface || 'string'); - const [field, setField] = useState({}); - const [dataSource, setDataSource] = useState(props.dataSource || {}); - const [valueType, setValueType] = useState('custom'); - useEffect(() => { - const field = fields.find(field => field.name === props.dataSource.column); - if (field) { - setField(field); - // let componentType = getComponentTypeByField(field); - // setType(componentType); - } - setDataSource({ ...props.dataSource }); - if (/^{{.+}}$/.test(props.dataSource.value)) { - setValueType('ref'); - } - }, [props.dataSource]); - let ValueControl = controls[componentType] || controls.string; - if ( - ['$null', '$notNull', '$isTruly', '$isFalsy'].indexOf(dataSource.op) !== -1 - ) { - ValueControl = NullControl; - } - if (['boolean', 'checkbox'].indexOf(componentType) !== -1) { - ValueControl = NullControl; - } - // let multiple = true; - // if () - const opOptions = op[componentType || 'string'] || op.string; - console.log({ componentType, defaultField, field, valueType, opOptions }); - return ( - - - - {sourceFields.length > 0 && ( - - )} - {valueType !== 'ref' ? ( - { - onChange({ ...dataSource, value: value }); - }} - style={{ width: 180 }} - /> - ) : sourceFields.length > 0 ? ( - - ) : null} - {showDeleteButton && ( - - )} - - ); -} - -function toFilter(values: any) { - let filter: any; - let { type, andor = 'and', list = [], column, op, value } = values; - if (type === 'group') { - filter = { - [andor]: list.map(value => toFilter(value)).filter(Boolean), - }; - } else if (type === 'item' && column && op) { - if ( - [ - 'id.$null', - 'id.$notNull', - '$null', - '$notNull', - '$isTruly', - '$isFalsy', - ].indexOf(op) !== -1 - ) { - value = true; - } - // if (op === 'id.gt') { - // value = 0; - // } - filter = { - [`${column}`]: { [op]: value }, - }; - } - return filter; -} - -function toValues(filter: any = {}) { - let values: any = {}; - Object.keys(filter).forEach(key => { - const value = filter[key]; - if (Array.isArray(value)) { - values['andor'] = key; - values['type'] = 'group'; - values['list'] = value.map(v => toValues(v)); - } else if (typeof value === 'object') { - values['type'] = 'item'; - values['column'] = key; - values['op'] = Object.keys(value).shift(); - values['value'] = Object.values(value).shift(); - } - }); - return values; -} - -export const Filter = connect({ - getProps: mapStyledProps, -})(props => { - const dataSource = { - type: 'group', - list: [ - { - type: 'item', - }, - ], - }; - const { - value, - onChange, - associatedKey, - filter = {}, - sourceName, - sourceFilter = {}, - fields = [], - ...restProps - } = props; - console.log('filter', { associatedKey }); - const { data = [], loading = true } = useRequest( - () => { - return associatedKey - ? api.resource(`collections.fields`).list({ - associatedKey, - filter, - perPage: -1, - }) - : Promise.resolve({ - data: fields, - }); - }, - { - refreshDeps: [associatedKey], - }, - ); - - const { data: sourceFields = [] } = useRequest( - () => { - return sourceName - ? api.resource(`collections.fields`).list({ - associatedKey: sourceName, - filter: sourceFilter, - perPage: -1, - }) - : Promise.resolve({ - data: [], - }); - }, - { - refreshDeps: [sourceName], - }, - ); - console.log({ sourceName, sourceFields }); - - return ( - { - console.log(values); - onChange(toFilter(values)); - }} - {...restProps} - sourceFields={sourceFields} - fields={data.filter(item => item.filterable)} - /> - ); -}); - -export default Filter; diff --git a/packages/app/src/components/fields/filter/style.less b/packages/app/src/components/fields/filter/style.less deleted file mode 100644 index 54a1710ef7492e6aad5ba2119b8819dacf9b7053..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/filter/style.less +++ /dev/null @@ -1,3 +0,0 @@ -.filter-remove-link { - color: #d9d9d9; -} diff --git a/packages/app/src/components/fields/filter/useDynamicList.ts b/packages/app/src/components/fields/filter/useDynamicList.ts deleted file mode 100644 index 25aff471706d12cbe61c6dbd2d48e44aded1b659..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/filter/useDynamicList.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { useCallback, useRef, useState } from 'react'; - -export default (initialValue: T[]) => { - const counterRef = useRef(-1); - // key 存储器 - const keyList = useRef([]); - - // 内部方法 - const setKey = useCallback((index: number) => { - counterRef.current += 1; - keyList.current.splice(index, 0, counterRef.current); - }, []); - - const [list, setList] = useState(() => { - (initialValue || []).forEach((_, index) => { - setKey(index); - }); - return initialValue || []; - }); - - const resetList = (newList: T[] = []) => { - keyList.current = []; - counterRef.current = -1; - setList(() => { - (newList || []).forEach((_, index) => { - setKey(index); - }); - return newList || []; - }); - }; - - const insert = (index: number, obj: T) => { - setList(l => { - const temp = [...l]; - temp.splice(index, 0, obj); - setKey(index); - return temp; - }); - }; - - const getAll = () => list; - const getKey = (index: number) => keyList.current[index]; - const getIndex = (index: number) => - keyList.current.findIndex(ele => ele === index); - - const merge = (index: number, obj: T[]) => { - setList(l => { - const temp = [...l]; - obj.forEach((_, i) => { - setKey(index + i); - }); - temp.splice(index, 0, ...obj); - return temp; - }); - }; - - const replace = (index: number, obj: T) => { - setList(l => { - const temp = [...l]; - temp[index] = obj; - return temp; - }); - }; - - const remove = (index: number) => { - setList(l => { - const temp = [...l]; - temp.splice(index, 1); - - // remove keys if necessary - try { - keyList.current.splice(index, 1); - } catch (e) { - console.error(e); - } - return temp; - }); - }; - - const move = (oldIndex: number, newIndex: number) => { - if (oldIndex === newIndex) { - return; - } - setList(l => { - const newList = [...l]; - const temp = newList.filter((_: {}, index: number) => index !== oldIndex); - temp.splice(newIndex, 0, newList[oldIndex]); - - // move keys if necessary - try { - const keyTemp = keyList.current.filter( - (_: {}, index: number) => index !== oldIndex, - ); - keyTemp.splice(newIndex, 0, keyList.current[oldIndex]); - keyList.current = keyTemp; - } catch (e) { - console.error(e); - } - - return temp; - }); - }; - - const push = (obj: T) => { - setList(l => { - setKey(l.length); - return l.concat([obj]); - }); - }; - - const pop = () => { - // remove keys if necessary - try { - keyList.current = keyList.current.slice(0, keyList.current.length - 1); - } catch (e) { - console.error(e); - } - - setList(l => l.slice(0, l.length - 1)); - }; - - const unshift = (obj: T) => { - setList(l => { - setKey(0); - return [obj].concat(l); - }); - }; - - const sortForm = (result: unknown[]) => - result - .map((item, index) => ({ key: index, item })) // add index into obj - .sort((a, b) => getIndex(a.key) - getIndex(b.key)) // sort based on the index of table - .filter(item => !!item.item) // remove undefined(s) - .map(item => item.item); // retrive the data - - const shift = () => { - // remove keys if necessary - try { - keyList.current = keyList.current.slice(1, keyList.current.length); - } catch (e) { - console.error(e); - } - setList(l => l.slice(1, l.length)); - }; - - return { - list, - insert, - merge, - replace, - remove, - getAll, - getKey, - getIndex, - move, - push, - pop, - unshift, - shift, - sortForm, - resetList, - }; -}; diff --git a/packages/app/src/components/fields/form-block/index.tsx b/packages/app/src/components/fields/form-block/index.tsx deleted file mode 100644 index 9051a4b3192533f12cb7cbb17d9a05c0de554432..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-block/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { Card } from 'antd'; -import { CardProps } from 'antd/lib/card'; -import styled from 'styled-components'; - -export const FormBlock = createVirtualBox( - 'block', - styled(({ children, className, ...props }) => { - return ( - - {children} - - ); - })` - margin-bottom: 10px !important; - &.ant-card { - border: none; - box-shadow: none; - } - `, -); - -export default FormBlock; diff --git a/packages/app/src/components/fields/form-block/style.ts b/packages/app/src/components/fields/form-block/style.ts deleted file mode 100644 index d9079150a1cb08a6178a06d8dbc779481358796f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-block/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/card/style/index'; diff --git a/packages/app/src/components/fields/form-card/index.tsx b/packages/app/src/components/fields/form-card/index.tsx deleted file mode 100644 index abfc2537e4ef5f6cec6e2118c4a9079f8878cf60..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-card/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { Card } from 'antd'; -import { CardProps } from 'antd/lib/card'; -import styled from 'styled-components'; - -export const FormCard = createVirtualBox( - 'card', - styled(({ children, className, ...props }) => { - return ( - - {children} - - ); - })` - margin-bottom: 10px !important; - `, -); - -export default FormCard; diff --git a/packages/app/src/components/fields/form-card/style.ts b/packages/app/src/components/fields/form-card/style.ts deleted file mode 100644 index d9079150a1cb08a6178a06d8dbc779481358796f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-card/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/card/style/index'; diff --git a/packages/app/src/components/fields/form-description/index.tsx b/packages/app/src/components/fields/form-description/index.tsx deleted file mode 100644 index 85b9c017c7cabc793377a190ea5c4d3db0d7f45f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-description/index.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { Card } from 'antd'; -import styled from 'styled-components'; -import { markdown } from '@/components/views/Field'; - -export const FormDescription = createVirtualBox( - 'description', - styled(({ schema = {}, children, className, ...props }) => { - const { title, tooltip } = schema as any; - console.log({ schema }); - return ( - - {typeof tooltip === 'string' && tooltip && ( -
- )} -
- ); - })` - margin-bottom: 24px !important; - &.ant-card { - border: none; - box-shadow: none; - .ant-card-head { - font-size: 16px; - background: #fafafa; - margin: 0 -24px; - padding: 4px 24px !important; - border-top: 1px solid #f0f0f0; - } - p:first-child { - margin-top: 14px; - } - p:last-child { - margin-bottom: 0; - } - } - `, -); - -export default FormDescription; diff --git a/packages/app/src/components/fields/form-grid-col/index.tsx b/packages/app/src/components/fields/form-grid-col/index.tsx deleted file mode 100644 index 450af0c15d9b50753e79d54bf0daab7edc6a8bae..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-grid-col/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { Col } from 'antd'; -import { ColProps } from 'antd/lib/grid'; - -export const FormGridCol = createVirtualBox('grid-col', props => { - return {props.children}; -}); - -export default FormGridCol; diff --git a/packages/app/src/components/fields/form-grid-col/style.ts b/packages/app/src/components/fields/form-grid-col/style.ts deleted file mode 100644 index 329e770d24db7d79be86a6e7cf398d14ffd65630..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-grid-col/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/col/style/index'; diff --git a/packages/app/src/components/fields/form-grid-row/index.tsx b/packages/app/src/components/fields/form-grid-row/index.tsx deleted file mode 100644 index b9792dc78e9529afec0de0c856df0a24b07d30cb..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-grid-row/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import { AntdSchemaFieldAdaptor, pickFormItemProps } from '@formily/antd'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { Row } from 'antd'; -import { RowProps } from 'antd/lib/grid'; -import { FormItemProps as ItemProps } from 'antd/lib/form'; -import { IItemProps } from '../types'; - -export const FormGridRow = createVirtualBox( - 'grid-row', - props => { - const { title, label } = props; - const grids = {props.children}; - if (title || label) { - return ( - - {grids} - - ); - } - return grids; - }, -); - -export default FormGridRow; diff --git a/packages/app/src/components/fields/form-grid-row/style.ts b/packages/app/src/components/fields/form-grid-row/style.ts deleted file mode 100644 index 146d18915e216ef97c03f5ff449fa6cf5c0a50f8..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-grid-row/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/row/style/index'; diff --git a/packages/app/src/components/fields/form-item-grid/index.tsx b/packages/app/src/components/fields/form-item-grid/index.tsx deleted file mode 100644 index d0f13eaaa315adf1e058cb4467174e980f81a47b..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-item-grid/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { Fragment } from 'react'; -import { - AntdSchemaFieldAdaptor, - pickFormItemProps, - pickNotFormItemProps, -} from '@formily/antd'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import { toArr } from '@formily/shared'; -import { Row, Col } from 'antd'; -import { FormItemProps as ItemProps } from 'antd/lib/form'; -import { IFormItemGridProps, IItemProps } from '../types'; -import { normalizeCol } from '../shared'; - -export const FormItemGrid = createVirtualBox< - React.PropsWithChildren ->('grid', props => { - const { - cols: rawCols, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - title, - label, - } = props; - const formItemProps = pickFormItemProps(props); - const gridProps = pickNotFormItemProps(props); - const children = toArr(props.children); - const cols = toArr(rawCols).map(col => normalizeCol(col)); - const childNum = children.length; - - if (cols.length < childNum) { - let offset: number = childNum - cols.length; - let lastSpan: number = - 24 - - cols.reduce((buf, col) => { - return ( - buf + - Number(col.span ? col.span : 0) + - Number(col.offset ? col.offset : 0) - ); - }, 0); - for (let i = 0; i < offset; i++) { - cols.push({ span: Math.floor(lastSpan / offset) }); - } - } - const grids = ( - - {children.reduce((buf, child, key) => { - return child - ? buf.concat( - - {child} - , - ) - : buf; - }, [])} - - ); - - if (title || label) { - return ( - - {grids} - - ); - } - return {grids}; -}); - -export default FormItemGrid; diff --git a/packages/app/src/components/fields/form-item-grid/style.ts b/packages/app/src/components/fields/form-item-grid/style.ts deleted file mode 100644 index fd36035fb39faa0462fa953262313e9b5f9cf6ee..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-item-grid/style.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'antd/lib/row/style/index'; -import 'antd/lib/col/style/index'; diff --git a/packages/app/src/components/fields/form-layout/index.tsx b/packages/app/src/components/fields/form-layout/index.tsx deleted file mode 100644 index 7b7bce78d0bf34a69f55a855bf5bdc92ae9669ff..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-layout/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import { FormItemDeepProvider, useDeepFormItem } from '@formily/antd'; -import { createVirtualBox } from '@formily/react-schema-renderer'; -import cls from 'classnames'; -import { IFormItemTopProps } from '../types'; - -export const FormLayout = createVirtualBox( - 'layout', - props => { - const { inline } = useDeepFormItem(); - const isInline = props.inline || inline; - const children = - isInline || props.className || props.style ? ( -
- {props.children} -
- ) : ( - props.children - ); - return {children}; - }, -); - -export default FormLayout; diff --git a/packages/app/src/components/fields/form-mega-layout/index.tsx b/packages/app/src/components/fields/form-mega-layout/index.tsx deleted file mode 100644 index 5d55ac2fd59a686271e598e32e6580916c5e1704..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-mega-layout/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import { MegaLayout, FormMegaLayout } from '@formily/antd'; - -export { MegaLayout, FormMegaLayout }; diff --git a/packages/app/src/components/fields/form-slot/index.ts b/packages/app/src/components/fields/form-slot/index.ts deleted file mode 100644 index bfcd039ddaa41229f53a55e215e02f3fbf6160e5..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-slot/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FormSlot } from '@formily/react-schema-renderer'; - -export { FormSlot }; - -export default FormSlot; diff --git a/packages/app/src/components/fields/form-step/index.tsx b/packages/app/src/components/fields/form-step/index.tsx deleted file mode 100644 index 096349b7bf5a690323b916f86a307c83a79c27e5..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-step/index.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import React, { useRef, Fragment, useEffect } from 'react'; -import { - createControllerBox, - ISchemaVirtualFieldComponentProps, - createEffectHook, - useFormEffects, - useFieldState, - IVirtualBoxProps, -} from '@formily/react-schema-renderer'; -import { toArr } from '@formily/shared'; -import { Steps } from 'antd'; -import { createMatchUpdate } from '../shared'; -import { IFormStep } from '../types'; - -enum StateMap { - ON_FORM_STEP_NEXT = 'onFormStepNext', - ON_FORM_STEP_PREVIOUS = 'onFormStepPrevious', - ON_FORM_STEP_GO_TO = 'onFormStepGoto', - ON_FORM_STEP_CURRENT_CHANGE = 'onFormStepCurrentChange', - ON_FORM_STEP_DATA_SOURCE_CHANGED = 'onFormStepDataSourceChanged', -} -const EffectHooks = { - onStepNext$: createEffectHook(StateMap.ON_FORM_STEP_NEXT), - onStepPrevious$: createEffectHook(StateMap.ON_FORM_STEP_PREVIOUS), - onStepGoto$: createEffectHook(StateMap.ON_FORM_STEP_GO_TO), - onStepCurrentChange$: createEffectHook<{ - value: number; - preValue: number; - }>(StateMap.ON_FORM_STEP_CURRENT_CHANGE), -}; - -type ExtendsProps = StateMap & typeof EffectHooks; - -export const FormStep: React.FC> & - ExtendsProps = createControllerBox( - 'step', - ({ - form, - schema, - path, - name, - children, - }: ISchemaVirtualFieldComponentProps) => { - const { dataSource, ...stepProps } = schema.getExtendsComponentProps(); - const [{ current }, setFieldState] = useFieldState({ - current: stepProps.current || 0, - }); - const ref = useRef(current); - const itemsRef = useRef([]); - itemsRef.current = toArr(dataSource); - - const matchUpdate = createMatchUpdate(name, path); - - const update = (cur: number) => { - form.notify(StateMap.ON_FORM_STEP_CURRENT_CHANGE, { - path, - name, - value: cur, - preValue: current, - }); - setFieldState({ - current: cur, - }); - }; - - useEffect(() => { - form.notify(StateMap.ON_FORM_STEP_DATA_SOURCE_CHANGED, { - path, - name, - value: itemsRef.current, - }); - }, [itemsRef.current.length]); - - useFormEffects(($, { setFieldState }) => { - const updateFields = () => { - itemsRef.current.forEach(({ name }, index) => { - setFieldState(name, (state: any) => { - state.display = index === current; - }); - }); - }; - updateFields(); - $(StateMap.ON_FORM_STEP_DATA_SOURCE_CHANGED).subscribe( - ({ name, path }) => { - matchUpdate(name, path, () => { - updateFields(); - }); - }, - ); - - $(StateMap.ON_FORM_STEP_CURRENT_CHANGE).subscribe( - ({ value, name, path }: any = {}) => { - matchUpdate(name, path, () => { - form.hostUpdate(() => { - itemsRef.current.forEach(({ name }, index) => { - if (!name) - throw new Error( - 'FormStep dataSource must include `name` property', - ); - setFieldState(name, (state: any) => { - state.display = index === value; - }); - }); - }); - }); - }, - ); - - $(StateMap.ON_FORM_STEP_NEXT).subscribe(({ name, path }: any = {}) => { - matchUpdate(name, path, () => { - form.validate().then(({ errors }) => { - if (errors.length === 0) { - update( - ref.current + 1 > itemsRef.current.length - 1 - ? ref.current - : ref.current + 1, - ); - } - }); - }); - }); - - $(StateMap.ON_FORM_STEP_PREVIOUS).subscribe( - ({ name, path }: any = {}) => { - matchUpdate(name, path, () => { - update(ref.current - 1 < 0 ? ref.current : ref.current - 1); - }); - }, - ); - - $(StateMap.ON_FORM_STEP_GO_TO).subscribe( - ({ name, path, value }: any = {}) => { - matchUpdate(name, path, () => { - if (!(value < 0 || value > itemsRef.current.length)) { - update(value); - } - }); - }, - ); - }); - ref.current = current; - return ( - - - {itemsRef.current.map((props, key) => { - return ; - })} - {' '} - {children} - - ); - }, -) as any; - -Object.assign(FormStep, StateMap, EffectHooks); - -export default FormStep; diff --git a/packages/app/src/components/fields/form-step/style.ts b/packages/app/src/components/fields/form-step/style.ts deleted file mode 100644 index 0054007b24a2d7e707dee4dafe9ff11c3df92538..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-step/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/steps/style/index'; diff --git a/packages/app/src/components/fields/form-tab/index.tsx b/packages/app/src/components/fields/form-tab/index.tsx deleted file mode 100644 index a2e2421bf7b966db4e280ac0c66a4e76da4697d5..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-tab/index.tsx +++ /dev/null @@ -1,194 +0,0 @@ -import React, { Fragment, useEffect, useRef } from 'react'; -import { - createControllerBox, - ISchemaVirtualFieldComponentProps, - createEffectHook, - useFormEffects, - useFieldState, - FormEffectHooks, - SchemaField, - FormPath, - IVirtualBoxProps, -} from '@formily/react-schema-renderer'; -import { Tabs, Badge } from 'antd'; -import { TabPaneProps } from 'antd/lib/tabs'; -import { IFormTab } from '../types'; -import { createMatchUpdate } from '../shared'; - -enum StateMap { - ON_FORM_TAB_ACTIVE_KEY_CHANGE = 'onFormTabActiveKeyChange', -} - -const { onFormChange$ } = FormEffectHooks; - -const EffectHooks = { - onTabActiveKeyChange$: createEffectHook<{ - name?: string; - path?: string; - value?: any; - }>(StateMap.ON_FORM_TAB_ACTIVE_KEY_CHANGE), -}; - -const parseTabItems = (items: any, hiddenKeys?: string[]) => { - return items.reduce((buf: any, { schema, key }) => { - if (Array.isArray(hiddenKeys)) { - if (hiddenKeys.includes(key)) { - return buf; - } - } - if (schema.getExtendsComponent() === 'tabpane') { - return buf.concat({ - props: schema.getExtendsComponentProps(), - schema, - key, - }); - } - return buf; - }, []); -}; - -const parseDefaultActiveKey = ( - hiddenKeys: Array = [], - items: any, - defaultActiveKey, -) => { - if (!hiddenKeys.includes(defaultActiveKey)) return defaultActiveKey; - - const index = items.findIndex(item => !hiddenKeys.includes(item.key)); - return index >= 0 ? items[index].key : ''; -}; - -const parseChildrenErrors = (errors: any, target: string) => { - return errors.filter(({ path }) => { - return FormPath.parse(path).includes(target); - }); -}; - -const addErrorBadge = ( - tab: React.ReactNode, - currentPath: FormPath, - childrenErrors: any[], -) => { - const currentErrors = childrenErrors.filter(({ path }) => { - return FormPath.parse(path).includes(currentPath); - }); - if (currentErrors.length > 0) { - return ( - - {tab} - - ); - } - return tab; -}; - -type ExtendsProps = StateMap & - typeof EffectHooks & { - TabPane: React.FC>; - }; - -type ExtendsState = { - activeKey?: string; - childrenErrors?: any; -}; - -export const FormTab: React.FC> & - ExtendsProps = createControllerBox( - 'tab', - ({ form, schema, name, path }: ISchemaVirtualFieldComponentProps) => { - const orderProperties = schema.getOrderProperties(); - let { - hiddenKeys, - defaultActiveKey, - ...componentProps - } = schema.getExtendsComponentProps(); - hiddenKeys = hiddenKeys || []; - const [{ activeKey, childrenErrors }, setFieldState] = useFieldState< - ExtendsState - >({ - activeKey: parseDefaultActiveKey( - hiddenKeys, - orderProperties, - defaultActiveKey, - ), - childrenErrors: [], - }); - const itemsRef = useRef([]); - itemsRef.current = parseTabItems(orderProperties, hiddenKeys); - const update = (cur: string) => { - form.notify(StateMap.ON_FORM_TAB_ACTIVE_KEY_CHANGE, { - name, - path, - value: cur, - }); - }; - const matchUpdate = createMatchUpdate(name, path); - useEffect(() => { - if (Array.isArray(hiddenKeys)) { - setFieldState({ - activeKey: parseDefaultActiveKey( - hiddenKeys, - orderProperties, - defaultActiveKey, - ), - }); - } - }, [hiddenKeys.length]); - useFormEffects(({ hasChanged }) => { - onFormChange$().subscribe(formState => { - const errorsChanged = hasChanged(formState, 'errors'); - if (errorsChanged) { - setFieldState({ - childrenErrors: parseChildrenErrors(formState.errors, path), - }); - } - }); - EffectHooks.onTabActiveKeyChange$().subscribe( - ({ value, name, path }: any = {}) => { - if (!itemsRef.current.map(item => item.key).includes(value)) return; - matchUpdate(name, path, () => { - setFieldState({ - activeKey: value, - }); - }); - }, - ); - }); - return ( - - {itemsRef.current.map(({ props, schema, key }) => { - const currentPath = FormPath.parse(path).concat(key); - return ( - - - - ); - })} - - ); - }, -) as any; - -FormTab.TabPane = createControllerBox( - 'tabpane', - ({ children }) => { - return {children}; - }, -); - -Object.assign(FormTab, StateMap, EffectHooks); - -export default FormTab; diff --git a/packages/app/src/components/fields/form-tab/style.ts b/packages/app/src/components/fields/form-tab/style.ts deleted file mode 100644 index a7c2682f91726f58bfa130b47f8aafabc60fe778..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-tab/style.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'antd/lib/tabs/style/index'; -import 'antd/lib/badge/style/index'; diff --git a/packages/app/src/components/fields/form-text-box/index.tsx b/packages/app/src/components/fields/form-text-box/index.tsx deleted file mode 100644 index 934a6c6f69cba6f8f8a58a43a8845bb6b704a0c7..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/form-text-box/index.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, { useRef, useLayoutEffect } from 'react'; -import { createControllerBox, Schema } from '@formily/react-schema-renderer'; -import { IFormTextBox } from '../types'; -import { toArr } from '@formily/shared'; -import { FormItemProps as ItemProps } from 'antd/lib/form'; -import { version } from 'antd'; -import { AntdSchemaFieldAdaptor, pickFormItemProps } from '@formily/antd'; -import styled from 'styled-components'; - -const isV4 = /^4\./.test(version); - -export const FormTextBox = createControllerBox( - 'text-box', - styled(({ props, form, className, children }) => { - const schema = new Schema(props); - const mergeProps = schema.getExtendsComponentProps(); - const { title, label, text, gutter, style } = Object.assign( - { - gutter: 5, - }, - mergeProps, - ); - const formItemProps = pickFormItemProps(mergeProps); - const ref: React.RefObject = useRef(); - const arrChildren = toArr(children); - const split = text.split('%s'); - let index = 0; - useLayoutEffect(() => { - if (ref.current) { - const elements = ref.current.querySelectorAll('.text-box-field'); - const syncLayouts = Array.prototype.map.call( - elements, - (el: HTMLElement) => { - return [ - el, - () => { - const ctrl = el.querySelector('.ant-form-item-children'); - setTimeout(() => { - if (ctrl) { - const editable = form.getFormState(state => state.editable); - el.style.width = editable - ? ctrl.getBoundingClientRect().width + 'px' - : 'auto'; - } - }); - }, - ]; - }, - ); - syncLayouts.forEach(([el, handler]) => { - handler(); - el.addEventListener('DOMSubtreeModified', handler); - }); - - return () => { - syncLayouts.forEach(([el, handler]) => { - el.removeEventListener('DOMSubtreeModified', handler); - }); - }; - } - }, []); - const newChildren = split.reduce((buf, item, key) => { - return buf.concat( - item ? ( -

- {item} -

- ) : null, - arrChildren[key] ? ( -
- {arrChildren[key]} -
- ) : null, - ); - }, []); - - const textChildren = ( -
- {newChildren} -
- ); - - if (!title && !label) return textChildren; - return ( - - {textChildren} - - ); - })` - display: flex; - .text-box-words:nth-child(1) { - margin-left: 0; - } - .text-box-words { - margin-bottom: 0 !important; - ${isV4 ? 'line-height:32px' : ''} - } - .text-box-field { - display: inline-block; - .ant-form-item { - margin-bottom: 0 !important; - } - } - .next-form-item { - margin-bottom: 0 !important; - } - .preview-text { - text-align: center !important; - } - `, -); - -export default FormTextBox; diff --git a/packages/app/src/components/fields/icons/index.tsx b/packages/app/src/components/fields/icons/index.tsx deleted file mode 100644 index d41780c5c91f5676e2d22e98ed0df0fdfd9e5447..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/icons/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React, { useState } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import { Popover, Button, Input } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; -import { icons, hasIcon, Icon as IconComponent } from '@/components/icons'; -import { CloseOutlined } from '@ant-design/icons'; - -function IconField(props: any) { - const { value, onChange } = props; - const [visible, setVisible] = useState(false); - return ( -
- - { - setVisible(val); - }} - content={ -
- {[...icons.keys()].map(key => ( - { - onChange(key); - setVisible(false); - }} - > - - - ))} -
- } - title="图标" - trigger="click" - > - -
- {value && } -
-
- ); -} - -export const Icon = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(IconField); - -export default Icon; diff --git a/packages/app/src/components/fields/index.tsx b/packages/app/src/components/fields/index.tsx deleted file mode 100644 index 41b37d62fe38edbd1fc512b35725cf71a071a935..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -export * from './text-button'; -export * from './time-picker'; -export * from './transfer'; -export * from './switch'; -export * from './array-cards'; -export * from './array-table'; -export * from './checkbox'; -export * from './circle-button'; -export * from './date-picker'; -export * from './form-block'; -export * from './form-card'; -export * from './form-tab'; -export * from './form-grid-col'; -export * from './form-grid-row'; -export * from './form-item-grid'; -export * from './form-layout'; -export * from './form-mega-layout'; -export * from './form-description'; -export * from './form-step'; -export * from './form-text-box'; -export * from './form-slot'; -export * from './input'; -export * from './select'; -export * from './number-picker'; -export * from './password'; -export * from './radio'; -export * from './range'; -export * from './rating'; -export * from './upload'; -export * from './registry'; diff --git a/packages/app/src/components/fields/input/index.tsx b/packages/app/src/components/fields/input/index.tsx deleted file mode 100644 index b6c2acc5cc858d3ae974f43530832967cc9a7560..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/input/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import React from 'react'; -import { Input as AntdInput } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; - -export const Input = connect<'TextArea'>({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})( - acceptEnum(({ onChange, ...restProps }) => ( - { - // 文本字段,如果空要 null 处理 - onChange(e.target.value ? e : null); - }} - /> - )), -); - -Input.TextArea = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})( - acceptEnum(props => ( - - )), -); - -export default Input; diff --git a/packages/app/src/components/fields/input/style.ts b/packages/app/src/components/fields/input/style.ts deleted file mode 100644 index 6e18cbb4fcc6eb86710729c5676724af36a628da..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/input/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/input/style/index'; diff --git a/packages/app/src/components/fields/markdown/index.tsx b/packages/app/src/components/fields/markdown/index.tsx deleted file mode 100644 index d75d71c9a0a55bf3a6fa98b96722da8f594807da..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/markdown/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import React from 'react'; -import { Input as AntdInput } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; - -export const Markdown = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})( - acceptEnum(props => ( - - )), -); - -export default Markdown; diff --git a/packages/app/src/components/fields/number-picker/index.tsx b/packages/app/src/components/fields/number-picker/index.tsx deleted file mode 100644 index 2949a427eddfe07f1e4271a553b0c20aeb6db4da..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/number-picker/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import { InputNumber } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; - -export const NumberPicker = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(acceptEnum(InputNumber)); - -export const Percent = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})( - acceptEnum(props => ( - (value ? `${value}%` : '')} - parser={value => value.replace('%', '')} - {...props} - /> - )), -); - -export default NumberPicker; diff --git a/packages/app/src/components/fields/number-picker/style.ts b/packages/app/src/components/fields/number-picker/style.ts deleted file mode 100644 index 212aeeab84800810b092413d59281287fd22cdf2..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/number-picker/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/input-number/style/index'; diff --git a/packages/app/src/components/fields/password/index.tsx b/packages/app/src/components/fields/password/index.tsx deleted file mode 100644 index d4c66c597045ce40650234aaeed26d5c61e4e030..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/password/index.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React, { useState } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import { Input } from 'antd'; -import { PasswordProps } from 'antd/lib/input'; -import { PasswordStrength } from '@formily/react-shared-components'; -import styled from 'styled-components'; -import { mapStyledProps } from '../shared'; - -export interface IPasswordProps extends PasswordProps { - checkStrength: boolean; -} - -export const Password = connect({ - getProps: mapStyledProps, -})(styled((props: IPasswordProps) => { - const { value, className, checkStrength, onChange, ...others } = props; - - return ( - - { - // 密码字段,如果没有设置不处理 - onChange(e.target.value ? e : undefined); - }} - /> - {checkStrength && ( - - {score => { - return ( -
-
-
-
-
-
-
- ); - }} - - )} - - ); -})` - .password-strength-wrapper { - background: #e0e0e0; - margin-bottom: 3px; - position: relative; - .div { - position: absolute; - z-index: 1; - height: 8px; - top: 0; - background: #fff; - width: 1px; - transform: translate(-50%, 0); - } - .div-1 { - left: 20%; - } - .div-2 { - left: 40%; - } - .div-3 { - left: 60%; - } - .div-4 { - left: 80%; - } - .password-strength-bar { - position: relative; - background-image: -webkit-linear-gradient(left, #ff5500, #ff9300); - transition: all 0.35s ease-in-out; - height: 8px; - width: 100%; - margin-top: 5px; - } - } -`); - -export default Password; diff --git a/packages/app/src/components/fields/password/style.ts b/packages/app/src/components/fields/password/style.ts deleted file mode 100644 index 6e18cbb4fcc6eb86710729c5676724af36a628da..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/password/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/input/style/index'; diff --git a/packages/app/src/components/fields/permissions/index.tsx b/packages/app/src/components/fields/permissions/index.tsx deleted file mode 100644 index 9476aa0e0bca88882dcf1187ec83c6ed4f656e56..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/permissions/index.tsx +++ /dev/null @@ -1,376 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import React, { useEffect, useState } from 'react'; -import { Input as AntdInput, Table, Checkbox, Select, Tag } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; -import api from '@/api-client'; -import { useRequest } from 'umi'; -import { useDynamicList } from 'ahooks'; -import findIndex from 'lodash/findIndex'; -import get from 'lodash/get'; -import set from 'lodash/set'; -import { DrawerSelectComponent } from '../drawer-select'; - -export const Permissions = {} as { Actions: any; Fields: any; Tabs: any }; - -Permissions.Actions = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(({ onChange, value = [], resourceKey, ...restProps }) => { - const { data = [], loading = true } = useRequest( - () => { - return api.resource('collections.actions').list({ - associatedKey: resourceKey, - perPage: -1, - }); - }, - { - refreshDeps: [resourceKey], - }, - ); - - return ( - { - return type === 'create' ? ( - 对新数据操作 - ) : ( - 对已有数据操作 - ); - }, - }, - { - title: '允许操作', - dataIndex: ['name'], - render: (val, record) => { - const values = [...(value || [])]; - const index = findIndex( - values, - (item: any) => - item && item.name === `${resourceKey}:${record.name}`, - ); - console.log(values); - return ( - = 0} - onChange={e => { - // const index = findIndex(values, (item: any) => item && item.name === `${resourceKey}:${record.name}`); - if (index >= 0) { - if (!e.target.checked) { - values.splice(index, 1); - } - } else { - values.push({ - name: `${resourceKey}:${record.name}`, - }); - } - onChange(values); - }} - /> - ); - }, - }, - { - title: '可操作的数据范围', - dataIndex: ['scope'], - render: (scope, record) => { - if (['filter', 'create'].indexOf(record.type) !== -1) { - return null; - } - const values = [...(value || [])]; - const index = findIndex( - values, - (item: any) => - item && item.name === `${resourceKey}:${record.name}`, - ); - console.log( - values, - index, - `${resourceKey}:${record.name}`, - get(values, [index, 'scope']), - ); - return ( - { - const values = [...(value || [])]; - const index = findIndex( - values, - (item: any) => - item && item.name === `${resourceKey}:${record.name}`, - ); - if (index === -1) { - values.push({ - name: `${resourceKey}:${record.name}`, - scope_id: data.id, - }); - } else { - set(values, [index, 'scope_id'], data.id); - } - console.log('valvalvalvalval', { values }); - onChange(values); - console.log('valvalvalvalval', data); - }} - /> - // { - // const values = [...value||[]]; - // const index = findIndex(values, (item: any) => item && item.name === `${resourceKey}:${record.name}`); - // if (index === -1) { - // values.push({ - // name: `${resourceKey}:${record.name}`, - // scope_id: data, - // }); - // } else { - // set(values, [index, 'scope_id'], data); - // } - // console.log('valvalvalvalval', {values}) - // onChange(values); - // console.log('valvalvalvalval', data); - // }} - // /> - ); - }, - }, - ]} - loading={loading} - /> - ); -}); - -Permissions.Fields = connect<'TextArea'>({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(({ onChange, value = [], resourceKey, ...restProps }) => { - const actions = {}; - value.forEach(item => { - actions[item.field_id] = item.actions; - }); - - // console.log(actions); - - const [fields, setFields] = useState(value || []); - - const { data = [], loading = true } = useRequest( - () => { - return api.resource('collections.fields').list({ - associatedKey: resourceKey, - perPage: -1, - }); - }, - { - refreshDeps: [resourceKey], - }, - ); - console.log({ resourceKey, data }); - - const columns = [ - { - title: '字段名称', - dataIndex: ['title'], - }, - ].concat( - [ - { - title: '查看', - action: `${resourceKey}:list`, - }, - { - title: '编辑', - action: `${resourceKey}:update`, - }, - { - title: '新增', - action: `${resourceKey}:create`, - }, - ].map(({ title, action }) => { - let checked = - value.filter(({ actions = [] }) => actions.indexOf(action) !== -1) - .length === data.length; - return { - title: ( - <> - { - const values = data.map(field => { - const items = actions[field.id] || []; - const index = items.indexOf(action); - if (index > -1) { - if (!e.target.checked) { - items.splice(index, 1); - } - } else { - if (e.target.checked) { - items.push(action); - } - } - return { - field_id: field.id, - actions: items, - }; - }); - // console.log(values); - setFields([...values]); - onChange([...values]); - }} - />{' '} - {title} - - ), - dataIndex: ['id'], - render: (val, record) => { - const items = actions[record.id] || []; - // console.log({items}, items.indexOf(action)); - return ( - { - const values = [...value]; - const index = findIndex( - values, - ({ field_id, actions = [] }) => { - return field_id === record.id; - }, - ); - if (e.target.checked && index === -1) { - values.push({ - field_id: record.id, - actions: [action], - }); - } else { - const items = values[index].actions || []; - const actionIndex = items.indexOf(action); - if (!e.target.checked && actionIndex > -1) { - items.splice(actionIndex, 1); - // values[index].actions = items; - } else if (e.target.checked && actionIndex === -1) { - items.push(action); - } - } - onChange(values); - setFields(values); - }} - /> - ); - }, - }; - }) as any, - ); - - return ( -
- ); -}); - -Permissions.Tabs = connect<'TextArea'>({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(({ onChange, value = [], resourceKey, ...restProps }) => { - const { data = [], loading = true, mutate } = useRequest( - () => { - return api.resource('collections.tabs').list({ - associatedKey: resourceKey, - perPage: -1, - }); - }, - { - refreshDeps: [resourceKey], - }, - ); - - // const [checked, setChecked] = useState(false); - - // console.log(checked); - - // useEffect(() => { - // setChecked(data.length === value.length); - // console.log({resourceKey, data, value}, data.length === value.lengh); - // }, [ - // data, - // ]); - - return ( -
- { - onChange( - e.target.checked ? data.map(record => record.id) : [], - ); - }} - />{' '} - 查看 - - ), - dataIndex: ['id'], - render: (val, record) => { - const values = [...value]; - return ( - { - const index = values.indexOf(record.id); - if (index !== -1) { - if (!e.target.checked) { - values.splice(index, 1); - } - } else { - values.push(record.id); - } - onChange(values); - }} - /> - ); - }, - }, - ]} - loading={loading} - /> - ); -}); diff --git a/packages/app/src/components/fields/radio/index.tsx b/packages/app/src/components/fields/radio/index.tsx deleted file mode 100644 index 1afaf726facff9f687124ecf3d183eb1ee0464c3..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/radio/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import { Radio as AntdRadio } from 'antd'; -import { - transformDataSourceKey, - mapStyledProps, - mapTextComponent, -} from '../shared'; - -export const Radio = connect<'Group'>({ - valueName: 'checked', - getProps: mapStyledProps, -})(AntdRadio); - -Radio.Group = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(transformDataSourceKey(AntdRadio.Group, 'options')); - -export default Radio; diff --git a/packages/app/src/components/fields/radio/style.ts b/packages/app/src/components/fields/radio/style.ts deleted file mode 100644 index 710205400028879ef22c19aff6de0ade6b93e0cf..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/radio/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/radio/style/index'; diff --git a/packages/app/src/components/fields/range/index.tsx b/packages/app/src/components/fields/range/index.tsx deleted file mode 100644 index 7f48f469db9812d8185d0271b6470a1086c869f9..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/range/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; -import { Slider } from 'antd'; -import { connect } from '@formily/react-schema-renderer'; -import { mapStyledProps } from '../shared'; - -export interface ISliderMarks { - [key: number]: - | React.ReactNode - | { - style: React.CSSProperties; - label: React.ReactNode; - }; -} - -export declare type SliderValue = number | [number, number]; - -// TODO 并不是方法,最好能引用组件的 typescript 接口定义 -export interface ISliderProps { - min?: number; - max?: number; - marks?: ISliderMarks; - value?: SliderValue; - defaultValue?: SliderValue; - onChange?: (value: SliderValue) => void; -} - -export const Range = connect({ - defaultProps: { - style: { - width: 320, - }, - }, - getProps: mapStyledProps, -})( - class Component extends React.Component { - public render() { - const { onChange, value, min, max, marks, ...rest } = this.props; - let newMarks = {}; - if (Array.isArray(marks)) { - marks.forEach(mark => { - newMarks[mark] = mark; - }); - } else { - newMarks = marks; - } - return ( - - ); - } - }, -); - -export default Range; diff --git a/packages/app/src/components/fields/range/style.ts b/packages/app/src/components/fields/range/style.ts deleted file mode 100644 index 6db7cb7b184ffb4b493d040ca057e7ffc29280c2..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/range/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/slider/style/index'; diff --git a/packages/app/src/components/fields/rating/index.tsx b/packages/app/src/components/fields/rating/index.tsx deleted file mode 100644 index 7a28b9e36a9d9188da2b313ffda710b3a375997f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/rating/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import { Rate } from 'antd'; -import { mapStyledProps } from '../shared'; - -export const Rating = connect({ - getProps: mapStyledProps, -})(Rate); - -export default Rating; diff --git a/packages/app/src/components/fields/rating/style.ts b/packages/app/src/components/fields/rating/style.ts deleted file mode 100644 index f63c4f26412d7070bac8fc7f470299af6e0f0e7f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/rating/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/rate/style/index'; diff --git a/packages/app/src/components/fields/registry.ts b/packages/app/src/components/fields/registry.ts deleted file mode 100644 index 21a4620d7596fcf17c01fb78c284f78aca8110ef..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/registry.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { registerFormFields } from '@formily/antd'; -import { TimePicker } from './time-picker'; -import { Transfer } from './transfer'; -import { Switch } from './switch'; -import { ArrayCards } from './array-cards'; -import { ArrayTable } from './array-table'; -import { Checkbox } from './checkbox'; -import { DatePicker } from './date-picker'; -import { Input } from './input'; -import { NumberPicker, Percent } from './number-picker'; -import { Password } from './password'; -import { Radio } from './radio'; -import { Range } from './range'; -import { Rating } from './rating'; -import { Upload } from './upload'; -import { Filter } from './filter'; -import { RemoteSelect } from './remote-select'; -import { DrawerSelect } from './drawer-select'; -import { SubTable } from './sub-table'; -import { Cascader } from './cascader'; -import { Icon } from './icons'; -import { ColorSelect } from './color-select'; -import { Permissions } from './permissions'; -import { Values } from './values'; -import { Automations } from './automations'; -import { Wysiwyg } from './wysiwyg'; -import { Markdown } from './markdown'; - -export const setup = () => { - registerFormFields({ - time: TimePicker, - timerange: TimePicker.RangePicker, - transfer: Transfer, - cascader: Cascader, - boolean: Checkbox, - switch: Switch, - checkbox: Checkbox, - array: ArrayCards, - cards: ArrayCards, - table: ArrayTable, - checkboxes: Checkbox.Group, - date: DatePicker, - daterange: DatePicker.RangePicker, - year: DatePicker.YearPicker, - month: DatePicker.MonthPicker, - week: DatePicker.WeekPicker, - string: Input, - select: Input, - icon: Icon, - textarea: Input.TextArea, - number: NumberPicker, - percent: Percent, - password: Password, - radio: Radio.Group, - range: Range, - rating: Rating, - upload: Upload, - filter: Filter, - remoteSelect: RemoteSelect, - drawerSelect: DrawerSelect, - colorSelect: ColorSelect, - subTable: SubTable, - values: Values, - wysiwyg: Wysiwyg, - markdown: Markdown, - 'permissions.actions': Permissions.Actions, - 'permissions.fields': Permissions.Fields, - 'permissions.tabs': Permissions.Tabs, - 'automations.datetime': Automations.DateTime, - 'automations.endmode': Automations.EndMode, - 'automations.cron': Automations.Cron, - }); -}; diff --git a/packages/app/src/components/fields/remote-select/index.tsx b/packages/app/src/components/fields/remote-select/index.tsx deleted file mode 100644 index 261e6d6e51141541f34f924c91aab15fabf79d50..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/remote-select/index.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React, { useEffect } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import moment from 'moment'; -import { Select } from 'antd'; -import { - mapStyledProps, - mapTextComponent, - compose, - isStr, - isArr, -} from '../shared'; -import { useRequest } from 'umi'; -import api from '@/api-client'; -import { Spin } from '@/components/spin'; -import get from 'lodash/get'; - -function RemoteSelectComponent(props) { - let { - schema = {}, - value, - onChange, - disabled, - resourceName, - associatedKey, - filter, - labelField, - valueField, - objectValue, - placeholder, - multiple, - } = props; - console.log({ schema }); - if (!resourceName) { - resourceName = get(schema, 'component.resourceName'); - } - if (!filter) { - filter = get(schema, 'component.filter'); - } - if (!labelField) { - labelField = get(schema, 'component.labelField'); - } - if (!valueField) { - valueField = get(schema, 'component.valueField'); - } - if (!valueField) { - valueField = 'id'; - } - const { data = [], loading = true } = useRequest( - () => { - return api.resource(resourceName).list({ - associatedKey, - filter, - }); - }, - { - refreshDeps: [resourceName, associatedKey], - }, - ); - const selectProps: any = {}; - if (multiple) { - selectProps.mode = 'multiple'; - } - console.log({ data, props, associatedKey }); - return ( - <> - - - ); -} - -export const RemoteSelect = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(RemoteSelectComponent); - -export default RemoteSelect; diff --git a/packages/app/src/components/fields/select/index.tsx b/packages/app/src/components/fields/select/index.tsx deleted file mode 100644 index 07afbdc4e84fb6a534303951abce8da6a1c37681..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/select/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import { - Select as AntdSelect, - mapStyledProps, - mapTextComponent, -} from '../shared'; - -export const Select = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(AntdSelect); - -export default Select; diff --git a/packages/app/src/components/fields/select/style.ts b/packages/app/src/components/fields/select/style.ts deleted file mode 100644 index 62d31e9505b2645604195cbe0ca7d4fa7fae1d2a..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/select/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/select/style/index'; diff --git a/packages/app/src/components/fields/shared.tsx b/packages/app/src/components/fields/shared.tsx deleted file mode 100644 index abede87db4be2a26a89d91190a2ad56982df77e3..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/shared.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React from 'react'; -import { mapTextComponent, mapStyledProps, normalizeCol } from '@formily/antd'; -import { Select as AntSelect } from 'antd'; -import { SelectProps as AntSelectProps } from 'antd/lib/select'; -import styled from 'styled-components'; -import { isArr, FormPath } from '@formily/shared'; -export * from '@formily/shared'; - -export const compose = (...args: any[]) => { - return (payload: any, ...extra: any[]) => { - return args.reduce((buf, fn) => { - return buf !== undefined ? fn(buf, ...extra) : fn(payload, ...extra); - }, payload); - }; -}; - -interface SelectOption { - label: React.ReactText; - value: any; - [key: string]: any; -} - -type SelectProps = AntSelectProps & { - dataSource?: SelectOption[]; -}; - -const createEnum = (enums: any) => { - if (isArr(enums)) { - return enums.map(item => { - if (typeof item === 'object') { - return { - ...item, - }; - } else { - return { - label: item, - value: item, - }; - } - }); - } - - return []; -}; - -export const Select: React.FC = styled((props: SelectProps) => { - const { dataSource = [], onChange, value, ...others } = props; - const children = createEnum(dataSource).map(item => { - const { label, value, key, children = [], ...others } = item; - if (children.length) { - return ( - - {children.map(({ value, label, ...others }: any) => ( - - {label} - - ))} - - ); - } - return ( - - {label} - - ); - }); - return ( - { - onChange( - value, - isArr(options) - ? options.map(item => ({ - ...item, - props: undefined, - })) - : { - ...options, - props: undefined, //干掉循环引用 - }, - ); - }} - > - {children} - - ); -})` - min-width: 100px; - width: 100%; -`; -export const acceptEnum = (component: React.JSXElementConstructor) => { - return ({ dataSource, ...others }) => { - if (dataSource) { - return React.createElement(Select, { dataSource, ...others }); - } else { - return React.createElement(component, others); - } - }; -}; - -export const transformDataSourceKey = (component, dataSourceKey) => { - return ({ dataSource, ...others }) => { - return React.createElement(component, { - [dataSourceKey]: dataSource, - ...others, - }); - }; -}; - -export const createMatchUpdate = (name: string, path: string) => ( - targetName: string, - targetPath: string, - callback: () => void, -) => { - if (targetName || targetPath) { - if (targetName) { - if (FormPath.parse(targetName).matchAliasGroup(name, path)) { - callback(); - } - } else if (targetPath) { - if (FormPath.parse(targetPath).matchAliasGroup(name, path)) { - callback(); - } - } - } else { - callback(); - } -}; - -export { mapTextComponent, mapStyledProps, normalizeCol }; diff --git a/packages/app/src/components/fields/sub-table/Table.tsx b/packages/app/src/components/fields/sub-table/Table.tsx deleted file mode 100644 index 11aee43e94791279dcda7b5f9cd4bfec6384a65b..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/sub-table/Table.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import View from '@/components/views'; - -export interface SimpleTableProps { - schema?: any; - activeTab?: any; - resourceName: string; - associatedName?: string; - associatedKey?: string; - [key: string]: any; -} - -export function generateIndex(): string { - return `${Math.random() - .toString(36) - .replace('0.', '') - .slice(-4) - .padStart(4, '0')}`; -} - -export default function Table(props: SimpleTableProps) { - const { schema = {}, associatedKey, value, onChange, __index } = props; - const { collection_name, name } = schema; - const viewName = `${collection_name}.${name}.${schema.viewName || 'table'}`; - console.log({ props, associatedKey, schema, __index, viewName }); - return ( - <> - - - ); -} diff --git a/packages/app/src/components/fields/sub-table/index.tsx b/packages/app/src/components/fields/sub-table/index.tsx deleted file mode 100644 index a2ceb1a6f68a12fce66e1b3f242fa1db93af2629..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/sub-table/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React, { useRef } from 'react'; -import { connect } from '@formily/react-schema-renderer'; -import moment from 'moment'; -import { Select, Button, Table as AntdTable } from 'antd'; -import { - mapStyledProps, - mapTextComponent, - compose, - isStr, - isArr, -} from '../shared'; -import Table from './Table'; - -export const SubTable = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})(Table); - -export default SubTable; diff --git a/packages/app/src/components/fields/switch/index.tsx b/packages/app/src/components/fields/switch/index.tsx deleted file mode 100644 index 0c0de2ea521ba748996d6bd01daafa37bca84c85..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/switch/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Switch as AntdSwitch } from 'antd'; -import { connect } from '@formily/react-schema-renderer'; -import { acceptEnum, mapStyledProps } from '../shared'; - -export const Switch = connect({ - valueName: 'checked', - getProps: mapStyledProps, -})(acceptEnum(AntdSwitch)); - -export default Switch; diff --git a/packages/app/src/components/fields/switch/style.ts b/packages/app/src/components/fields/switch/style.ts deleted file mode 100644 index 29f0bcde1874b377a9e8edee9bbdfcb1a7bb4997..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/switch/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/switch/style/index'; diff --git a/packages/app/src/components/fields/text-button/index.tsx b/packages/app/src/components/fields/text-button/index.tsx deleted file mode 100644 index 61b6cf390a79d2cab646f42d69d96d11b6c0bc09..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/text-button/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { Button } from 'antd'; -import { ButtonProps } from 'antd/lib/button'; - -export const TextButton: React.FC = props => ( - - - )} - - {visible && ( - setVisible(false)} - onMovePrevRequest={() => { - setImgIndex((imgIndex + images.length - 1) % images.length); - }} - onMoveNextRequest={() => { - setImgIndex((imgIndex + 1) % images.length); - }} - /> - )} - - ); -}); - -export default Upload; diff --git a/packages/app/src/components/fields/upload/style.ts b/packages/app/src/components/fields/upload/style.ts deleted file mode 100644 index c8b5f6c843c805bfa2d4aed40484c6100d8abc4d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/upload/style.ts +++ /dev/null @@ -1 +0,0 @@ -import 'antd/lib/upload/style/index'; diff --git a/packages/app/src/components/fields/values/index.tsx b/packages/app/src/components/fields/values/index.tsx deleted file mode 100644 index 03ea20ec119503fce07c158296d58e54631567b6..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/values/index.tsx +++ /dev/null @@ -1,495 +0,0 @@ -import React, { useCallback, useEffect, useState } from 'react'; -import { - Button, - Select, - Input, - Space, - Form, - InputNumber, - DatePicker, - TimePicker, - Radio, -} from 'antd'; -import { PlusCircleOutlined, CloseCircleOutlined } from '@ant-design/icons'; -import useDynamicList from './useDynamicList'; -import { connect } from '@formily/react-schema-renderer'; -import { mapStyledProps } from '../shared'; -import get from 'lodash/get'; -import moment from 'moment'; -import './style.less'; -import api from '@/api-client'; -import { useRequest } from 'umi'; - -export function FilterGroup(props: any) { - const { - fields = [], - sourceFields = [], - onDelete, - onChange, - onAdd, - dataSource = [], - } = props; - const { list, getKey, push, remove, replace } = useDynamicList( - dataSource, - ); - let style: any = { - position: 'relative', - }; - return ( -
-
- {list.map((item, index) => { - // console.log(item); - // const Component = item.type === 'group' ? FilterGroup : FilterItem; - return ( -
- { - 1} - onChange={value => { - replace(index, value); - const newList = [...list]; - newList[index] = value; - onChange(newList); - // console.log(list, value, index); - }} - onDelete={() => { - remove(index); - const newList = [...list]; - newList.splice(index, 1); - onChange(newList); - // console.log(list, index); - }} - /> - } -
- ); - })} -
-
- - - -
-
- ); -} - -interface FieldOptions { - name: string; - title: string; - interface: string; - [key: string]: any; -} - -interface FilterItemProps { - fields: FieldOptions[]; - [key: string]: any; -} - -const OP_MAP = { - string: [ - { label: '包含', value: '$includes', selected: true }, - { label: '不包含', value: '$notIncludes' }, - { label: '等于', value: 'eq' }, - { label: '不等于', value: 'ne' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - number: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'ne' }, - { label: '大于', value: 'gt' }, - { label: '大于等于', value: 'gte' }, - { label: '小于', value: 'lt' }, - { label: '小于等于', value: 'lte' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - file: [ - { label: '存在', value: 'id.gt' }, - { label: '不存在', value: 'id.$null' }, - ], - boolean: [ - { label: '是', value: '$isTruly', selected: true }, - { label: '否', value: '$isFalsy' }, - ], - select: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'ne' }, - { label: '包含', value: 'in' }, - { label: '不包含', value: 'notIn' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - multipleSelect: [ - { label: '等于', value: '$match', selected: true }, - { label: '不等于', value: '$notMatch' }, - { label: '包含', value: '$anyOf' }, - { label: '不包含', value: '$noneOf' }, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - ], - datetime: [ - { label: '等于', value: '$dateOn', selected: true }, - { label: '不等于', value: '$dateNotOn' }, - { label: '早于', value: '$dateBefore' }, - { label: '晚于', value: '$dateAfter' }, - { label: '不早于', value: '$dateNotBefore' }, - { label: '不晚于', value: '$dateNotAfter' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - // {label: '是今天', value: 'now'}, - // {label: '在今天之前', value: 'before_today'}, - // {label: '在今天之后', value: 'after_today'}, - ], - time: [ - { label: '等于', value: 'eq', selected: true }, - { label: '不等于', value: 'neq' }, - { label: '大于', value: 'gt' }, - { label: '大于等于', value: 'gte' }, - { label: '小于', value: 'lt' }, - { label: '小于等于', value: 'lte' }, - // {label: '介于', value: 'between'}, - { label: '非空', value: '$notNull' }, - { label: '为空', value: '$null' }, - // {label: '是今天', value: 'now'}, - // {label: '在今天之前', value: 'before_today'}, - // {label: '在今天之后', value: 'after_today'}, - ], - // linkTo: [ - // {label: '包含', value: 'cont'}, - // {label: '不包含', value: 'ncont'}, - // {label: '非空', value: '$notNull'}, - // {label: '为空', value: '$null'}, - // ], -}; - -const op = { - string: OP_MAP.string, - textarea: OP_MAP.string, - number: OP_MAP.number, - percent: OP_MAP.number, - datetime: OP_MAP.datetime, - date: OP_MAP.datetime, - time: OP_MAP.time, - checkbox: OP_MAP.boolean, - boolean: OP_MAP.boolean, - select: OP_MAP.select, - multipleSelect: OP_MAP.multipleSelect, - checkboxes: OP_MAP.multipleSelect, - radio: OP_MAP.select, - upload: OP_MAP.file, - attachment: OP_MAP.file, -}; - -const StringInput = props => { - const { value, onChange, ...restProps } = props; - return ( - { - onChange(e.target.value); - }} - /> - ); -}; - -const controls = { - string: StringInput, - textarea: StringInput, - number: InputNumber, - percent: props => ( - (value ? `${value}%` : '')} - parser={value => value.replace('%', '')} - {...props} - /> - ), - boolean: BooleanControl, - checkbox: BooleanControl, - select: OptionControl, - radio: OptionControl, - checkboxes: OptionControl, - multipleSelect: OptionControl, - time: TimeControl, - date: DateControl, -}; - -function DateControl(props: any) { - const { field, value, onChange, ...restProps } = props; - let format = field.dateFormat; - // if (field.showTime) { - // format += ` ${field.timeFormat}`; - // } - const m = moment(value, format); - return ( - { - onChange(value ? value.format('YYYY-MM-DD') : null); - }} - /> - ); - // return ( - // { - // onChange(value ? value.format(field.showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD') : null) - // }}/> - // ); -} - -function TimeControl(props: any) { - const { field, value, onChange, ...restProps } = props; - let format = field.timeFormat; - const m = moment(value, format); - return ( - { - onChange(value ? value.format('HH:mm:ss') : null); - }} - /> - ); -} - -function OptionControl(props) { - const { multiple = true, op, options, value, onChange, ...restProps } = props; - let mode: any = 'multiple'; - if (!multiple && ['eq', 'ne'].indexOf(op) !== -1) { - mode = undefined; - } - return ( - - ); -} - -function BooleanControl(props) { - const { value, onChange, ...restProps } = props; - return ( - { - onChange(e.target.value); - }} - > - - - - ); -} - -function NullControl(props) { - return null; -} - -export function FilterItem(props: FilterItemProps) { - const { - index, - fields = [], - sourceFields = [], - showDeleteButton = true, - onDelete, - onChange, - } = props; - const [type, setType] = useState('string'); - const [field, setField] = useState({}); - const [dataSource, setDataSource] = useState(props.dataSource || {}); - useEffect(() => { - const field = fields.find(field => field.name === props.dataSource.column); - if (field) { - setField(field); - let componentType = field.component.type; - if (field.component.type === 'select' && field.multiple) { - componentType = 'multipleSelect'; - } - setType(componentType); - } - setDataSource({ ...props.dataSource }); - }, [props.dataSource, type]); - let ValueControl = controls[type] || controls.string; - if (['truncate'].indexOf(dataSource.op) !== -1) { - ValueControl = NullControl; - } else if (dataSource.op === 'ref') { - ValueControl = () => { - return ( - - ); - }; - } - // let multiple = true; - // if () - // const opOptions = op[type]||op.string; - const opOptions = [ - { label: '自定义填写', value: 'eq', selected: true }, - { label: '等于触发数据', value: 'ref' }, - { label: '清空数据', value: 'truncate' }, - ]; - console.log({ field, dataSource, type, ValueControl }); - return ( - - - - { - onChange({ ...dataSource, value: value }); - }} - style={{ width: 180 }} - /> - {showDeleteButton && ( - - )} - - ); -} - -export const Values = connect({ - getProps: mapStyledProps, -})(props => { - const { - value = [], - onChange, - associatedKey, - sourceName, - sourceFilter = {}, - filter = {}, - fields = [], - ...restProps - } = props; - - const { data = [], loading = true } = useRequest( - () => { - return associatedKey - ? api.resource(`collections.fields`).list({ - associatedKey, - filter, - }) - : Promise.resolve({ - data: fields, - }); - }, - { - refreshDeps: [associatedKey], - }, - ); - - const { data: sourceFields = [] } = useRequest( - () => { - return sourceName - ? api.resource(`collections.fields`).list({ - associatedKey: sourceName, - filter: sourceFilter, - }) - : Promise.resolve({ - data: [], - }); - }, - { - refreshDeps: [sourceName], - }, - ); - - return ( - Object.keys(item).length) - : [] - } - onChange={values => { - onChange(values.filter(item => Object.keys(item).length)); - }} - {...restProps} - fields={data} - sourceFields={sourceFields} - /> - ); -}); - -export default Values; diff --git a/packages/app/src/components/fields/values/style.less b/packages/app/src/components/fields/values/style.less deleted file mode 100644 index 54a1710ef7492e6aad5ba2119b8819dacf9b7053..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/values/style.less +++ /dev/null @@ -1,3 +0,0 @@ -.filter-remove-link { - color: #d9d9d9; -} diff --git a/packages/app/src/components/fields/values/useDynamicList.ts b/packages/app/src/components/fields/values/useDynamicList.ts deleted file mode 100644 index 25aff471706d12cbe61c6dbd2d48e44aded1b659..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/values/useDynamicList.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { useCallback, useRef, useState } from 'react'; - -export default (initialValue: T[]) => { - const counterRef = useRef(-1); - // key 存储器 - const keyList = useRef([]); - - // 内部方法 - const setKey = useCallback((index: number) => { - counterRef.current += 1; - keyList.current.splice(index, 0, counterRef.current); - }, []); - - const [list, setList] = useState(() => { - (initialValue || []).forEach((_, index) => { - setKey(index); - }); - return initialValue || []; - }); - - const resetList = (newList: T[] = []) => { - keyList.current = []; - counterRef.current = -1; - setList(() => { - (newList || []).forEach((_, index) => { - setKey(index); - }); - return newList || []; - }); - }; - - const insert = (index: number, obj: T) => { - setList(l => { - const temp = [...l]; - temp.splice(index, 0, obj); - setKey(index); - return temp; - }); - }; - - const getAll = () => list; - const getKey = (index: number) => keyList.current[index]; - const getIndex = (index: number) => - keyList.current.findIndex(ele => ele === index); - - const merge = (index: number, obj: T[]) => { - setList(l => { - const temp = [...l]; - obj.forEach((_, i) => { - setKey(index + i); - }); - temp.splice(index, 0, ...obj); - return temp; - }); - }; - - const replace = (index: number, obj: T) => { - setList(l => { - const temp = [...l]; - temp[index] = obj; - return temp; - }); - }; - - const remove = (index: number) => { - setList(l => { - const temp = [...l]; - temp.splice(index, 1); - - // remove keys if necessary - try { - keyList.current.splice(index, 1); - } catch (e) { - console.error(e); - } - return temp; - }); - }; - - const move = (oldIndex: number, newIndex: number) => { - if (oldIndex === newIndex) { - return; - } - setList(l => { - const newList = [...l]; - const temp = newList.filter((_: {}, index: number) => index !== oldIndex); - temp.splice(newIndex, 0, newList[oldIndex]); - - // move keys if necessary - try { - const keyTemp = keyList.current.filter( - (_: {}, index: number) => index !== oldIndex, - ); - keyTemp.splice(newIndex, 0, keyList.current[oldIndex]); - keyList.current = keyTemp; - } catch (e) { - console.error(e); - } - - return temp; - }); - }; - - const push = (obj: T) => { - setList(l => { - setKey(l.length); - return l.concat([obj]); - }); - }; - - const pop = () => { - // remove keys if necessary - try { - keyList.current = keyList.current.slice(0, keyList.current.length - 1); - } catch (e) { - console.error(e); - } - - setList(l => l.slice(0, l.length - 1)); - }; - - const unshift = (obj: T) => { - setList(l => { - setKey(0); - return [obj].concat(l); - }); - }; - - const sortForm = (result: unknown[]) => - result - .map((item, index) => ({ key: index, item })) // add index into obj - .sort((a, b) => getIndex(a.key) - getIndex(b.key)) // sort based on the index of table - .filter(item => !!item.item) // remove undefined(s) - .map(item => item.item); // retrive the data - - const shift = () => { - // remove keys if necessary - try { - keyList.current = keyList.current.slice(1, keyList.current.length); - } catch (e) { - console.error(e); - } - setList(l => l.slice(1, l.length)); - }; - - return { - list, - insert, - merge, - replace, - remove, - getAll, - getKey, - getIndex, - move, - push, - pop, - unshift, - shift, - sortForm, - resetList, - }; -}; diff --git a/packages/app/src/components/fields/wysiwyg/index.tsx b/packages/app/src/components/fields/wysiwyg/index.tsx deleted file mode 100644 index 0bf4e66f925fbaf47a73ca22750e39fe86acbd81..0000000000000000000000000000000000000000 --- a/packages/app/src/components/fields/wysiwyg/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from '@formily/react-schema-renderer'; -import React from 'react'; -import { Input as AntdInput } from 'antd'; -import { acceptEnum, mapStyledProps, mapTextComponent } from '../shared'; - -export const Wysiwyg = connect({ - getProps: mapStyledProps, - getComponent: mapTextComponent, -})( - acceptEnum(props => ( - - )), -); - -export default Wysiwyg; diff --git a/packages/app/src/components/menu/index.tsx b/packages/app/src/components/menu/index.tsx deleted file mode 100644 index 7d4dc4df6a01b6992aaef00a9145012b9f2059ef..0000000000000000000000000000000000000000 --- a/packages/app/src/components/menu/index.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Layout, Menu, Breadcrumb } from 'antd'; -import { Link as UmiLink, useLocation } from 'umi'; -import Icon from '@/components/icons'; -import './style.less'; - -function pathcamp(path1: string, path2: string) { - return true; - if (path1 === path2) { - return true; - } - return path1.indexOf(`${path2}/`) === 0; -} - -function Link(props: any) { - const { to, children } = props; - if (/^http/.test(to)) { - return ( - - {children} - - ); - } - return ; -} - -export default (props: any) => { - const { - menuId, - currentPageName, - items = [], - hideChildren, - ...restProps - } = props; - if (items.length === 0) { - return null; - } - const toPaths = data => { - const paths = []; - data.forEach(item => { - if (item.path && item.path === currentPageName) { - paths.push(`${item.name}`); - } - if (item.paths && item.paths.includes(currentPageName)) { - paths.push(`${item.name}`); - } - paths.push(...toPaths(item.children || [])); - }); - return paths; - }; - const keys = toPaths(items); - console.log({ menuId, currentPageName, items, keys }); - const [loading, setLoading] = useState(true); - useEffect(() => { - setLoading(true); - setTimeout(() => { - setLoading(false); - }); - }, [menuId]); - if (loading) { - return null; - } - const renderChildren = items => { - return items.map(item => { - const { children = [] } = item; - // const subItems = children.filter(child => child.showInMenu); - if (!hideChildren && children.length) { - return ( - } - title={<>{item.title}} - > - {renderChildren(children)} - - ); - } - return ( - } - key={`${item.name}`} - > - {item.title} - - ); - }); - }; - return ( - { - console.log({ openKeys }); - }} - onSelect={info => { - console.log({ info }); - }} - onDeselect={info => { - console.log({ info }); - }} - {...restProps} - > - {renderChildren(items)} - - ); -}; diff --git a/packages/app/src/components/menu/style.less b/packages/app/src/components/menu/style.less deleted file mode 100644 index fc47ce22ec1113c4b53551f5d09c2799c2b414c2..0000000000000000000000000000000000000000 --- a/packages/app/src/components/menu/style.less +++ /dev/null @@ -1,7 +0,0 @@ -.ant-menu-sub.ant-menu-inline > .ant-menu-item, -.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { - height: 32px; - line-height: 32px; - margin: 4px 0; - font-size: 13px; -} diff --git a/packages/app/src/components/pages/AdminLoader/index.tsx b/packages/app/src/components/pages/AdminLoader/index.tsx deleted file mode 100644 index c81109f57a6b3fa0a9309bddb1cb9579a82e4779..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/AdminLoader/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; -import api from '@/api-client'; -import { useRequest, useLocation, useHistory, Redirect } from 'umi'; -import get from 'lodash/get'; -import { TopMenuLayout } from '@/components/pages/TopMenuLayout'; -import { SideMenuLayout } from '@/components/pages/SideMenuLayout'; -import Page from '@/components/pages/Page'; -import pathToRegexp from 'path-to-regexp'; -import { Spin } from '@/components/spin'; - -export function AdminLoader(props: any) { - const { data = [], error, loading, run } = useRequest(() => - api.resource('menus').getTree(), - ); - (window as any).reloadMenu = async () => { - await run(); - }; - const { - lastPage: { path }, - } = props; - const location = useLocation(); - const match = pathToRegexp(`${path}/:path?/:rowId?/:tabId?`).exec( - location.pathname, - ); - const pageName = match[1] || null; - const history = useHistory(); - - const currentRowId = match[2] || null; - const items = data; - // .filter(item => item.type !== 'group' || (item.children && item.children.length)) - const sideMenu = items.find(item => { - if (item.paths && item.paths.includes(pageName)) { - return true; - } - return false; - }); - console.log({ pageName, sideMenu }); - - if (loading) { - return ; - } - - if (!pageName) { - return ; - } - - return ( - <> - - {sideMenu ? ( - - - - ) : ( - - )} - - - ); -} - -export default AdminLoader; diff --git a/packages/app/src/components/pages/AvatarDropdown/index.tsx b/packages/app/src/components/pages/AvatarDropdown/index.tsx deleted file mode 100644 index f69e7b976b504b60a9bd6bc8b8320bd6f8ab15f7..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/AvatarDropdown/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; -import { Layout, Menu, Dropdown, Avatar } from 'antd'; -import './style.less'; -import { history, Link, request, useModel } from 'umi'; -import { - ProfileOutlined, - LogoutOutlined, - UserOutlined, - CodeOutlined, -} from '@ant-design/icons'; -import Icon from '@/components/icons'; -import { useResponsive } from 'ahooks'; - -const overlay = ( - - - 个人资料 - - - { - await request('/users:logout'); - localStorage.removeItem('NOCOBASE_TOKEN'); - (window as any).routesReload(); - history.push('/login'); - // window.location.href = '/login'; - }} - > - 退出登录 - - -); - -export default (props: any) => { - const { - initialState = {}, - loading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - const responsive = useResponsive(); - const isMobile = responsive.small && !responsive.middle && !responsive.large; - const { currentUser = {} } = initialState as any; - return ( -
- - e.preventDefault()} - > - } - style={{ marginRight: 5 }} - />{' '} - { currentUser.nickname || currentUser.email } - - -
- ); -}; diff --git a/packages/app/src/components/pages/AvatarDropdown/style.less b/packages/app/src/components/pages/AvatarDropdown/style.less deleted file mode 100644 index 229bd0ca7fa3a50641bba5544e8f9cc53355fb00..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/AvatarDropdown/style.less +++ /dev/null @@ -1,27 +0,0 @@ -.avatar-dropdown-wrapper { - position: absolute; - right: 0; - color: rgba(255, 255, 255, 0.65); - &:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.1); - } - .dropdown-link { - padding-left: 20px; - padding-right: 20px; - cursor: pointer; - } -} - -@media only screen and (max-width: 800px) { - .avatar-dropdown-wrapper { - bottom: 0; - left: 0; - right: auto; - width: 100%; - .dropdown-link { - display: block; - padding: 10px 20px; - } - } -} diff --git a/packages/app/src/components/pages/Page/index.tsx b/packages/app/src/components/pages/Page/index.tsx deleted file mode 100644 index 8caf6b56712e0e0b9145424627a468945a6039b4..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/Page/index.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React from 'react'; -import { PageHeader, Card, Row, Col, Modal, message } from 'antd'; -import './style.less'; -import { Helmet, useHistory } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useModel } from 'umi'; -import api from '@/api-client'; -import View from '@/components/views'; -import get from 'lodash/get'; -import { markdown } from '@/components/views/Field'; - -export function Page(props: any) { - const { currentRowId, pageName, children, ...restProps } = props; - const { initialState = {}, refresh, setInitialState } = useModel( - '@@initialState', - ); - const siteTitle = get(initialState, 'systemSettings.title'); - - const { data = {}, loading, error } = useRequest( - () => - api.resource('menus').getInfo({ - resourceKey: pageName, - }), - { - refreshDeps: [pageName], - }, - ); - - const history = useHistory(); - - if (error) { - return null; - } - - if (loading) { - return ; - } - - const views = data.views || []; - - return ( -
- - - {data.title} - {siteTitle} - - - -
-
- {views.map(view => { - let viewName: string; - let span = 24; - let float = 'left'; - if (typeof view === 'string') { - viewName = view; - } - if (typeof view === 'object') { - viewName = `${view.name}`; - if (view.width === '50%') { - span = 12; - } else if (view.width === '100%') { - span = 24; - } - if (view.float == 'right') { - float = 'right'; - } - } - return ( -
- { - if (!view.draft) { - message.success('草稿保存成功'); - return; - } - if (!view.draft.message) { - return; - } - Modal.success({ - title: '草稿保存成功', - content: ( -
- ), - onCancel: () => { - const path = get(view, 'redirect.name'); - path && history.push(`${path}`); - }, - onOk: () => { - const path = get(view, 'redirect.name'); - path && history.push(`${path}`); - }, - }); - }} - onFinish={() => { - if (!view.message) { - return; - } - Modal.success({ - title: '提交成功', - content: ( -
- ), - onOk: () => { - const path = get(view, 'redirect.name'); - path && history.push(`${path}`); - }, - onCancel: () => { - const path = get(view, 'redirect.name'); - path && history.push(`${path}`); - }, - }); - }} - viewName={viewName} - /> -
- ); - })} -
-
-
- ); -} - -export default Page; diff --git a/packages/app/src/components/pages/Page/style.less b/packages/app/src/components/pages/Page/style.less deleted file mode 100644 index c8d46a2ee21069c8cc7c4db238dc1215153c9e60..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/Page/style.less +++ /dev/null @@ -1,66 +0,0 @@ -.page-content { - margin: 24px; -} - -.env-root-push + style + div > div { - transform: translateX(-10%); -} - -.env-root-push + div > div { - transform: translateX(-10%); -} - -@media only screen and (max-width: 800px) { - .ant-row.nb-row { - margin: 0 !important; - .ant-col { - display: block; - flex: 0 0 100%; - max-width: 100%; - padding: 0 !important; - margin-bottom: 1px !important; - } - } -} - -.noco-row { - margin: 0 -12px; - &::after { - content: ' '; - clear: both; - display: block; - } - .noco-col { - margin-left: 12px; - margin-right: 12px; - margin-bottom: 24px; - width: calc(50% - 24px); - float: left; - } - .noco-col-24 { - width: calc(100% - 24px); - } - .float-left { - float: left; - clear: left; - } - .float-right { - float: right; - clear: right; - } -} - -@media only screen and (max-width: 800px) { - .page-content { - margin: 0; - margin-top: 1px; - } - .noco-row { - margin: 0; - .noco-col { - width: 100%; - margin: 0; - margin-bottom: 1px; - } - } -} \ No newline at end of file diff --git a/packages/app/src/components/pages/PageLoader.tsx b/packages/app/src/components/pages/PageLoader.tsx deleted file mode 100644 index 7d2bb03c05c91d27d93bcfc93c13132d0fc96f19..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/PageLoader.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { useState } from 'react'; -import { TemplateLoader } from './TemplateLoader'; -import { useRequest } from 'umi'; -import { templates } from '@/pages'; -import api from '@/api-client'; - -export function PageLoader(props: any) { - const { path } = props.match.params; - const { data = {}, error, loading, run } = useRequest(() => - api.resource('pages').getRoutes(), - ); - const [first, setFirst] = useState(true); - (window as any).routesReload = async () => { - setFirst(false); - await run(); - }; - console.log(data); - return ( - - ); -} - -export default PageLoader; diff --git a/packages/app/src/components/pages/SideMenuLayout/index.tsx b/packages/app/src/components/pages/SideMenuLayout/index.tsx deleted file mode 100644 index a4d385de9eb5cb492b57cd6decb133ee3e8ba5e9..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/SideMenuLayout/index.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React, { useState } from 'react'; -import { Layout, Breadcrumb, Drawer } from 'antd'; -import { Link } from 'umi'; -import Menu from '@/components/menu'; -import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons'; -import { useLocalStorageState } from 'ahooks'; -import { useResponsive } from 'ahooks'; -import './style.less'; - -export function SideMenuLayout(props: any) { - const { currentPageName, menu = [], menuId } = props; - const [visible, setVisible] = useState(false); - // console.log(menu); - const [collapsed, setCollapsed] = useLocalStorageState( - `nocobase-menu-collapsed-${menuId}`, - false, - ); - const responsive = useResponsive(); - const isMobile = responsive.small && !responsive.middle && !responsive.large; - document.body.className = collapsed ? 'collapsed' : ''; - return ( - - {!isMobile && ( - - -
{ - setCollapsed(!collapsed); - setVisible(true); - document.body.className = collapsed ? 'collapsed' : ''; - }} - className={'menu-toggle'} - > - {React.createElement( - collapsed ? MenuUnfoldOutlined : MenuFoldOutlined, - { - style: { fontSize: 16 }, - }, - )} -
- - )} - - {props.children} - {isMobile && ( - { - setCollapsed(!collapsed); - setVisible(false); - document.body.className = collapsed ? 'collapsed' : ''; - }} - placement={'left'} - closable={false} - bodyStyle={{ padding: 0 }} - > - { - setCollapsed(false); - setVisible(false); - document.body.className = collapsed ? 'collapsed' : ''; - }} - currentPageName={currentPageName} - menuId={menuId} - items={menu} - mode={'inline'} - /> - - )} - {isMobile && ( -
{ - setCollapsed(!collapsed); - setVisible(true); - document.body.className = collapsed ? 'collapsed' : ''; - }} - className={'menu-toggle'} - > - {React.createElement( - collapsed ? MenuUnfoldOutlined : MenuFoldOutlined, - { - style: { fontSize: 16 }, - }, - )} -
- )} - - - ); -} - -export default SideMenuLayout; diff --git a/packages/app/src/components/pages/SideMenuLayout/style.less b/packages/app/src/components/pages/SideMenuLayout/style.less deleted file mode 100644 index 391ba1df796d435de9bf6822fed99099e3706879..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/SideMenuLayout/style.less +++ /dev/null @@ -1,21 +0,0 @@ -.nb-sider { - position: relative; - left: 0; - z-index: 100; - box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); - &.collapsed { - margin-left: -200px; - } - .ant-menu-light { - border-right-color: transparent !important; - } -} - -.menu-toggle { - position: fixed; - bottom: 12px; - left: 12px; - line-height: 1; - cursor: pointer; - z-index: 1000; -} diff --git a/packages/app/src/components/pages/TemplateLoader.tsx b/packages/app/src/components/pages/TemplateLoader.tsx deleted file mode 100644 index 4ab965f52cb83c0c0e8700fd60526f6a5b8abfdb..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TemplateLoader.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import { Redirect } from 'umi'; -import get from 'lodash/get'; -import { Spin } from '@/components/spin'; -// import { CollectionLoader } from './CollectionLoader'; - -function getRoutes(path: string, pages: any) { - const keys = path.split('/'); - const routes: Array = []; - while (keys.length) { - const uri = keys.join('/'); - if (pages[uri]) { - routes.push({ ...pages[uri], path: uri }); - } - keys.pop(); - } - if (path && pages['/']) { - routes.push({ ...pages['/'], path: '/' }); - } - return routes; -} - -export function TemplateLoader(props: any) { - const { loading, pathname, pages, templates } = props; - if (loading) { - return ; - } - const redirect = get(pages, [pathname, 'redirect']); - if (redirect) { - return ; - } - const routes = getRoutes(pathname, pages); - let component: any; - console.log(templates); - const len = routes.length; - const componentProps = { ...props }; - while (routes.length) { - const route = routes.shift(); - console.log(route.template); - // const tmp = route.template.replace(/^@\/pages\//g, ''); - let Component: any; - // const Component = route.type === 'collection' - // ? CollectionLoader - // : require(`@/pages/${tmp}`).default; - if (route.type === 'collection') { - Component = (props) => { - return
- }; - componentProps.match.params['collection'] = route.collection; - } else { - Component = templates[route.template]; - } - if (len === routes.length + 1) { - componentProps.match.params['pagepath'] = route.path.replace(/^\//g, ''); - componentProps['lastPage'] = route; - } - componentProps['page'] = route; - component = ( - - {component} - - ); - if (route.inherit === false) { - break; - } - } - return component; -} - -export default TemplateLoader; diff --git a/packages/app/src/components/pages/TopMenuLayout/index.tsx b/packages/app/src/components/pages/TopMenuLayout/index.tsx deleted file mode 100644 index 9910e9186ae7ff641f5de0c9e3dc7bf5a44a8b4d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TopMenuLayout/index.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import React, { useState } from 'react'; -import { Layout, Dropdown, Avatar, Drawer } from 'antd'; -import './style.less'; -import { history, Link, request, useModel } from 'umi'; -import { UserOutlined, CodeOutlined, MenuOutlined } from '@ant-design/icons'; -import AvatarDropdown from '@/components/pages/AvatarDropdown'; -import Menu from '@/components/menu'; -import { useResponsive, useLocalStorageState } from 'ahooks'; -import get from 'lodash/get'; - -export function TopMenuLayout(props: any) { - const { currentPageName, menu = [] } = props; - console.log({ menu }); - // const [visible, setVisible] = useState(false); - const [visible, setVisible] = useLocalStorageState( - `nocobase-nav-visible`, - false, - ); - const responsive = useResponsive(); - const isMobile = responsive.small && !responsive.middle && !responsive.large; - const { - initialState = {}, - loading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - const logoUrl = get(initialState, 'systemSettings.logo.url'); - console.log({ logoUrl }); - return ( - - -
- {logoUrl && } -
- {!isMobile && ( - - )} - {!isMobile && } - {isMobile && ( - { - setVisible(true); - }} - style={{ - fontSize: 16, - color: '#fff', - position: 'absolute', - right: 16, - top: 16, - }} - /> - )} - {isMobile && ( - { - setVisible(false); - }} - placement={'right'} - closable={false} - bodyStyle={{ background: '#001529', padding: 0 }} - > - { - setVisible(false); - }} - mode={'inline'} - hideChildren={true} - items={menu} - className={'noco-top-menu'} - style={{ float: 'left' }} - theme="dark" - /> - - - )} - - {props.children} - - ); -} - -export default TopMenuLayout; diff --git a/packages/app/src/components/pages/TopMenuLayout/logo-blue.svg b/packages/app/src/components/pages/TopMenuLayout/logo-blue.svg deleted file mode 100644 index 80b9f1bbb7bf5bfbbbae05196c3f43c2f13b87e2..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TopMenuLayout/logo-blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/app/src/components/pages/TopMenuLayout/logo-white.svg b/packages/app/src/components/pages/TopMenuLayout/logo-white.svg deleted file mode 100644 index 475f38e7dceb31b60741206b25e64eddf52feb5d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TopMenuLayout/logo-white.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/packages/app/src/components/pages/TopMenuLayout/logo.svg b/packages/app/src/components/pages/TopMenuLayout/logo.svg deleted file mode 100644 index 1aa836ce401096b74a2a4ba96ec1a18bc94d1ac1..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TopMenuLayout/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/app/src/components/pages/TopMenuLayout/style.less b/packages/app/src/components/pages/TopMenuLayout/style.less deleted file mode 100644 index 58e2850db4333413029981d46a4e57b158554d04..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/TopMenuLayout/style.less +++ /dev/null @@ -1,37 +0,0 @@ -.logo { - // font-family: 'Michroma', sans-serif; - color: rgba(255, 255, 255, 0.8); - font-size: 18px; - letter-spacing: 2px; - font-weight: 300; - padding: 0 15px; - img { - height: 100%; - } - svg { - margin-top: 12px; - } -} - -body { - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.noco-top-menu.ant-menu-dark.ant-menu-horizontal > .ant-menu-item:hover, -.noco-top-menu.ant-menu.ant-menu-dark .ant-menu-item-selected, -.noco-top-menu.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { - background-color: rgba(255, 255, 255, 0.1); -} - -.ant-layout-content { - overflow: auto; -} - -.ant-layout-header { - display: flex; -} - -.ant-menu-dark.ant-menu-horizontal { - margin-right: 100px; -} diff --git a/packages/app/src/components/pages/index.tsx b/packages/app/src/components/pages/index.tsx deleted file mode 100644 index 413de02d9aa2579dff3ef13843c0f70e11745931..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export { PageLoader } from './PageLoader'; -export { TemplateLoader } from './TemplateLoader'; -export { PageLoader as default } from './PageLoader'; diff --git a/packages/app/src/components/pages/style.less b/packages/app/src/components/pages/style.less deleted file mode 100644 index 0544bb7f90c62677d4b58c2c14b3e5c868d6b658..0000000000000000000000000000000000000000 --- a/packages/app/src/components/pages/style.less +++ /dev/null @@ -1,20 +0,0 @@ -.page-content { - margin: 24px; -} - -.popover-button-mask { - height: 100vh; - width: 100vw; - z-index: -1; - position: fixed; - background-color: rgba(0, 0, 0, 0.45); - top: 0px; - left: 0px; -} - -@media only screen and (max-width: 800px) { - #content .page-content { - margin: 0px; - margin-top: 1px; - } -} diff --git a/packages/app/src/components/spin/index.tsx b/packages/app/src/components/spin/index.tsx deleted file mode 100644 index edd588d3d7de008bf72c952cb8fa04af787e57fa..0000000000000000000000000000000000000000 --- a/packages/app/src/components/spin/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Spin as AntdSpin } from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; - -export const icon = ; - -export function Spin(props: any) { - return ( - - ); -} diff --git a/packages/app/src/components/views/Association.tsx b/packages/app/src/components/views/Association.tsx deleted file mode 100644 index 77d5f058d87e2aff6104c71ce156d128b210db91..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Association.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import './style.less'; -import { Helmet } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useLocation } from 'umi'; -import api from '@/api-client'; -import { Actions } from '@/components/actions'; -import { - Table as AntdTable, - Card, - Pagination, - Button, - Tabs, - Descriptions, - Tooltip, -} from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; -import ReactDragListView from 'react-drag-listview'; -import arrayMove from 'array-move'; -import get from 'lodash/get'; -import Drawer from '@/components/drawer'; -import Field from '@/components/views/Field'; -import { Form } from './Form'; -import { View } from '.'; - -export function Association(props) { - const { schema = {}, ...restProps } = props; - const { targetViewName } = schema; - return ( -
- -
- ); -} diff --git a/packages/app/src/components/views/Calendar/index.tsx b/packages/app/src/components/views/Calendar/index.tsx deleted file mode 100644 index 45b1b846d0608840f74f302fdbb115653b8dd3cb..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Calendar/index.tsx +++ /dev/null @@ -1,272 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Table as AntdTable, Card, Pagination } from 'antd'; -import { useRequest, useHistory } from 'umi'; -import api from '@/api-client'; -import { - LoadingOutlined, - LeftOutlined, - RightOutlined, -} from '@ant-design/icons'; -import './style.less'; -import { Calendar as BigCalendar, momentLocalizer } from 'react-big-calendar'; -import * as dates from 'react-big-calendar/lib/utils/dates'; -import moment from 'moment'; -const localizer = momentLocalizer(moment); // or globalizeLocalizer -import Drawer from '@/components/drawer'; -import { Details, DetailsPage } from '../Table'; -import { Actions } from '@/components/actions'; - -export const icon = ; - -export interface CalendarProps { - schema?: any; - activeTab?: any; - resourceName: string; - associatedName?: string; - associatedKey?: string; - [key: string]: any; -} - -// let weekRangeFormat = ({ start, end }, culture, local) => -// local.format(start, 'MMMM DD', culture) + -// ' – ' + -// local.format(end, dates.eq(start, end, 'month') ? 'DD' : 'MMMM DD', culture) - -function toEvents(data, options: any = {}) { - const { startDateField, endDateField, labelField, idField = 'id' } = options; - if (!Array.isArray(data)) { - return []; - } - return data.map(item => ({ - id: item[idField], - title: item[labelField], - allDay: true, - start: moment( - item[startDateField || 'createdAt'] || item.created_at, - ).toDate(), - end: moment( - item[endDateField || startDateField || 'createdAt'] || item.created_at, - ).toDate(), - })); -} - -export function Calendar(props: CalendarProps) { - const { schema = {}, associatedKey, defaultFilter } = props; - - const paginated = false; - - const { - rowKey = 'id', - filter: schemaFilter, - sort, - appends, - resourceName, - labelField, - startDateField, - endDateField, - detailsOpenMode, - details = [], - actions = [], - } = schema; - - console.log({ schema }); - - const [calendarView, setCalendarView] = useState('month'); - - const history = useHistory(); - - const { data, loading, mutate, refresh, run, params } = useRequest( - (params = {}, ...args) => { - const { current, pageSize, sorter, filter, ...restParams } = params as any; - console.log('paramsparamsparamsparamsparams', params, args); - return api - .resource(resourceName) - .list({ - associatedKey, - page: paginated ? current : 1, - perPage: paginated ? pageSize : -1, - sorter, - sort, - 'fields[appends]': appends, - // filter, - // ...actionDefaultParams, - filter: { - and: [ - defaultFilter, - schemaFilter, - filter, - // __parent ? { - // collection_name: __parent, - // } : null, - ].filter(obj => obj && Object.keys(obj).length), - }, - // ...args2, - }) - .then(({ data = [], meta = {} }) => { - return { - data: { - list: data, - total: meta.count || data.length, - }, - }; - }); - }, - { - paginated, - }, - ); - - const events = toEvents(data?.list, { - idField: rowKey, - labelField, - startDateField, - endDateField, - }); - - const messages = { - allDay: '', - previous: ( -
- -
- ), - next: ( -
- -
- ), - today: '今天', - month: '月', - week: '周', - day: '天', - agenda: '列表', - date: '日期', - time: '时间', - event: '事件', - noEventsInRange: '无', - showMore: count => `还有 ${count} 项`, - }; - - console.log('events', data); - return ( -
- - { - if (dates.eq(start, end, 'month')) { - return local.format(start, 'Y年M月', culture); - } - return `${local.format(start, 'Y年M月', culture)} - ${local.format( - end, - 'Y年M月', - culture, - )}`; - }, - }} - events={events} - onSelectSlot={slotInfo => { - // setFormMode('create'); - // drawerRef.current.setVisible(true); - // console.log('onSelectSlot', slotInfo) - }} - onView={view => { - setCalendarView(view); - console.log(view); - }} - onSelectEvent={data => { - console.log({ data }); - if (!detailsOpenMode || !details.length) { - return; - } - if (detailsOpenMode === 'window') { - const paths = history.location.pathname.split('/'); - history.push(`/admin/${paths[2]}/${data[rowKey]}/0`); - } else { - Drawer.open({ - headerStyle: - details.length > 1 - ? { - paddingBottom: 0, - borderBottom: 0, - // paddingTop: 16, - // marginBottom: -4, - } - : {}, - // title: details.length > 1 ? undefined : data[labelField], - title: data.title, - bodyStyle: { - // padding: 0, - }, - content: ({ resolve, closeWithConfirm }) => ( -
-
{ - await refresh(); - resolve(); - }} - onValueChange={() => { - closeWithConfirm && closeWithConfirm(true); - }} - onDraft={async () => { - await refresh(); - resolve(); - }} - onReset={resolve} - onDataChange={async () => { - await refresh(); - }} - data={data} - resolve={resolve} - items={details} - /> -
- ), - }); - } - }} - onRangeChange={range => { - console.log({ range }); - }} - views={['month', 'week', 'day']} - // step={120} - // showMultiDayTimes - // max={dates.add(dates.endOf(new Date(2015, 17, 1), 'day'), -1, 'hours')} - // defaultDate={new Date(2015, 3, 1)} - components={{ - timeGutterHeader: () =>
全天
, - }} - localizer={localizer} - /> -
- ); -} diff --git a/packages/app/src/components/views/Descriptions.tsx b/packages/app/src/components/views/Descriptions.tsx deleted file mode 100644 index 60ddf4875ef1dc2784e44f909b9765cc20936f62..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Descriptions.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import React, { useRef } from 'react'; -import './style.less'; -import { Helmet } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useLocation } from 'umi'; -import api from '@/api-client'; -import { Actions } from '@/components/actions'; -import { - Table as AntdTable, - Card, - Pagination, - Button, - Tabs, - Descriptions as AntdDescriptions, - Tooltip, -} from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; -import arrayMove from 'array-move'; -import get from 'lodash/get'; -import Drawer from '@/components/drawer'; -import Field from '@/components/views/Field'; -import { Form } from './Form'; -import { configResponsive, useResponsive } from 'ahooks'; -import { InfoCircleOutlined } from '@ant-design/icons'; - -configResponsive({ - small: 0, - middle: 800, - large: 1200, -}); -function toGroups(fields: any[]) { - const groups = []; - let group = { - title: undefined, - tooltip: undefined, - children: [], - }; - fields.forEach(field => { - if (field.interface === 'description') { - if (group.children.length) { - groups.push(group); - } - group = { - title: field.title, - tooltip: field.tooltip, - children: [], - }; - } else { - group.children.push(field); - } - }); - if (group.children.length) { - groups.push(group); - } - return groups; -} - -export function Descriptions(props) { - const { data: record = {}, schema = {}, onDataChange } = props; - const { - rowKey = 'id', - resourceName, - fields = [], - actions = [], - appends = [], - associationField = {}, - } = schema; - const responsive = useResponsive(); - - const resourceKey = - props.resourceKey || record[associationField.targetKey || rowKey]; - const associatedKey = - props.associatedKey || record[associationField.sourceKey || 'id']; - - // console.log({resourceKey, data: record, associatedKey, associationField}) - - const { data = {}, loading, refresh } = useRequest(() => { - return api.resource(resourceName).get({ - resourceKey, - associatedKey, - 'fields[appends]': appends, - }); - }); - const contentRef = useRef(); - if (loading) { - return ; - } - let descriptionsProps: any = { - size: 'middle', - bordered: true, - }; - if (responsive.small && !responsive.middle && !responsive.large) { - descriptionsProps = { - layout: 'vertical', - }; - } - const groups = toGroups(fields); - - return ( -
- -
- {groups.map(group => ( - - {group.title}{' '} - {group.tooltip && ( - - - - )} - - ) - } - column={1} - > - {group.children.map((field: any) => { - const label = field.tooltip ? ( - <> - {field.title || field.name}  - - - - - ) : ( - field.title || field.name - ); - return ( - - - - ); - })} - - ))} -
-
- ); -} diff --git a/packages/app/src/components/views/Field/index.tsx b/packages/app/src/components/views/Field/index.tsx deleted file mode 100644 index b54a4dc3294cee91a9568b3febd068d728a8b73f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Field/index.tsx +++ /dev/null @@ -1,557 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import moment from 'moment'; -import { Tag, Popover, Table, Modal, Checkbox, message } from 'antd'; -import Icon from '@/components/icons'; -import get from 'lodash/get'; -import isEmpty from 'lodash/isEmpty'; -import findIndex from 'lodash/findIndex'; -import { getImageByUrl, testUrl } from '@/components/fields'; -import { CheckOutlined, CloseOutlined } from '@ant-design/icons'; -import marked from 'marked'; -import set from 'lodash/set'; -import Lightbox from 'react-image-lightbox'; -import api from '@/api-client'; -import { useRequest } from 'umi'; -import Drawer from '@/components/drawer'; -import View from '@/components/views'; -import './style.less'; -import 'react-image-lightbox/style.css'; - -marked.setOptions({ - gfm: true, - breaks: true, -}); - -const renderer = new marked.Renderer(); -renderer.link = (href, title, text) => - `${text}`; - -export function markdown(text: string) { - return marked(text, { - renderer, - }); -} - -const InterfaceTypes = new Map(); - -function registerFieldComponent(type, Component) { - InterfaceTypes.set(type, Component); -} - -function registerFieldComponents(components) { - Object.keys(components).forEach(key => { - registerFieldComponent(key, components[key]); - }); -} - -function getFieldComponent(type) { - if (InterfaceTypes.has(type)) { - return InterfaceTypes.get(type); - } - return InterfaceTypes.get('string'); -} - -export function StringField(props: any) { - const { value, viewType } = props; - if (!value) { - return null; - } - if (typeof value === 'object') { - return JSON.stringify(value); - } - if (viewType === 'table' && value.length > 20) { - return ( - { - e.stopPropagation(); - }} - style={{ maxWidth: 300 }} - > - {value} -
- } - > - {value.substring(0, 15)}... - - ); - } - return <>{value}; -} - -export function TextareaField(props: any) { - const { value, viewType } = props; - if (!value) { - return null; - } - if (viewType !== 'table') { - return ( -
- ); - } - if (value.length > 20) { - return ( - e.stopPropagation()} - className={'textarea-field-content'} - style={{ maxWidth: 300 }} - dangerouslySetInnerHTML={{ __html: markdown(value) }} - /> - } - > - {value.substring(0, 15)}... - - ); - } - return <>{value}; -} -// const { data = [], loading = true } = useRequest(() => { -// return api.resource('collections.actions').list({ -// associatedKey: resourceKey, -// }); -// }, { -// refreshDeps: [resourceKey] -// }); -export function BooleanField(props: any) { - const { - data = {}, - value, - schema: { name, editable, resourceName }, - } = props; - if (editable) { - return ( - { - await api.resource(resourceName).toggle({ - associatedKey: data.associatedKey, - resourceKey: data.id, - }); - message.success('保存成功'); - // console.log(props); - }} - /> - ); - } - // console.log(props); - return ( - <> - {value ? ( - - ) : ( - - )} - - ); -} - -export function NumberField(props: any) { - const { - schema: { precision = 0 }, - value, - } = props; - if (!isNumber(value)) { - return null; - } - return ( -
- {new Intl.NumberFormat().format(value)} -
- ); -} - -export function isNumber(num) { - if (typeof num === 'number') { - return num - num === 0; - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); - } - return false; -} - -export function PercentField(props: any) { - const { - schema: { precision = 0 }, - value, - } = props; - if (!isNumber(value)) { - return null; - } - return ( -
- {new Intl.NumberFormat().format(value)}% -
- ); -} - -export function DateTimeField(props: any) { - const { - schema: { dateFormat, showTime, timeFormat }, - value, - } = props; - const m = moment(value); - if (!m.isValid()) { - return null; - } - let format = dateFormat; - if (showTime) { - format += ` ${timeFormat}`; - } - return <>{m.format(`${format}`)}; -} - -export function IconField(props) { - const { value } = props; - return ; -} - -function toFlat(items = []): Array { - let flat = []; - items.forEach(item => { - flat.push(item); - if (Array.isArray(item.children) && item.children.length) { - flat = flat.concat(toFlat(item.children)); - } - }); - return flat; -} - -export function DataSourceField(props: any) { - const { - schema: { dataSource = [] }, - value, - } = props; - const items = toFlat(dataSource); - // console.log(items); - if (isEmpty(value)) { - return null; - } - if (Array.isArray(value)) { - return value.map(val => { - const item = items.find(item => item.value === val); - return item ? ( - {item ? item.label : val} - ) : ( - {val} - ); - }); - } - const item = items.find(item => item.value === value); - return item ? ( - {item ? item.label : value} - ) : ( - {value} - ); -} - -export function RealtionField(props: any) { - const { - schema: { labelField }, - value, - } = props; - if (!value) { - return null; - } - const items = Array.isArray(value) ? value : [value]; - return ( - <> - {items.map(item => ( - {get(item, labelField)} - ))} - - ); -} - -export function SubTableField(props: any) { - const { - data, - schema, - schema: { name, children, collection_name }, - value, - } = props; - if (!Array.isArray(value)) { - return null; - } - const viewName = `${collection_name}.${name}.${schema.viewName || 'table'}`; - console.log({ value, viewName, schema }); - return ( -
- -
- ); -} - -export function LinkToField(props: any) { - const { ctx, data, schema, value } = props; - if (!value) { - return null; - } - // console.log({props}); - const values = Array.isArray(value) ? value : [value]; - const isArr = Array.isArray(value); - return ( -
- {values.map((item, itemIndex) => ( - - ))} -
- ); -} - -export function LinkToFieldLink(props) { - const { - data, - isArr, - itemIndex, - ctx = {}, - parent, - schema, - schema: { title, labelField, viewName, name, target, collection_name }, - } = props; - // const [data, setData] = useState(props.data||{}); - return ( - - { - e.stopPropagation(); - // setVisible(true); - Drawer.open({ - title: data[labelField], - content: ({ resolve, closeWithConfirm }) => { - const { index, mutate, dataSource, onChange } = ctx; - return ( -
- { - closeWithConfirm && closeWithConfirm(true); - }} - noRequest={!!onChange} - onFinish={values => { - if (typeof index === 'undefined') { - return; - } - let items = [...dataSource]; - const parentData = { ...parent }; - set( - parentData, - isArr ? [name, itemIndex] : [name], - values, - ); - items[index] = parentData; - // setData(values); - mutate(items); - onChange(items); - resolve(); - // console.log({values, parentData, data, items}); - }} - associatedKey={parent.id} - data={data} - viewName={ - viewName || `${collection_name}.${name}.descriptions` - } - /> -
- ); - }, - }); - }} - > - {data[labelField]} -
-
- ); -} - -function getImgUrls(value) { - const values = Array.isArray(value) ? value : [value]; - return values - .filter(item => testUrl(item.url)) - .map(item => item); -} - -export function AttachmentField(props: any) { - const { value, schema } = props; - const [imgIndex, setImgIndex] = useState(0); - const [visible, setVisible] = useState(false); - if (!value) { - return null; - } - const values = Array.isArray(value) ? value : [value]; - const images = getImgUrls(values); - return ( -
{ - e.stopPropagation(); - }} - className={'attachment-field'} - > - {values.map(item => ( - { - setVisible(true); - const index = findIndex(images, img => item.id === img.id); - setImgIndex(index); - }} - data={item} - schema={schema} - /> - ))} - {visible && ( - setVisible(false)} - onMovePrevRequest={() => { - setImgIndex((imgIndex + images.length - 1) % images.length); - }} - onMoveNextRequest={() => { - setImgIndex((imgIndex + 1) % images.length); - }} - /> - )} -
- ); -} - -export function AttachmentFieldItem(props: any) { - const { title, url } = props.data || {}; - const img = getImageByUrl(url, { - // exclude: ['.png', '.jpg', '.jpeg', '.gif'], - }); - // const [visible, setVisible] = useState(false); - return ( - <> - { - e.stopPropagation(); - if (testUrl(url)) { - props.onClick && props.onClick(); - // setVisible(true); - e.preventDefault(); - } - }} - className={'attachment-field-item'} - target={'_blank'} - href={url} - > - {title} - - {/* { - e.stopPropagation(); - setVisible(false); - }} - // @ts-ignore - onClick={(e) => { - e.stopPropagation(); - }} - bodyStyle={{padding: 0}} - footer={null} - visible={visible}> - { - e.stopPropagation(); - }} style={{height: 'auto', width: '100%'}} alt={title} title={title} src={url}/> - */} - - ); -} - -export function LogField(props) { - const { value = {} } = props; - return
{value.title || value.name}
; -} - -export function LogFieldValue(props) { - const { value, data } = props; - return ( - - ); -} - -export function JsonField(props) { - const { value } = props; - if (typeof value === 'object') { - return ( -
-        {JSON.stringify(value, null, 2)}
-      
- ); - } -} - -export function ChinaRegion(props: any) { - const { schema, value } = props; - if (!value) { - return null; - } - const values = (Array.isArray(value) ? value : [value]).sort((a, b) => - a.level !== b.level ? a.level - b.level : a.sort - b.sort, - ); - return ( -
- {values.map(item => item.name).join('/')} -
- ); -} - -registerFieldComponents({ - string: StringField, - textarea: TextareaField, - boolean: BooleanField, - select: DataSourceField, - status: DataSourceField, - multipleSelect: DataSourceField, - radio: DataSourceField, - checkboxes: DataSourceField, - number: NumberField, - percent: PercentField, - datetime: DateTimeField, - createdAt: DateTimeField, - updatedAt: DateTimeField, - icon: IconField, - createdBy: RealtionField, - updatedBy: RealtionField, - subTable: SubTableField, - linkTo: LinkToField, - attachment: AttachmentField, - 'logs.field': LogField, - 'logs.fieldValue': LogFieldValue, - chinaRegion: ChinaRegion, - json: JsonField, -}); - -export default function Field(props: any) { - const { schema = {} } = props; - const Component = getFieldComponent( - schema.interface || get(schema, 'component.type'), - ); - return ; -} diff --git a/packages/app/src/components/views/Field/style.less b/packages/app/src/components/views/Field/style.less deleted file mode 100644 index fae97d0f9f427dbe378d3d63fb7fc4872afcee12..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Field/style.less +++ /dev/null @@ -1,58 +0,0 @@ -.link-to-field-tag { - &::after { - content: ','; - } - &:last-child::after { - content: ''; - } -} - -.ant-table-cell { - > .percent-field, - > .number-field { - text-align: right; - } -} - -.sub-table-field { - overflow: auto; - > .ant-table-wrapper { - width: 1px; - overflow: visible; - } -} - -.attachment-modal { - .ant-modal-close { - background: rgba(255, 255, 255, 0.4); - } -} - -.textarea-field-content { - > *:last-child { - margin-bottom: 0; - } -} - -.ant-table-cell.noco-field-percent, -.ant-table-cell.noco-field-number { - text-align: right; -} - -.ant-upload.ant-upload-select-picture-card > .ant-upload { - flex-direction: column; -} - -.attachment-field-item { - display: inline-block; - line-height: 0; - margin-right: 3px; - padding: 1px; - border: 1px solid #d9d9d9; - border-radius: 2px; - background: #fafafa; - img { - height: 18px; - border-radius: 2px; - } -} diff --git a/packages/app/src/components/views/FilterForm.tsx b/packages/app/src/components/views/FilterForm.tsx deleted file mode 100644 index 0ac8605957333f69b1a27b7319eed8cb8cece822..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/FilterForm.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useState } from 'react'; -import { Tooltip, Button } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormValidator, - setValidationLanguage, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import scopes from '@/components/views/scopes'; -import { fields2properties } from './Form'; - -export function FilterForm(props: any) { - const { data, onFinish } = props; - const { fields = [] } = props.schema || {}; - return ( - { - // setData({filter: {}}); - onFinish && (await onFinish(null)); - }} - onSubmit={async values => { - if (onFinish) { - await onFinish(values); - } - }} - schema={{ - type: 'object', - properties: fields2properties(fields), - }} - expressionScope={scopes} - > - - - 取消 - 确定 - - - ); -} diff --git a/packages/app/src/components/views/Form.tsx b/packages/app/src/components/views/Form.tsx deleted file mode 100644 index 32888a2522443ebbb59ed1d6afef86d5080137fb..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Form.tsx +++ /dev/null @@ -1,287 +0,0 @@ -import React, { useState } from 'react'; -import { Tooltip, Card, Button, message } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormValidator, - setValidationLanguage, - FormSpy, - LifeCycleTypes, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import api from '@/api-client'; -import { useRequest, useLocation } from 'umi'; -import Drawer from '@/components/drawer'; -import set from 'lodash/set'; -import cloneDeep from 'lodash/cloneDeep'; -import { Spin } from '@/components/spin'; -import { markdown } from '@/components/views/Field'; -import scopes from '@/components/views/scopes'; - -export function fields2properties(fields = [], options: any = {}) { - const { mode } = options; - const properties = {}; - fields.forEach(field => { - const data = { - ...field.component, - title: field.title, - required: field.required, - }; - if (field.multiple) { - set(data, 'x-component-props.mode', 'multiple'); - } - if (field.dateFormat) { - set(data, 'x-component-props.format', field.dateFormat); - } - if (field.showTime) { - set(data, 'x-component-props.showTime', true); - field.timeFormat && - set( - data, - 'x-component-props.format', - `${field.dateFormat} ${field.timeFormat}`, - ); - } - if (field.createOnly && mode !== 'create') { - set(data, 'x-component-props.disabled', true); - } - const linkages = field.linkages; - delete field.linkages; - set(data, 'x-component-props.schema', cloneDeep(field)); - if (field.dataSource) { - data.enum = field.dataSource; - } - if (field.interface === 'boolean') { - set(data, 'x-component-props.children', data.title); - delete data.title; - } - properties[field.name] = data; - if (field.interface === 'linkTo') { - set(data, 'x-component-props.target', field.target); - set(data, 'x-component-props.multiple', field.multiple); - } - if (field.name === 'dataSource') { - set(data, 'x-component-props.operationsWidth', 'auto'); - set(data, 'x-component-props.bordered', true); - set(data, 'x-component-props.className', 'data-source-table'); - const property = {}; - Object.assign(property, { - label: { - type: 'string', - title: '选项', - required: true, - 'x-component-props': { - bordered: false, - }, - }, - color: { - type: 'colorSelect', - title: '颜色', - 'x-component-props': { - bordered: false, - }, - }, - }); - set(data, 'items.properties', property); - } - if (linkages) { - data['x-linkages'] = linkages; - } - if (field.defaultValue !== null) { - data.default = field.defaultValue; - } - if (field.tooltip) { - data.description = ( -
- ); - } - }); - console.log({ properties, options }); - return properties; -} -const actions = createFormActions(); - -export function Form(props: any) { - const { - initialValues = {}, - onValueChange, - onReset, - __parent, - noRequest = false, - onFinish, - onDraft, - resolve, - data: record = {}, - associatedKey, - schema = {}, - } = props; - console.log({ noRequest, record, associatedKey, __parent }); - const { - statusable, - resourceName, - rowKey = 'id', - fields = [], - appends = [], - associationField = {}, - } = schema; - - const resourceKey = - props.resourceKey || record[associationField.targetKey || rowKey]; - - const { data = {}, loading, refresh } = useRequest(() => { - return !noRequest && resourceKey - ? api.resource(resourceName).get({ - associatedKey, - resourceKey, - 'fields[appends]': appends, - }) - : Promise.resolve({ data: record }); - }); - - const [status, setStatus] = useState('publish'); - - if (loading) { - return ; - } - - return ( - { - $(LifeCycleTypes.ON_FORM_INIT).subscribe(() => { - setFieldState('*', state => { - set(state.props, 'x-component-props.__index', resourceKey); - }); - }); - }} - // actions={actions} - schema={{ - type: 'object', - properties: fields2properties(fields, { - mode: !!Object.keys(data).length ? null : 'create', - }), - }} - onReset={async () => { - onReset && (await onReset()); - }} - onChange={values => { - console.log('onValueChange'); - onValueChange && onValueChange(values); - }} - onSubmit={async values => { - console.log({ status }); - if (!noRequest) { - resourceKey - ? await api.resource(resourceName).update({ - associatedKey, - resourceKey, - values: { - ...values, - status, - }, - }) - : await api.resource(resourceName).create({ - associatedKey, - values: { - ...values, - status, - }, - }); - } - onFinish && (await onFinish(values)); - }} - expressionScope={scopes} - > - - 取消 - {statusable && ( - { - switch (action.type) { - case LifeCycleTypes.ON_FORM_SUBMIT_START: - return { - ...state, - submitting: true, - }; - case LifeCycleTypes.ON_FORM_SUBMIT_END: - return { - ...state, - submitting: false, - }; - default: - return state; - } - }} - > - {({ state, form }) => { - const [submitting, setSubmitting] = useState(false); - return ( - - ); - }} - - )} - 确定 - - - ); -} diff --git a/packages/app/src/components/views/Kanban/index.tsx b/packages/app/src/components/views/Kanban/index.tsx deleted file mode 100644 index ea53395e6019e6d8aae794c24c0a643fc1bfa14d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Kanban/index.tsx +++ /dev/null @@ -1,327 +0,0 @@ -import React, { useState } from 'react'; -import { useRequest, useHistory } from 'umi'; -import api from '@/api-client'; -import { Descriptions, Popconfirm, Card, Button } from 'antd'; -import Board, { moveCard } from '@lourenci/react-kanban'; -import '@lourenci/react-kanban/dist/styles.css'; -import Drawer from '@/components/drawer'; -import { Actions, Create, Destroy } from '@/components/actions'; -import get from 'lodash/get'; -import filter from 'lodash/filter'; -import Field from '@/components/views/Field'; -import { Details, DetailsPage } from '@/components/views/Table'; -import merge from 'lodash/merge'; -import { Spin } from '@/components/spin'; -import './style.less'; - -export function Kanban(props: any) { - const { defaultFilter, associatedKey, schema = {} } = props; - const { - filter: schemaFilter, - sort, - appends, - groupField = {}, - resourceName, - createViewName = 'form', - disableCardDrag = false, - // allowAddCard = false, - // allowRemoveCard = false, - labelField, - actions = [], - fields = [], - detailsOpenMode, - details = [], - rowKey = 'id', - } = schema; - const { dataSource = [] } = groupField; - console.log({ groupField, dataSource }); - - const paginated = false; - - const history = useHistory(); - - const { data, loading, mutate, refresh, run, params } = useRequest( - (params = {}, ...args) => { - const { current, pageSize, sorter, filter, ...restParams } = params; - console.log('paramsparamsparamsparamsparams', params, args); - return api - .resource(resourceName) - .list({ - associatedKey, - page: paginated ? current : 1, - perPage: paginated ? pageSize : -1, - sorter, - sort: [`${groupField.name}_sort`], - 'fields[appends]': appends, - // filter, - // ...actionDefaultParams, - filter: { - and: [ - defaultFilter, - schemaFilter, - filter, - // __parent ? { - // collection_name: __parent, - // } : null, - ].filter(obj => obj && Object.keys(obj).length), - }, - // ...args2, - }) - .then(({ data = [], meta = {} }) => { - return { - data: { - list: data, - total: meta.count || data.length, - }, - }; - }); - }, - { - paginated, - }, - ); - - if (loading) { - return ; - } - - const columns = dataSource.map(group => { - return { - id: group.value, - title: group.label, - cards: filter(data?.list, item => { - return get(item, groupField.name) === group.value; - }), - }; - }); - console.log({ columns }); - - const bodyStyle: any = {}; - - if (fields.length === 0) { - bodyStyle.padding = 0; - } - - const createAction = actions.find(action => { - return action.type === 'create'; - }); - - let allowAddCard = !!props.allowAddCard; - - if (createAction) { - allowAddCard = true; - } - - let allowRemoveCard = !!props.allowRemoveCard; - const destroyAction = actions.find(action => { - return action.type === 'destroy'; - }); - if (destroyAction) { - allowRemoveCard = true; - } - - return ( -
- !['create', 'destroy'].includes(action.type), - )} - onTrigger={{ - async filter(values) { - const items = values.filter.and || values.filter.or; - // @ts-ignore - run({ ...params[0], filter: values.filter }); - // refresh(); - }, - }} - /> - { - const openDetails = e => { - if (!detailsOpenMode || !details.length) { - return; - } - if (detailsOpenMode === 'window') { - const paths = history.location.pathname.split('/'); - history.push(`/admin/${paths[2]}/${data[rowKey]}/0`); - } else { - Drawer.open({ - headerStyle: - details.length > 1 - ? { - paddingBottom: 0, - borderBottom: 0, - // paddingTop: 16, - // marginBottom: -4, - } - : {}, - title: data[labelField], - content: ({ resolve, closeWithConfirm }) => ( -
-
{ - await refresh(); - resolve(); - }} - onValueChange={() => { - closeWithConfirm && closeWithConfirm(true); - }} - onDraft={async () => { - await refresh(); - resolve(); - }} - onReset={resolve} - onDataChange={async () => { - await refresh(); - }} - data={data} - resolve={resolve} - items={details} - /> -
- ), - }); - } - }; - return ( - {data[labelField]}
} - bodyStyle={bodyStyle} - extra={ - allowRemoveCard && ( - { - await api.resource(resourceName).destroy({ - associatedKey, - filter: { - [`${rowKey}.in`]: [data[rowKey]], - }, - }); - await refresh(); - }} - /> - ) - } - > -
- {fields.length > 0 && ( - - {fields.map((field: any) => { - return ( - - - - ); - })} - - )} -
- - ); - }} - onCardDragEnd={async ({ columns }, card, source, destination) => { - await api.resource(resourceName).update({ - associatedKey, - resourceKey: card[rowKey], - values: { - [groupField.name]: destination.toColumnId, - }, - }); - const destColumn = columns.find( - column => column.id === destination.toColumnId, - ); - const targetIndex = get(destColumn, [ - 'cards', - destination.toPosition + 1, - rowKey, - ]); - console.log({ targetIndex, card, destination }); - await api.resource(resourceName).sort({ - associatedKey, - resourceKey: card[rowKey], - values: { - field: `${groupField.name}_sort`, - sticky: destination.toPosition === 0, - target: { - [rowKey]: targetIndex, - }, - }, - }); - }} - initialBoard={{ columns }} - // allowAddCard={{ on: "bottom" }} - allowAddCard={false} - // onNewCardConfirm={draftCard => ({ - // id: new Date().getTime(), - // ...draftCard - // })} - renderColumnHeader={({ title, id }, { addCard }) => { - return ( - <> -
- {title} -
- {allowAddCard && ( - { - refresh(); - }} - initialValues={{ - [groupField.name]: id, - }} - schema={merge(createAction, { - title: null, - pageTitle: '新增', - componentProps: { - type: 'text', - block: true, - className: 'noco-card-adder-button', - style: { - marginBottom: 10, - border: 0, - background: '#fff', - }, - }, - })} - /> - )} - - ); - }} - onCardNew={console.log} - /> -
- ); -} diff --git a/packages/app/src/components/views/Kanban/style.less b/packages/app/src/components/views/Kanban/style.less deleted file mode 100644 index e4128225c464e080b5f9bbd70a33b39a19a1b873..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Kanban/style.less +++ /dev/null @@ -1,60 +0,0 @@ -.react-kanban-board { - padding: 0; - // margin: -24px -36px; - background-color: #eff2f5; - .react-kanban-column { - background-color: #eff2f5; - margin: 0; - padding: 12px; - } -} - -.react-kanban-column-header { - font-weight: 500; -} - -.noco-card-adder-button:hover { - background: rgba(255, 255, 255, 0.4) !important; -} - -.noco-kanban-view { - .action-buttons { - // margin: -24px -24px 0 !important - margin: 0 !important; - background-color: #eff2f5; - padding-bottom: 40px; - .ant-btn { - border: 0; - } - .filter-action-button { - margin-left: 0; - left: 12px; - } - } - .action-buttons + .react-kanban-board { - margin-top: 0; - } - .ant-descriptions-item-label { - width: auto; - } - .ant-descriptions-item { - // padding-bottom: 4px; - } -} - - -.ant-card.view-type-kanban { - margin: 0 -12px; - background: none; - > .ant-card-body { - padding: 0; - } -} -@media only screen and (max-width: 800px) { - .ant-card.view-type-kanban { - margin: 0; - .action-buttons { - margin-top: 12px !important; - } - } -} \ No newline at end of file diff --git a/packages/app/src/components/views/Login.tsx b/packages/app/src/components/views/Login.tsx deleted file mode 100644 index ea50d5178aef3ed37a686386e0631249958361b3..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Login.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React from 'react'; -import { Tooltip, Card, Button, message } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormValidator, - setValidationLanguage, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Link, history, request, useModel, useLocation } from 'umi'; - -export function Login(props: any) { - const actions = createFormActions(); - const { - initialState = {}, - loading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - const { redirect } = props.location.query; - - if (loading) { - return null; - } - - const { systemSettings = {} } = initialState as any; - - console.log({ systemSettings }); - - const { title } = systemSettings || {}; - - return ( -
-

{title}

-

登录

- - { - try { - const { data = {}, error } = await request('/users:login', { - method: 'post', - data: values, - }); - if (data.data && data.data.token) { - localStorage.setItem('NOCOBASE_TOKEN', data.data.token); - // @ts-ignore - setInitialState({ - ...initialState, - currentUser: data.data, - }); - await (window as any).routesReload(); - history.push(redirect || '/'); - } - } catch (error) { - if (typeof error.data === 'string') { - message.error(error.data); - } - } - }} - actions={actions} - schema={{ - type: 'object', - properties: { - email: { - type: 'string', - title: '', - required: true, - 'x-component-props': { - size: 'large', - placeholder: '邮箱', - }, - }, - password: { - type: 'password', - title: '', - required: true, - 'x-component-props': { - size: 'large', - style: { - width: '100%', - }, - placeholder: '密码', - }, - 'x-props': { - help: 忘记密码?, - }, - }, - ...(props.fields || {}), - }, - }} - > - - 登录 -
- 注册账户 -
-
-
-
- ); -} diff --git a/packages/app/src/components/views/LostPassword.tsx b/packages/app/src/components/views/LostPassword.tsx deleted file mode 100644 index eeb9f799cf15e87238bd17eae1cb4f4929394cc2..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/LostPassword.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import { Tooltip, Card, Button, message } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormValidator, - setValidationLanguage, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Link, history, request, useModel, useLocation } from 'umi'; - -export function LostPassword(props: any) { - const actions = createFormActions(); - const { - initialState = {}, - loading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - const { redirect } = props.location.query; - - if (loading) { - return null; - } - - const { systemSettings = {} } = initialState as any; - - console.log({ systemSettings }); - - const { title } = systemSettings || {}; - - return ( -
-

{title}

-

忘记密码

- { - console.log(values); - const { data = {} } = await request('/users:lostpassword', { - method: 'post', - data: values, - }); - message.success(`重置链接已发送至邮箱 ${values.email},请注意查收!`); - }} - actions={actions} - schema={{ - type: 'object', - properties: { - email: { - type: 'string', - title: '', - required: true, - 'x-component-props': { - size: 'large', - placeholder: '邮箱', - }, - }, - }, - }} - > - - 获取新密码 -
- 使用已有账号登录 -
-
-
-
- ); -} diff --git a/packages/app/src/components/views/Register.tsx b/packages/app/src/components/views/Register.tsx deleted file mode 100644 index 3b79d9c99a2ecf51c6c1518c232e4fcd2483f40c..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Register.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import React from 'react'; -import { Tooltip, Card, Button, message } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormEffectHooks, - FormValidator, - setValidationLanguage, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Link, history, request, useModel } from 'umi'; - -const { onFieldValueChange$ } = FormEffectHooks; - -const useLinkageValidateEffects = () => { - const { setFieldState, getFieldState } = createFormActions(); - onFieldValueChange$('*(password,confirm)').subscribe(fieldState => { - const selfName = fieldState.name; - const selfValue = fieldState.value; - const otherName = selfName == 'password' ? 'confirm' : 'password'; - const otherValue = getFieldState(otherName, state => state.value); - setFieldState(otherName, state => { - if (selfValue && otherValue && selfValue !== otherValue) { - state.errors = ['两次密码输入不一致']; - } else { - state.errors = []; - } - }); - setFieldState(selfName, state => { - if (selfValue && otherValue && selfValue !== otherValue) { - state.errors = ['两次密码输入不一致']; - } else { - state.errors = []; - } - }); - }); -}; - -export function Register(props: any) { - const actions = createFormActions(); - const { - initialState = {}, - loading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - - if (loading) { - return null; - } - - const { systemSettings = {} } = initialState as any; - - console.log({ systemSettings }); - - const { title } = systemSettings || {}; - - return ( -
-

{title}

-

注册

- { - useLinkageValidateEffects(); - }} - onSubmit={async values => { - console.log(values); - try { - const { data = {} } = await request('/users:register', { - method: 'post', - data: values, - }); - await actions.reset({ - validate: false, - forceClear: true, - }); - message.success('注册成功,将跳转登录页'); - setTimeout(() => { - history.push('/login'); - }, 1000); - } catch (error) { - if (typeof error.data === 'string') { - message.error(error.data); - } - } - }} - actions={actions} - schema={{ - type: 'object', - properties: { - email: { - type: 'string', - title: '', - required: true, - 'x-component-props': { - size: 'large', - placeholder: '邮箱', - }, - }, - // nickname: { - // type: 'string', - // title: '', - // 'x-component-props': { - // size: 'large', - // placeholder: '昵称', - // }, - // }, - password: { - type: 'password', - title: '', - required: true, - 'x-component-props': { - size: 'large', - style: { - width: '100%', - }, - placeholder: '密码', - }, - }, - confirm: { - type: 'password', - title: '', - required: true, - 'x-component-props': { - size: 'large', - style: { - width: '100%', - }, - placeholder: '确认密码', - }, - }, - ...(props.fields || {}), - }, - }} - > - - 注册 -
- 使用已有账号登录 -
-
-
-
- ); -} diff --git a/packages/app/src/components/views/ResetPassword.tsx b/packages/app/src/components/views/ResetPassword.tsx deleted file mode 100644 index 12247071f960410973cf263226c36a7e4d2a78a3..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/ResetPassword.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import React from 'react'; -import { Tooltip, Card, Button, message } from 'antd'; -import { - SchemaForm, - SchemaMarkupField as Field, - createFormActions, - createAsyncFormActions, - Submit, - Reset, - FormButtonGroup, - registerFormFields, - FormEffectHooks, - FormValidator, - setValidationLanguage, -} from '@formily/antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Redirect, history, request, useModel, useHistory } from 'umi'; -import api from '@/api-client'; -import { useRequest, Link } from 'umi'; - -const { onFieldValueChange$ } = FormEffectHooks; - -const useLinkageValidateEffects = () => { - const { setFieldState, getFieldState } = createFormActions(); - onFieldValueChange$('*(password,confirm)').subscribe(fieldState => { - const selfName = fieldState.name; - const selfValue = fieldState.value; - const otherName = selfName == 'password' ? 'confirm' : 'password'; - const otherValue = getFieldState(otherName, state => state.value); - setFieldState(otherName, state => { - if (selfValue && otherValue && selfValue !== otherValue) { - state.errors = ['两次密码输入不一致']; - } else { - state.errors = []; - } - }); - setFieldState(selfName, state => { - if (selfValue && otherValue && selfValue !== otherValue) { - state.errors = ['两次密码输入不一致']; - } else { - state.errors = []; - } - }); - }); -}; - -export function ResetPassword(props: any) { - const actions = createFormActions(); - const { - initialState = {}, - loading: stateLoading, - error, - refresh, - setInitialState, - } = useModel('@@initialState'); - - const history = useHistory(); - // @ts-ignore - const { token } = history.location.query; - console.log({ token }); - const { data = {}, loading } = useRequest(() => { - return api.resource('users').getUserByResetToken({ - token, - }); - }); - - if (stateLoading || loading) { - return null; - } - - if (!data.id) { - return ; - } - - const { systemSettings = {} } = initialState as any; - - console.log({ systemSettings }); - - const { title } = systemSettings || {}; - - return ( -
-

{title}

-

重置密码

- { - useLinkageValidateEffects(); - }} - initialValues={{ - email: data.email, - }} - onSubmit={async values => { - console.log(values); - const { data = {} } = await request('/users:resetpassword', { - method: 'post', - data: { - ...values, - reset_token: token, - }, - }); - await actions.reset({ - validate: false, - forceClear: true, - }); - message.success('密码重置成功,将跳转至登录页'); - setTimeout(() => { - history.push('/login'); - }, 1000); - }} - actions={actions} - schema={{ - type: 'object', - properties: { - email: { - type: 'string', - title: '', - required: true, - 'x-component-props': { - size: 'large', - placeholder: '邮箱', - disabled: true, - }, - }, - password: { - type: 'password', - title: '', - required: true, - 'x-component-props': { - size: 'large', - style: { - width: '100%', - }, - placeholder: '密码', - }, - }, - confirm: { - type: 'password', - title: '', - required: true, - 'x-component-props': { - size: 'large', - style: { - width: '100%', - }, - placeholder: '确认密码', - }, - }, - }, - }} - > - - 重置密码 -
- 使用已有账号登录 -
-
-
-
- ); -} diff --git a/packages/app/src/components/views/SubTable.tsx b/packages/app/src/components/views/SubTable.tsx deleted file mode 100644 index 70d08fe18bcde019f857b37d238819ef57ee7cc8..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/SubTable.tsx +++ /dev/null @@ -1,380 +0,0 @@ -import React, { useState, useEffect, useRef, createRef } from 'react'; -import './style.less'; -import { Helmet } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useLocation } from 'umi'; -import api from '@/api-client'; -import { Actions } from '@/components/actions'; -import { - Modal, - Table as AntdTable, - Card, - Pagination, - Button, - Tabs, - Descriptions, - Tooltip, -} from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; -import { fields2columns } from '@/components/views/fields2columns'; -import ReactDragListView from 'react-drag-listview'; -import arrayMove from 'array-move'; -import get from 'lodash/get'; -import cloneDeep from 'lodash/cloneDeep'; -import Drawer from '@/components/drawer'; -import { View } from '.'; - -export const icon = ; - -export function Details(props) { - const { - onValueChange, - onReset, - __parent, - noRequest, - associatedKey, - resourceName, - onFinish, - onDataChange, - data, - items = [], - resolve, - } = props; - if (!items || items.length === 0) { - return null; - } - const [currentTabIndex, setCurrentTabIndex] = useState('0'); - return ( -
- {items.length > 1 && ( -
- { - setCurrentTabIndex(activeKey); - }} - > - {items.map((page, index) => ( - - ))} - -
- )} - {(get(items, [currentTabIndex, 'views']) || []).map(view => { - let viewName: string; - if (typeof view === 'string') { - viewName = `${resourceName}.${view}`; - } - if (typeof view === 'object') { - viewName = `${resourceName}.${view.name}`; - } - return ( - - ); - })} -
- ); -} - -export function generateIndex(): string { - return `${Math.random() - .toString(36) - .replace('0.', '') - .slice(-4) - .padStart(4, '0')}`; -} - -export function SubTable(props: any) { - const { - __parent, - __index, - schema = {}, - associatedKey, - onChange, - size = 'middle', - } = props; - - console.log('subtable.associatedKey', associatedKey) - - const { - fields = [], - actions: defaultActions = [], - details: defaultDetails = [], - paginated = true, - defaultPerPage = 10, - // rowKey = 'id', - labelField = 'id', - sort, - resourceName, - associationField = {}, - appends = [], - expandable, - filter: schemaFilter = {}, - } = schema; - - let actions = defaultActions; - let details = defaultDetails; - - if (!onChange) { - actions = []; - details = []; - } - - const cloneFields = cloneDeep(fields) as any[]; - - let draggable = !!schema.draggable; - - let sortField: string; - - for (const field of cloneFields) { - if (field.type === 'sort') { - sortField = field.name; - } - } - - if (draggable && !sortField) { - (sortField = 'sort'), - cloneFields.unshift({ - dataIndex: ['sort'], - title: '排序', - name: 'sort', - interface: 'sort', - type: 'sort', - required: true, - developerMode: false, - component: { - type: 'sort', - showInTable: true, - width: 60, - className: 'drag-visible', - }, - }); - } - - if (!sortField) { - sortField = 'sort'; - } - - const { type } = associationField; - const { data = [], loading, mutate, refresh, run, params } = useRequest( - (params = {}, ...args) => { - return !(associatedKey||__index) || type === 'virtual' || type === 'json' - ? Promise.resolve({ - data: (props.data || []).map(item => { - if (!item[rowKey]) { - item[rowKey] = generateIndex(); - } - return item; - }), - }) - : api - .resource(resourceName) - .list({ - associatedKey: __index||associatedKey, - perPage: -1, - 'fields[appends]': appends, - }) - .then(({ data = [] }) => { - if (!Array.isArray(data)) { - return { - data: [], - }; - } - return { - data: data.map(item => { - if (!item[rowKey]) { - item[rowKey] = generateIndex(); - } - return item; - }), - }; - }); - }, - { - paginated: false, - }, - ); - - const dataSource = data as any; - - const rowKey = '__index'; - - const dragProps = { - async onDragEnd(fromIndex, toIndex) { - let data = arrayMove(dataSource, fromIndex, toIndex); - data = data.map((v: any, i) => { - return { ...v, [sortField]: i }; - }); - mutate(data); - onChange && (await onChange(data)); - }, - handleSelector: '.drag-handle', - ignoreSelector: 'tr.ant-table-expanded-row', - nodeSelector: 'tr.ant-table-row', - }; - - const tableProps: any = {}; - - const [selectedRowKeys, setSelectedRowKeys] = useState([]); - - if (actions.length) { - tableProps.rowSelection = { - type: 'checkbox', - selectedRowKeys, - onChange: ( - selectedRowKeys: React.ReactText[], - selectedRows: React.ReactText[], - ) => { - setSelectedRowKeys(selectedRowKeys); - }, - }; - } - - return ( -
- { - return { ...v, [sortField]: i }; - }); - mutate(data); - onChange && (await onChange(data)); - }, - async add(items = []) { - let data = [...dataSource]; - data.push(...items); - data = data.map((v: any, i) => { - if (!v[rowKey]) { - v[rowKey] = generateIndex(); - } - return { ...v, [sortField]: i }; - }); - mutate(data); - onChange && (await onChange(data)); - }, - async destroy() { - let data = dataSource.filter( - item => !selectedRowKeys.includes(item[rowKey]), - ); - data = data.map((v: any, i) => { - return { ...v, [sortField]: i }; - }); - mutate(data); - onChange && (await onChange(data)); - }, - }} - actions={actions} - style={{ marginBottom: 14, marginTop: -31 }} - /> - - {}} - components={{ - body: { - row: ({ className, ...others }) => { - if (!details.length) { - return
; - } - return ( - - ); - }, - }, - }} - expandable={expandable} - onRow={(data, index) => ({ - onClick: e => { - const className = (e.target as HTMLElement).className; - if ( - typeof className === 'string' && - (className.includes('ant-table-selection-column') || - className.includes('ant-checkbox') || - className.includes('ant-radio')) - ) { - return; - } - if (!details.length) { - return; - } - Drawer.open({ - title: details.length > 1 ? undefined : data[labelField], - bodyStyle: { - // padding: 0, - }, - content: ({ resolve, closeWithConfirm }) => ( -
-
{ - let data = [...dataSource]; - console.log({ values }); - data[index] = values; - data = data.map((v: any, i) => { - return { ...v, [sortField]: i }; - }); - mutate(data); - onChange && (await onChange(data)); - console.log({ values, data }); - resolve(); - }} - onReset={resolve} - onDataChange={() => {}} - onValueChange={() => { - closeWithConfirm && closeWithConfirm(true); - }} - noRequest={true} - data={data} - resolve={resolve} - items={details} - /> -
- ), - }); - }, - })} - {...tableProps} - /> - - - ); -} diff --git a/packages/app/src/components/views/Table.tsx b/packages/app/src/components/views/Table.tsx deleted file mode 100644 index b182233863beeb0630d03ff97e7de4822450825e..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Table.tsx +++ /dev/null @@ -1,637 +0,0 @@ -import React, { useState, useEffect, useRef, createRef } from 'react'; -import './style.less'; -import { Helmet } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useHistory } from 'umi'; -import api from '@/api-client'; -import { Actions } from '@/components/actions'; -import { - Modal, - PageHeader, - Table as AntdTable, - Card, - Pagination, - Button, - Tabs, - Descriptions, - Tooltip, -} from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; -import { fields2columns } from '@/components/views/fields2columns'; -import ReactDragListView from 'react-drag-listview'; -import get from 'lodash/get'; -import find from 'lodash/find'; -import Drawer from '@/components/drawer'; -import { Form } from './Form'; -import { View } from '.'; - -export const icon = ; - -export function Details(props) { - const { - __parent, - associatedKey, - resourceName, - onFinish, - onDraft, - onReset, - onDataChange, - data, - items = [], - resolve, - onValueChange, - } = props; - if (!items || items.length === 0) { - return null; - } - const [currentTabIndex, setCurrentTabIndex] = useState('0'); - return ( -
- {items.length > 1 && ( -
- { - setCurrentTabIndex(activeKey); - }} - > - {items.map((page, index) => ( - - ))} - -
- )} - {(get(items, [currentTabIndex, 'views']) || []).map(view => { - let viewName: string; - if (typeof view === 'string') { - viewName = `${resourceName}.${view}`; - } - if (typeof view === 'object') { - viewName = `${resourceName}.${view.name}`; - } - return ( - - ); - })} -
- ); -} - -export function DetailsPage(props) { - const { - currentRowId, - title, - __parent, - associatedKey, - resourceName, - onFinish, - onReset, - onDataChange, - data, - items = [], - resolve, - } = props; - if (!items || items.length === 0) { - return null; - } - const history = useHistory(); - const paths = history.location.pathname.split('/'); - const index = parseInt(paths[4]); - const [currentTabIndex, setCurrentTabIndex] = useState( - items.length > index ? paths[4] : '0', - ); - return ( -
- { - history.push(`/admin/${paths[2]}`); - }} - footer={ - { - setCurrentTabIndex(activeKey); - history.push(`/admin/${paths[2]}/${currentRowId}/${activeKey}`); - }} - > - {items.map((page, index) => ( - - ))} - - } - /> -
- - {(get(items, [currentTabIndex, 'views']) || []).map(view => { - let viewName: string; - if (typeof view === 'string') { - viewName = `${resourceName}.${view}`; - } - if (typeof view === 'object') { - viewName = `${resourceName}.${view.name}`; - } - return ( - - ); - })} - -
-
- ); -} - -export function Table(props: any) { - const { - onSelected, - multiple = true, - isFieldComponent, - schema = {}, - data: record = {}, - defaultFilter, - defaultSelectedRowKeys, - noRequest = false, - __parent, - currentRowId, - } = props; - - const content = document.getElementById('content'); - - const { - fields = [], - actions = [], - details = [], - paginated = true, - defaultPerPage = 10, - rowKey = 'id', - labelField = 'id', - sort, - resourceName, - associationField = {}, - appends = [], - expandable, - detailsOpenMode = 'drawer', - filter: schemaFilter = {}, - } = schema; - - const history = useHistory(); - - const associatedKey = - props.associatedKey || record[associationField.sourceKey || 'id']; - console.log({ associatedKey, record, associationField, __parent }); - - async function reloadMenu() { - if (resourceName !== 'menus') { - return; - } - (window as any).reloadMenu && (await (window as any).reloadMenu()); - } - - const { - data, - loading, - pagination, - mutate, - refresh, - run, - params, - } = useRequest( - (params = {}, ...args) => { - const { current, pageSize, sorter, filter, ...restParams } = params as any; - console.log('paramsparamsparamsparamsparams', params, args); - return api - .resource(resourceName) - .list({ - associatedKey, - page: paginated ? current : 1, - perPage: paginated ? pageSize : -1, - sorter, - sort, - 'fields[appends]': appends, - // filter, - // ...actionDefaultParams, - filter: { - and: [ - defaultFilter, - schemaFilter, - filter, - // __parent ? { - // collection_name: __parent, - // } : null, - ].filter(obj => obj && Object.keys(obj).length), - }, - // ...args2, - }) - .then(({ data = [], meta = {} }) => { - return { - data: { - list: data, - total: meta.count || data.length, - }, - }; - }); - }, - { - paginated, - defaultPageSize: defaultPerPage, - }, - ); - - const exportRequest = useRequest(({ sorter, filter } = {}) => { - return api - .resource(resourceName) - .export({ - associatedKey, - perPage: -1, - sorter, - sort, - 'fields[appends]': appends, - filter: { - and: [ - defaultFilter, - schemaFilter, - filter, - ].filter(obj => obj && Object.keys(obj).length), - }, - }, { - parseResponse: false, - responseType: 'blob' - }) - .then(async response => { - // decodeURI() for encoded filename in server side - const filename = decodeURI(response.headers.get('Content-Disposition').replace('attachment; filename=', '')); - // ReadableStream - let res = new Response(response.body); - let blob = await res.blob(); - let url = URL.createObjectURL(blob); - let a = document.createElement('a'); - a.style.display = 'none'; - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - // cleanup - URL.revokeObjectURL(url); - document.body.removeChild(a); - a = null; - blob = null; - url = null; - res = null; - }); - }, { - manual: true, - paginated: false - }); - - const currentRow = find( - data && data.list, - item => item[rowKey] == currentRowId, - ); - console.log({ currentRow }); - function getExpandedRowKeys(items: Array) { - if (!Array.isArray(items)) { - return []; - } - console.log({ items }); - let rowKeys = []; - items.forEach(item => { - if (item.children && item.children.length) { - rowKeys.push(item[rowKey]); - rowKeys = rowKeys.concat(getExpandedRowKeys(item.children)); - } - }); - return rowKeys; - } - - const [expandedRowKeys, setExpandedRowKeys] = useState(() => { - if (expandable) { - return getExpandedRowKeys(data?.list); - } - return []; - }); - - useEffect(() => { - setExpandedRowKeys(getExpandedRowKeys(data?.list)); - }, [data]); - - if (expandable) { - // expandable.expandIconColumnIndex = 4; - expandable.onExpand = (expanded, record) => { - if (!expanded) { - const index = expandedRowKeys.indexOf(record[rowKey]); - if (index >= 0) { - expandedRowKeys.splice(index, 1); - } - } else { - expandedRowKeys.push(record[rowKey]); - } - setExpandedRowKeys(expandedRowKeys); - }; - expandable.expandedRowKeys = expandedRowKeys; - console.log({ expandable, data }); - } - - // const { data, loading, pagination, mutate, refresh, run, params } = useRequest((params = {}, ...args) => { - // const { current, pageSize, sorter, filter, ...restParams } = params; - // return api.resource(resourceName).list({ - // associatedKey, - // sort, - // }).then(({data = [], meta = {}}) => { - // return { - // data: { - // list: data, - // total: meta.count||data.length, - // }, - // }; - // }); - // }, { - // paginated, - // defaultPageSize: defaultPerPage, - // }); - - const [selectedRowKeys, setSelectedRowKeys] = useState( - defaultSelectedRowKeys || [], - ); - const onChange = ( - selectedRowKeys: React.ReactText[], - selectedRows: React.ReactText[], - ) => { - setSelectedRowKeys(selectedRowKeys); - onSelected && onSelected(selectedRows); - }; - // useEffect(() => { - // setSelectedRowKeys(srk); - // }, [srk]); - // console.log(srk); - const tableProps: any = {}; - - if (actions.length || defaultSelectedRowKeys) { - tableProps.rowSelection = { - type: multiple ? 'checkbox' : 'radio', - selectedRowKeys, - onChange, - }; - } - - const ref = createRef(); - - const dragProps = { - async onDragEnd(fromIndex, toIndex) { - const list = data?.list || (data as any); - const nodes = ref.current.querySelectorAll('.ant-table-row'); - const resourceKey = nodes[fromIndex].getAttribute('data-row-key'); - const targetIndex = nodes[toIndex].getAttribute('data-row-key'); - - // const newList = arrayMove(list, fromIndex, toIndex); - // const item = list.splice(fromIndex, 1)[0]; - // list.splice(toIndex, 0, item); - // mutate({ - // ...data, - // list: newList, - // }); - await api.resource(resourceName).sort({ - associatedKey, - resourceKey, - values: { - field: 'sort', - target: { - [rowKey]: targetIndex, - }, - }, - }); - await refresh(); - await reloadMenu(); - - // console.log(nodes[fromIndex].getAttribute('data-row-key'), nodes[toIndex]) - console.log({ - // ref: ref.current.querySelectorAll('.ant-table-row'), - // fromIndex, toIndex, newList, - values: { - field: 'sort', - target: { - [rowKey]: targetIndex, - }, - }, - }); - }, - handleSelector: '.drag-handle', - ignoreSelector: 'tr.ant-table-expanded-row', - nodeSelector: 'tr.ant-table-row', - }; - - return ( -
-
- - - { - if (!detailsOpenMode || !details.length) { - return
; - } - return ( - - ); - }, - }, - }} - dataSource={data?.list || (data as any)} - size={'middle'} - columns={fields2columns(fields, { associatedKey, refresh })} - pagination={false} - onChange={(pagination, filters, sorter, extra) => { - console.log({sorter}); - run({ ...params[0], sorter }); - }} - expandable={expandable} - onRow={data => ({ - onClick: e => { - const className = (e.target as HTMLElement).className; - console.log({ className }); - if ( - typeof className === 'string' && - (className.includes('ant-table-selection-column') || - className.includes('ant-checkbox') || - className.includes('ant-radio')) - ) { - return; - } - if (!detailsOpenMode || !details.length) { - return; - } - if (!isFieldComponent && detailsOpenMode === 'window') { - const paths = history.location.pathname.split('/'); - history.push(`/admin/${paths[2]}/${data[rowKey]}/0`); - } else { - Drawer.open({ - headerStyle: - details.length > 1 - ? { - paddingBottom: 0, - borderBottom: 0, - // paddingTop: 16, - // marginBottom: -4, - } - : {}, - // title: details.length > 1 ? undefined : data[labelField], - title: data[labelField], - bodyStyle: { - // padding: 0, - }, - content: ({ resolve, closeWithConfirm }) => ( -
-
{ - await refresh(); - resolve(); - await reloadMenu(); - }} - onValueChange={() => { - closeWithConfirm && closeWithConfirm(true); - }} - onDraft={async () => { - await refresh(); - resolve(); - await reloadMenu(); - }} - onReset={resolve} - onDataChange={async () => { - await refresh(); - await reloadMenu(); - }} - data={data} - resolve={resolve} - items={details} - /> -
- ), - }); - } - }, - })} - {...tableProps} - /> - - {paginated && ( -
- `共 ${total} 条记录`} - showQuickJumper - showSizeChanger - size={'small'} - /> -
- )} - - {currentRow && ( -
- { - await refresh(); - await reloadMenu(); - }} - onReset={() => {}} - onDataChange={async () => { - await refresh(); - await reloadMenu(); - }} - currentRowId={currentRowId} - data={currentRow} - items={details} - /> -
- )} - - ); -} diff --git a/packages/app/src/components/views/Wysiwyg.tsx b/packages/app/src/components/views/Wysiwyg.tsx deleted file mode 100644 index 8c3e2c3870e509fbd8f54d8ba2c87433d7578393..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/Wysiwyg.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import './style.less'; -import { markdown } from '@/components/views/Field'; - -export function Wysiwyg(props) { - const { data: record = {}, schema = {}, onDataChange } = props; - - const { html = '' } = schema; - - return
; -} diff --git a/packages/app/src/components/views/fields2columns.tsx b/packages/app/src/components/views/fields2columns.tsx deleted file mode 100644 index 775943d07552a13d84aa661d86f847061d48efa1..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/fields2columns.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; - -import { MenuOutlined } from '@ant-design/icons'; -import Field from '@/components/views/Field'; -import cloneDeep from 'lodash/cloneDeep'; -import { Checkbox, message } from 'antd'; -import api from '@/api-client'; - -export const DragHandle = () => ( - -); - -export function fields2columns(fields = [], ctx: any = {}) { - const columns: any[] = fields.map(item => { - const field = cloneDeep(item); - if (!field.dataIndex) { - field.dataIndex = field.name.split('.'); - } - if (['datetime', 'number'].includes(field.interface)) { - field.sorter = true; - } - field.render = (value, record, index) => - field.interface === 'sort' ? ( - - ) : ( - - ); - field.className = `${field.className || ''} noco-field-${field.interface}`; - if (field.editable && field.interface === 'boolean') { - field.title = ( - - { - try { - await api.resource(field.resource).update({ - associatedKey: ctx.associatedKey, - // resourceKey: data.id, - // tableName: data.tableName||'pages', - values: { - accessible: e.target.checked, - }, - }); - message.success('保存成功'); - if (ctx.refresh) { - ctx.refresh(); - } - } catch (error) { - message.error('保存失败'); - } - }} - />{' '} - {field.title} - - ); - } - return { - ...field, - ...(field.component || {}), - }; - }); - return columns; -} diff --git a/packages/app/src/components/views/index.tsx b/packages/app/src/components/views/index.tsx deleted file mode 100644 index 56d7594b2acbde558d747c8cfe2730a8d01c5080..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/index.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import './style.less'; -import { Helmet } from 'umi'; -import { Spin } from '@/components/spin'; -import { useRequest, useLocation } from 'umi'; -import api from '@/api-client'; -import { Actions } from '@/components/actions'; -import { - Table as AntdTable, - Card, - Pagination, - Button, - Tabs, - Tooltip, -} from 'antd'; -import { LoadingOutlined } from '@ant-design/icons'; -import { Form } from './Form'; -import { Table } from './Table'; -import { Association } from './Association'; -import { Descriptions } from './Descriptions'; -import { FilterForm } from './FilterForm'; -import { SubTable } from './SubTable'; -import { Wysiwyg } from './Wysiwyg'; -import { Calendar } from './Calendar'; -import { Kanban } from './Kanban'; -import { setValidationLanguage } from '@formily/antd'; -import { setup } from '@/components/fields'; - -setup(); -setValidationLanguage('zh-CN'); - -const VIEWS = new Map(); - -export function registerView(type, view) { - VIEWS.set(type, view); -} - -export function getView(type) { - return VIEWS.get(type); -} - -export const icon = ; - -export function View(props: any) { - const { wrapper, schema, viewName, children, ...restProps } = props; - - const { data = {}, loading } = useRequest( - () => { - return schema - ? Promise.resolve({ data: schema }) - : api.resource('views_v2').getInfo({ - resourceKey: viewName, - }); - }, - { - refreshDeps: [viewName, schema], - }, - ); - - if (loading) { - return ; - } - - const type = props.type || data.type; - - const Component = getView(type); - - if (wrapper === 'card') { - return ( - - - - ) - } - - return ; -} - -registerView('table', Table); -registerView('subTable', SubTable); -registerView('form', Form); -registerView('filterForm', FilterForm); -registerView('descriptions', Descriptions); -registerView('association', Association); -registerView('wysiwyg', Wysiwyg); -registerView('markdown', Wysiwyg); -registerView('calendar', Calendar); -registerView('kanban', Kanban); - -export default View; diff --git a/packages/app/src/components/views/scopes.tsx b/packages/app/src/components/views/scopes.tsx deleted file mode 100644 index 1f8711b1d15f4e3b2a736bae92428aa4c09b4b1f..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/scopes.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import { Tooltip } from 'antd'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { markdown } from './Field'; - -export default { - text(...args: any[]) { - return React.createElement('span', {}, ...args); - }, - html(html: string) { - const text = decodeURIComponent(html); - return
; - }, - markdown(text: string) { - return ; - }, - tooltip(title: string, offset = 3) { - return ( - }> - - - ); - }, -}; diff --git a/packages/app/src/components/views/style.less b/packages/app/src/components/views/style.less deleted file mode 100644 index 6cb38b546e10e5fd37afc8fcbece0ee7c016cc0d..0000000000000000000000000000000000000000 --- a/packages/app/src/components/views/style.less +++ /dev/null @@ -1,162 +0,0 @@ -.ant-drawer-body { - padding-bottom: 50px; - .form-button-group { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - padding: 10px 16px; - border-top: 1px solid #f0f0f0; - background-color: #fff; - } -} -.ant-drawer-footer { - text-align: right; -} -.ant-descriptions-view - .ant-descriptions-item-container - .ant-descriptions-item-label { - align-items: center; -} -.page-tabs { - .ant-tabs { - margin: -24px -24px 8px; - position: relative; - // position: relative; - // // border-bottom: 1px solid #f0f0f0; - // padding: 0 24px; - // &::after { - // position: absolute; - // right: -24px; - // left: -24px; - // border-bottom: 1px solid #f0f0f0; - // content: ''; - // bottom: 16px; - // z-index: 11; - // } - .ant-tabs-nav { - &::before { - right: -24px; - left: -24px; - } - .ant-tabs-tab { - margin: 0 0 0 24px; - } - // margin-bottom: -1px; - } - } -} - -.markdown-content { - *:last-child { - margin-bottom: 0; - } -} - -.details-page { - background: #f0f2f5; - position: fixed; - top: 48px; - left: 200px; - width: calc(100% - 200px); - height: calc(100% - 48px); - overflow: auto; - transition: all 0.2s; -} - -body.collapsed { - .details-page { - left: 0; - width: 100%; - } -} - -@media only screen and (max-width: 800px) { - .details-page { - left: 0; - width: 100%; - } -} - -.users-form { - max-width: 368px; - margin: 0 auto; - padding-top: 100px; - padding: 100px 12px 12px; -} - -.ant-form-item-with-help { - margin-bottom: 24px; -} - -.users-form { - .button-group { - justify-content: flex-start; - .ant-row { - width: 100%; - } - .ant-col.inline { - width: 100%; - } - } -} - -.ant-radio-wrapper { - p { - display: inline; - } -} -.ant-table-cell:not(.ant-table-selection-column) { - min-width: 100px; - white-space: nowrap; -} -.ant-table-wrapper { - overflow: auto; -} -.table-pagination { - margin-top: 24px; - ul { - float: right; - } -} - -.ant-descriptions-item-label { - font-weight: 500; - text-align: right; - width: 200px; -} - -.ant-form-item-label { - font-weight: 500; -} - -.row-clickable { - cursor: pointer; -} - -.ant-table-tbody > tr.row-clickable:hover > td { - background: #e6f7ff; - border-color: rgba(0, 0, 0, 0.03); -} - -.ant-descriptions-header { - margin-top: 20px; - .ant-descriptions-title { - font-weight: 500; - } -} - -.row-dragging { - background: #fafafa; - border: 1px solid #ccc; - z-index: 99999; -} - -.row-dragging td { - padding: 16px; - visibility: hidden; -} - -.row-dragging .drag-visible { - visibility: visible; -} diff --git a/packages/app/src/global.less b/packages/app/src/global.less index 785f6217bbac44f5a6d91d8742c560095d23edcd..1412bdf030f66750c4f2e27d1a95b6bc150cdd88 100644 --- a/packages/app/src/global.less +++ b/packages/app/src/global.less @@ -25,75 +25,3 @@ background: #c0c0c0 !important; } } - -.ant-page-header-footer { - margin-top: 5px; -} - -.button-group { - display: flex; - justify-content: flex-end; - width: 100%; -} - -.spinning--absolute { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - max-height: inherit !important; -} - -.ant-drawer.nb-drawer { - .ant-drawer-content-wrapper { - width: 75%; - max-width: 1000px; - } -} - -@media only screen and (max-width: 800px) { - .ant-drawer.nb-drawer .ant-drawer-content-wrapper { - width: 100% !important; - } - .ant-drawer.noco-drawer { - .ant-drawer-content-wrapper { - width: 100% !important; - } - } -} - -.data-source-table { - .ant-table-thead .ant-table-cell { - padding: 11px; - } - .ant-table-tbody .ant-table-cell { - padding: 0; - } - .ant-form-item { - margin-bottom: 0; - .ant-btn { - border: 0; - box-shadow: none; - background: none; - margin-right: 0; - } - .ant-form-item-explain.ant-form-item-explain-error { - position: absolute; - pointer-events: none; - padding: 5px 11px; - } - } - + .array-table-addition { - border: 1px dashed #d9d9d9; - text-align: center; - border-radius: 2px !important; - .ant-btn { - display: block; - width: 100%; - } - } -} diff --git a/packages/app/src/pages/document.ejs b/packages/app/src/pages/document.ejs deleted file mode 100644 index f2ba26085a4bccbf567bd5a7101ced0832e60832..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/document.ejs +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - loading... - - - -
- - diff --git a/packages/app/src/pages/index.less b/packages/app/src/pages/index.less new file mode 100644 index 0000000000000000000000000000000000000000..586302bfc88f61d7d5e9d2362bf9c67a5a7ef4ce --- /dev/null +++ b/packages/app/src/pages/index.less @@ -0,0 +1,3 @@ +.title { + background: rgb(121, 242, 157); +} diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx index 2c812531aff82763f2ca0bc3ee85251fa4ddc072..0f4a453987d789266d15cfb5532763410c1895b3 100644 --- a/packages/app/src/pages/index.tsx +++ b/packages/app/src/pages/index.tsx @@ -1,12 +1,65 @@ -import PageLoader from '@/components/pages'; - -// TODO:这部分现在还是写在代码里的,待改进 -export const templates = { - AdminLoader: require('@/components/pages/AdminLoader').default, - login: require('@/pages/login').default, - register: require('@/pages/register').default, - lostpassword: require('@/pages/lostpassword').default, - resetpassword: require('@/pages/resetpassword').default, +import 'antd/dist/antd.css'; +import { useRequest } from 'ahooks'; +import { Spin } from 'antd'; +import React, { useMemo } from 'react'; +import { MemoryRouter as Router } from 'react-router-dom'; +import { + createRouteSwitch, + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + ConfigProvider, + ClientSDK, +} from '@nocobase/client'; +import { extend } from 'umi-request'; + +console.log(`${location.protocol}//${location.hostname}:${location.port}/api/`); + +const request = extend({ + prefix: `${location.protocol}//${location.hostname}:${location.port}/api/`, + timeout: 30000, +}); + +request.use(async (ctx, next) => { + const { headers } = ctx.req.options as any; + const token = localStorage.getItem('NOCOBASE_TOKEN'); + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + headers['X-Hostname'] = window.location.hostname; + await next(); +}); + +const client = new ClientSDK({ request }); + +const RouteSwitch = createRouteSwitch({ + components: { + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + }, +}); + +const App = () => { + const { data, loading } = useRequest('routes:getAccessible', { + formatResult: (result) => result?.data, + }); + + if (loading) { + return ; + } + + return ( +
+ +
+ ); }; -export default PageLoader; +export default function IndexPage() { + return ( + + + + ); +} diff --git a/packages/app/src/pages/login.tsx b/packages/app/src/pages/login.tsx deleted file mode 100644 index acf64f19b6d5e53db3c111f866851d806912e276..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/login.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { Helmet, useModel, Link } from 'umi'; -import get from 'lodash/get'; -import { Login } from '@/components/views/Login'; - -export default (props: any) => { - const { initialState = {}, refresh, setInitialState } = useModel( - '@@initialState', - ); - const siteTitle = get(initialState, 'systemSettings.title'); - return ( -
- - {siteTitle ? `登录 - ${siteTitle}` : '登录'} - - -
- ); -}; diff --git a/packages/app/src/pages/lostpassword.tsx b/packages/app/src/pages/lostpassword.tsx deleted file mode 100644 index 309b8e75206b5d78e1f757a3fe8ab5ea8f5c3037..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/lostpassword.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { Helmet, useModel } from 'umi'; -import get from 'lodash/get'; -import { LostPassword } from '@/components/views/LostPassword'; - -export default (props: any) => { - const { initialState = {}, refresh, setInitialState } = useModel( - '@@initialState', - ); - const siteTitle = get(initialState, 'systemSettings.title'); - return ( -
- - {siteTitle ? `忘记密码 - ${siteTitle}` : '忘记密码'} - - -
- ); -}; diff --git a/packages/app/src/pages/register.tsx b/packages/app/src/pages/register.tsx deleted file mode 100644 index 18e533bd41c813684091158728e9bafe5f871c5b..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/register.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { Helmet, useModel } from 'umi'; -import get from 'lodash/get'; -import { Register } from '@/components/views/Register'; - -export default (props: any) => { - const { initialState = {}, refresh, setInitialState } = useModel( - '@@initialState', - ); - const siteTitle = get(initialState, 'systemSettings.title'); - return ( -
- - {siteTitle ? `注册 - ${siteTitle}` : '注册'} - - -
- ); -}; diff --git a/packages/app/src/pages/resetpassword.tsx b/packages/app/src/pages/resetpassword.tsx deleted file mode 100644 index f386b068517ff21630d71d1faaf88336f3e3e639..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/resetpassword.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { Helmet, useModel } from 'umi'; -import get from 'lodash/get'; -import { ResetPassword } from '@/components/views/ResetPassword'; - -export default (props: any) => { - const { initialState = {}, refresh, setInitialState } = useModel( - '@@initialState', - ); - const siteTitle = get(initialState, 'systemSettings.title'); - return ( -
- - {siteTitle ? `重置密码 - ${siteTitle}` : '重置密码'} - - -
- ); -}; diff --git a/packages/app/src/pages/style.less b/packages/app/src/pages/style.less deleted file mode 100644 index 7892adf7f57875aad8ed9f7714c354add6bea809..0000000000000000000000000000000000000000 --- a/packages/app/src/pages/style.less +++ /dev/null @@ -1,9 +0,0 @@ -.nb-sider { - position: relative; - left: 0; - z-index: 100; - box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); - .ant-menu-light { - border-right-color: transparent !important; - } -} diff --git a/packages/app/tsconfig.apis.json b/packages/app/tsconfig.apis.json new file mode 100644 index 0000000000000000000000000000000000000000..a571c5824d04a28bad41a8745155ed6e96898d16 --- /dev/null +++ b/packages/app/tsconfig.apis.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", + "jsx": "react", + "module": "commonjs", + "target": "ES6", + "allowJs": false, + "noUnusedLocals": false, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "declaration": true, + "experimentalDecorators": true, + "downlevelIteration": true, + "baseUrl": ".", + "outDir": "./lib/apis", + "paths": { + } + }, + "include": [ + "src/apis", + ] +} diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json old mode 100755 new mode 100644 index 8c24faf7e820e1cfb566f9b9cee97e472610f68a..bc5250b036870fa314635bff63ce6126c2dc3e45 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -1,21 +1,18 @@ { "compilerOptions": { - "lib": [ "es5", "es6" ], - "module": "commonjs", - "target": "es6", + "target": "esnext", + "module": "esnext", "moduleResolution": "node", "importHelpers": true, - "jsx": "react", + "jsx": "react-jsx", "esModuleInterop": true, "sourceMap": true, "baseUrl": "./", - "allowJs": true, - "strict": false, + "strict": true, "paths": { "@/*": ["src/*"], "@@/*": ["src/.umi/*"] }, - "noImplicitAny": false, "allowSyntheticDefaultImports": true }, "include": [ @@ -24,5 +21,16 @@ "config/**/*", ".umirc.ts", "typings.d.ts" + ], + "exclude": [ + "node_modules", + "lib", + "es", + "dist", + "typings", + "**/__test__", + "test", + "docs", + "tests" ] } diff --git a/packages/app/typings.d.ts b/packages/app/typings.d.ts old mode 100755 new mode 100644 index 5df84ee02abf7079c2d9a2e6df692f8163009849..06c8a5b8ca65ba7fb618c40835e67afeba0bbe72 --- a/packages/app/typings.d.ts +++ b/packages/app/typings.d.ts @@ -1,8 +1,10 @@ declare module '*.css'; declare module '*.less'; -declare module "*.png"; +declare module '*.png'; declare module '*.svg' { - export function ReactComponent(props: React.SVGProps): React.ReactElement - const url: string - export default url + export function ReactComponent( + props: React.SVGProps, + ): React.ReactElement; + const url: string; + export default url; } diff --git a/packages/app/umi.js b/packages/app/umi.js index 8a37a191b875c1fa7332ef31b31edd06a40a0106..009946d595d51d79c4d0477279612fc0dace838f 100644 --- a/packages/app/umi.js +++ b/packages/app/umi.js @@ -6,7 +6,7 @@ try { require('v8-compile-cache'); const resolveCwd = require('@umijs/deps/compiled/resolve-cwd'); - + const { name, bin } = require('umi/package.json'); const localCLI = resolveCwd.silent(`${name}/${bin['umi']}`); if (!process.env.USE_GLOBAL_UMI && localCLI && localCLI !== __filename) { diff --git a/packages/client/package.json b/packages/client/package.json index 6e44652a29f20d642363ceaa6b49493440ca0db1..dcd192610a88505b361a1e663da533f79dfb0c47 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,7 +1,43 @@ { - "name": "@nocobase/client", - "version": "0.4.0-alpha.7", - "main": "lib/index.js", - "license": "MIT", - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "name": "@nocobase/client", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "typings": "lib/index.d.ts", + "license": "MIT", + "scripts": { + "build": "rimraf -rf lib esm dist && npm run build:cjs", + "build:cjs": "tsc --declaration" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 || >=17.0.0", + "@types/react-dom": ">=16.8.0 || >=17.0.0", + "antd": "^4.0.0", + "react": ">=16.8.0 || >=17.0.0", + "react-dom": ">=16.8.0 || >=17.0.0", + "react-router-dom": ">=5.2.0" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4", + "dependencies": { + "@antv/g2plot": "^2.3.27", + "@dnd-kit/core": "4.0.0-next-2021720152655", + "@dnd-kit/sortable": "5.0.0-next-2021720152655", + "@formily/antd": "2.0.0-rc.3", + "@formily/core": "2.0.0-rc.3", + "@formily/react": "2.0.0-rc.3", + "@monaco-editor/react": "^4.2.1", + "ahooks": "^2.10.2", + "axios": "^0.21.1", + "beautiful-react-hooks": "^0.35.0", + "constate": "^3.3.0", + "file-saver": "^2.0.5", + "flat": "^5.0.2", + "html-react-parser": "^1.2.7", + "lodash": "^4.17.21", + "micromark": "~2.11.0", + "monaco-editor": "^0.25.2", + "react-big-calendar": "^0.33.6", + "react-helmet": "^6.1.0", + "react-image-lightbox": "^5.1.4", + "umi-request": "^1.3.5" + } } diff --git a/packages/client/src/ClientSDK.ts b/packages/client/src/ClientSDK.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ed0ff14422858f86bb3da3c4f55e12a7c0883af --- /dev/null +++ b/packages/client/src/ClientSDK.ts @@ -0,0 +1,18 @@ +import { RequestMethod, RequestOptionsInit } from 'umi-request'; + +export class ClientSDK { + options: any; + + constructor(options) { + this.options = options; + } + + request(url: string, options?: RequestOptionsInit): RequestMethod { + console.log('this.options.request', this.options.request); + return this.options.request(url, options || {}); + } + + resource(name) {} +} + +export default ClientSDK; diff --git a/packages/client/src/ConfigProvider.tsx b/packages/client/src/ConfigProvider.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ce4fa1dd5526b3b155a35f3c006cc9195c9904c3 --- /dev/null +++ b/packages/client/src/ConfigProvider.tsx @@ -0,0 +1,15 @@ +import React, { createContext } from 'react'; +// import { ConfigProvider as AntdConfigProvider } from 'antd'; +// import enUS from 'antd/lib/locale/en_US'; +// import zhCN from 'antd/lib/locale/zh_CN'; +import { ClientProvider } from './constate'; +// import moment from 'moment'; +// import 'moment/locale/zh-cn'; +// moment.locale('zh-cn'); + +const ConfigContext = createContext(null); + +export function ConfigProvider(props: any) { + const { client } = props; + return {props.children}; +} diff --git a/packages/client/src/components/Sortable/index.tsx b/packages/client/src/components/Sortable/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..dba2bf48e77d7579ea3a7dd252c3151aba2c2139 --- /dev/null +++ b/packages/client/src/components/Sortable/index.tsx @@ -0,0 +1,160 @@ +import React, { useState } from 'react'; +import { + SortableContext, + useSortable, + horizontalListSortingStrategy, + verticalListSortingStrategy, + sortableKeyboardCoordinates, +} from '@dnd-kit/sortable'; +import { CSS } from '@dnd-kit/utilities'; +import { Menu, Table, Tabs } from 'antd'; +import { createContext } from 'react'; +import { useContext } from 'react'; +import { range } from 'lodash'; +const RowSyntheticListenerMapContext = createContext(null); +const CellContext = createContext(null); +import cls from 'classnames'; + +import { + DndContext, + DragOverlay, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, + useDraggable, + useDroppable, +} from '@dnd-kit/core'; +import { forwardRef } from 'react'; +import { DragOutlined } from '@ant-design/icons'; +import { useRef } from 'react'; + +const Div = forwardRef((props, ref) => { + return
; +}); + +export interface SortableItemProps {} + +export const SortableItemContext = createContext({}); + +export function DragHandle(props) { + const { component, ...others } = props; + const Icon = component || DragOutlined; + return ( + + {({ draggable, setDraggableNodeRef, attributes, listeners }) => + setDraggableNodeRef && ( + + ) + } + + ); +} + +export interface DroppableProps { + id: any; + data?: any; + component?: any; + [key: string]: any; +} + +export function Droppable(props: DroppableProps) { + const { id, data = {}, className, component, children, ...others } = props; + const { isOver, setNodeRef: setDroppableNodeRef } = useDroppable({ + id: `droppable-${id}`, + data: { + ...data, + }, + }); + const Component = component || Div; + return ( + { + setDroppableNodeRef(el); + }} + > + {children} + + ); +} + +export interface SortableItemProps { + id: any; + data?: any; + component?: any; + draggable?: boolean; + [key: string]: any; +} + +export function SortableItem(props: SortableItemProps) { + const { + id, + data = {}, + draggable, + className, + component, + children, + disabled, + ...others + } = props; + const previewRef = useRef(); + const { isOver, setNodeRef: setDroppableNodeRef } = useDroppable({ + id: `droppable-${id}`, + data: { + ...data, + previewRef, + }, + disabled, + }); + const { + isDragging, + attributes, + listeners, + setNodeRef: setDraggableNodeRef, + transform, + } = useDraggable({ + id: `draggable-${id}`, + disabled, + data: { + ...data, + previewRef, + }, + }); + if (draggable) { + Object.assign(others, listeners); + } + const Component = component || Div; + return ( + { + previewRef.current = el; + setDroppableNodeRef(el); + // if (draggable) { + // setDraggableNodeRef(el); + // } + }} + > + + {children} + + + ); +} diff --git a/packages/client/src/components/SwitchMenuItem.tsx b/packages/client/src/components/SwitchMenuItem.tsx new file mode 100644 index 0000000000000000000000000000000000000000..60707fcea837a9781deb67b9ab62d9ea607eb40b --- /dev/null +++ b/packages/client/src/components/SwitchMenuItem.tsx @@ -0,0 +1,40 @@ +import React, { useEffect, useState } from 'react'; +import { Menu, Switch } from 'antd'; + +export interface SwitchMenuItemProps { + onChange?: any; + title?: any; + checked?: boolean; +} + +export function SwitchMenuItem(props: SwitchMenuItemProps) { + const { onChange } = props; + const [checked, setChecked] = useState(props.checked); + useEffect(() => { + setChecked(props.checked); + }, [props.checked]); + return ( + { + setChecked((checked) => { + onChange(!checked); + return !checked; + }); + }} + > +
+ {props.title} + +
+
+ ); +} + +export default SwitchMenuItem; diff --git a/packages/client/src/components/admin-layout/Auth.tsx b/packages/client/src/components/admin-layout/Auth.tsx new file mode 100644 index 0000000000000000000000000000000000000000..202c6b451ce9672d205359878b5c5515b3a0cb07 --- /dev/null +++ b/packages/client/src/components/admin-layout/Auth.tsx @@ -0,0 +1,40 @@ +import { useRequest } from 'ahooks'; +import { Spin } from 'antd'; +import React, { createContext } from 'react'; +import { useContext } from 'react'; +import { Redirect } from 'react-router'; +import { useLocation } from 'react-router-dom'; +import { BaseResult } from '@ahooksjs/use-request/lib/types'; + +export interface AuthContextProps { + currentUser?: any; + service: BaseResult; +} + +export const AuthContext = createContext(null); + +export const useCurrentUser = () => { + const { currentUser } = useContext(AuthContext); + return currentUser; +}; + +export function AuthProvider(props) { + const service = useRequest('users:check', { + formatResult: (result) => result?.data, + }); + const location = useLocation(); + const { pathname, search } = location; + let redirect = `?redirect=${pathname}${search}`; + if (service.error) { + return ; + } + return ( + + {service.loading ? ( + + ) : ( + props.children + )} + + ); +} diff --git a/packages/client/src/components/admin-layout/Collections/index.tsx b/packages/client/src/components/admin-layout/Collections/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e161982ff402f4a8de7b5aa473bcdcc2cbf8e6a3 --- /dev/null +++ b/packages/client/src/components/admin-layout/Collections/index.tsx @@ -0,0 +1,794 @@ +import { SchemaRenderer } from '../../../'; +import React, { useContext, useEffect, useMemo, useState } from 'react'; +import { FormItem } from '@formily/antd'; +import { action } from '@formily/reactive'; +import { + useCollectionContext, + useCollectionsContext, +} from '../../../constate/Collections'; +import { Button, Drawer, Menu, Dropdown, Space } from 'antd'; +import { PlusOutlined, DownOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { uid, isValid, clone } from '@formily/shared'; +import { Resource } from '../../../resource'; +import { TableRowContext, useTable } from '../../../schemas/table'; +import { useRequest } from 'ahooks'; +import { VisibleContext } from '../../../context'; +import { connect, FormProvider, observer, useForm } from '@formily/react'; +import { DescriptionsContext } from '../../../schemas/form'; +import { createContext } from 'react'; +import { ISchema } from '../../../'; +import { createForm, Field } from '@formily/core'; +import { SchemaField } from '../../../schemas'; +import { + interfaces, + options, +} from '../../../schemas/database-field/interfaces'; +import { useResourceRequest } from '../../../constate'; + +export const RoleContext = createContext(null); + +function VisibleProvider(props) { + const ctx = useContext(TableRowContext); + const [visible, setVisible] = useState(false); + return ( + + {props.children} + + ); +} + +const useResource = () => { + const resource = useResourceRequest('collections'); + return { + resource, + }; +}; + +const useCollectionsResource = () => { + const resource = useResourceRequest('collections'); + return { + resource, + }; +}; + +class ActionPermissionResource extends Resource { + save(options?: any) { + console.log('ActionPermissionResource.save'); + return Promise.resolve({}); + } +} + +const useActionPermissionSubmit = () => { + const form = useForm(); + const role = useContext(RoleContext); + const resource = useResourceRequest({ + resourceName: 'roles', + resourceKey: role.name, + }); + return { + async run() { + await resource.save(form.values); + console.log('useActionPermissionSubmit', form.values?.actionPermissions); + }, + }; +}; + +const useActionPermissionResource = ({ onSuccess }) => { + const role = useContext(RoleContext); + console.log('RoleContext', role); + // const { props } = useTable(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest( + { + resourceName: 'action_permissions', + }, + ActionPermissionResource, + ); + const service = useRequest( + (params?: any) => { + return resource.list({ + ...params, + filter: { + role_name: role.name, + collection_name: ctx.record.name, + }, + appends: ['fields'], + }); + }, + { + formatResult: (result) => result?.data, + onSuccess(data) { + console.log('actionPermissions', data); + onSuccess({ + actionPermissions: data.map((permission) => { + const item: any = {}; + Object.keys(permission).forEach((key) => { + if (isValid(permission[key])) { + item[key] = permission[key]; + } + }); + item.fields = permission?.fields.map((field) => field.key) || []; + return item; + }), + }); + }, + manual: true, + }, + ); + const [visible] = useContext(VisibleContext); + + useEffect(() => { + if (visible) { + service.run({}); + } + }, [visible]); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const useDetailsResource = ({ onSuccess }) => { + const { props } = useTable(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest({ + resourceName: 'collections', + resourceKey: ctx.record[props.rowKey], + }); + const service = useRequest( + (params?: any) => { + return resource.get({ ...params }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + manual: true, + }, + ); + const [visible] = useContext(VisibleContext); + + useEffect(() => { + if (visible) { + service.run({}); + } + }, [visible]); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const useFieldsResource = () => { + const { props } = useTable(); + const ctx = useContext(TableRowContext); + class FieldResource extends Resource { + list(options) { + return super.list({ + ...options, + filter: { state: 1, collection_name: ctx.record[props.rowKey] }, + }); + } + } + const resource = useResourceRequest('fields', FieldResource); + return { + resource, + }; +}; + +const fieldInterfaces = []; +for (const [key, schema] of interfaces) { + fieldInterfaces.push({ + value: key, + label: schema.title, + disabled: schema.disabled, + }); +} + +const collectionSchema: ISchema = { + type: 'array', + 'x-decorator': 'VisibleProvider', + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'key', + dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 100, + }, + defaultAppends: ['uiSchema'], + useResource: useFieldsResource, + collectionName: 'fields', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-component': 'Action', + 'x-component-props': { + icon: 'DeleteOutlined', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + [uid()]: { + type: 'void', + title: '添加', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'CreateFieldButton', + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + }, + }, + }, + column1: { + type: 'void', + title: '字段名称', + 'x-component': 'Table.Column', + properties: { + 'uiSchema.title': { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column2: { + type: 'void', + title: '字段标识', + 'x-component': 'Table.Column', + properties: { + name: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column3: { + type: 'void', + title: '字段类型', + 'x-component': 'Table.Column', + properties: { + interface: { + type: 'string', + 'x-component': 'Select', + 'x-read-pretty': true, + // @ts-ignore + enum: fieldInterfaces, + }, + }, + }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': { + width: 160, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + title: '编辑', + 'x-component': 'EditFieldButton', + 'x-component-props': { + type: 'link', + useAction() { + return { + async run() { + alert('abc'); + }, + }; + }, + }, + 'x-action-type': 'update', + }, + [uid()]: { + type: 'void', + title: '删除', + 'x-component': 'Action', + 'x-action-type': 'destroy', + 'x-component-props': { + type: 'link', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + }, + }, + }, + }, + }, +}; + +function FieldConfigTitle() { + const ctx = useContext(TableRowContext); + return <>{`配置「${ctx.record.title}」表字段`}; +} + +function useCollectionResource({ onSuccess }) { + const visible = useContext(VisibleContext); + const resource = useResourceRequest('collections'); + useEffect(() => { + visible && onSuccess({ name: `t_${uid()}` }); + }, [visible]); + return { resource }; +} + +const schema: ISchema = { + type: 'void', + name: 'action', + 'x-component': 'Action', + 'x-component-props': { + tooltip: '数据表配置', + className: 'nb-database-config', + icon: 'DatabaseOutlined', + type: 'primary', + }, + properties: { + modal1: { + type: 'void', + title: '数据表配置', + 'x-component': 'Action.Drawer', + properties: { + table: { + type: 'array', + // 'x-decorator': 'CardItem', + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'name', + dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 100, + }, + useResource, + collectionName: 'collections', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-component': 'Action', + 'x-component-props': { + icon: 'DeleteOutlined', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + [uid()]: { + type: 'void', + title: '创建数据表', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '创建数据表', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: useCollectionResource, + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableCreateAction }}', + }, + properties: { + title: { + type: 'string', + title: '数据表名称', + 'x-component': 'Input', + 'x-decorator': 'FormilyFormItem', + }, + name: { + type: 'string', + title: '数据表标识', + 'x-component': 'Input', + 'x-decorator': 'FormilyFormItem', + description: + '随机生成,可修改。支持英文、数字和下划线,必须以英文字母开头', + }, + }, + }, + }, + }, + }, + }, + column1: { + type: 'void', + title: '数据表名称', + 'x-component': 'Table.Column', + properties: { + title: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column2: { + type: 'void', + title: '数据表标识', + 'x-component': 'Table.Column', + properties: { + name: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': { + width: 160, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + title: '配置字段', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: , + // 'x-decorator': 'RoleProvider', + 'x-component': 'Action.Drawer', + 'x-component-props': {}, + properties: { + [uid()]: collectionSchema, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '编辑', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-action-type': 'update', + properties: { + [uid()]: { + type: 'void', + title: '编辑数据表', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: useDetailsResource, + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + title: { + type: 'string', + title: '数据表名称', + 'x-component': 'Input', + 'x-decorator': 'FormilyFormItem', + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '删除', + 'x-component': 'Action', + 'x-action-type': 'destroy', + 'x-component-props': { + type: 'link', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +function CreateFieldButton() { + const { refresh } = useCollectionsContext(); + const ctx = useContext(TableRowContext); + const { service } = useTable(); + const [visible, setVisible] = useState(false); + const form = useMemo(() => createForm(), []); + const [properties, setProperties] = useState({}); + const { collections = [], loading } = useCollectionsContext(); + const resource = useResourceRequest('fields'); + + const loadCollections = async (field: any) => { + return collections.map((item: any) => ({ + label: item.title, + value: item.name, + })); + }; + + const loadCollectionFields = async (field: Field) => { + const target = field.query('....target').get('value'); + const f = field.query('....target').take(); + console.log('loadCollectionFields', f, field); + const collection = collections?.find((item) => item.name === target); + if (!collection) { + return []; + } + return collection?.generalFields + ?.filter((item) => item?.uiSchema?.title) + ?.map((item) => ({ + label: item?.uiSchema?.title || item.name, + value: item.name, + })); + }; + + const menu = ( + { + console.log('click', info.key); + const schema = interfaces.get(info.key); + form.setValues({ + ...clone(schema.default), + collection_name: ctx.record.name, + key: uid(), + name: `f_${uid()}`, + interface: info.key, + }); + setProperties(clone(schema.properties)); + setVisible(true); + }} + > + {options.map( + (option, groupIndex) => + option.children.length > 0 && ( + + {option.children.map((item) => ( + + {item.title} + + ))} + + ), + )} + + ); + return ( + <> + + + + { + setVisible(false); + form.reset(); + }} + footer={ + + + + + } + > + + + + + + ); +} + +function EditFieldButton() { + const { refresh, findCollection } = useCollectionsContext(); + const { service } = useTable(); + const ctx = useContext(TableRowContext); + const [visible, setVisible] = useState(false); + const form = useMemo(() => createForm(), []); + const schema = interfaces.get(ctx.record.interface); + const { collections = [], loading } = useCollectionsContext(); + const resource = useResourceRequest('fields'); + + const loadCollections = async (field: any) => { + return collections.map((item: any) => ({ + label: item.title, + value: item.name, + })); + }; + + const loadCollectionFields = async (field: Field) => { + const target = field.query('....target').get('value'); + const f = field.query('....target').take(); + console.log('loadCollectionFields', f, field); + const collection = collections?.find((item) => item.name === target); + if (!collection) { + return []; + } + return collection?.generalFields + ?.filter((item) => item?.uiSchema?.title) + ?.map((item) => ({ + label: item?.uiSchema?.title || item.name, + value: item.name, + })); + }; + return ( + <> + + setVisible(false)} + footer={ + + + + + } + > + + + + + + ); +} + +export const Collections = () => { + return ( + + ); +}; + +export default Collections; diff --git a/packages/client/src/components/admin-layout/More.tsx b/packages/client/src/components/admin-layout/More.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d22d174ee8a1915eb91bf550661702acf85f7e80 --- /dev/null +++ b/packages/client/src/components/admin-layout/More.tsx @@ -0,0 +1,96 @@ +import React, { useContext, useEffect } from 'react'; +import { Button } from 'antd'; +import { SchemaRenderer } from '../schema-renderer'; +import { useForm } from '@formily/react'; +import { useRequest } from 'ahooks'; +import { VisibleContext } from '../../context'; +import { ISchema } from '../../schemas'; +import { SystemSettingsContext } from './SiteTitle'; + +const useResource = ({ onSuccess }) => { + const { service, resource } = useContext(SystemSettingsContext); + + useEffect(() => { + onSuccess(service.data); + }, []); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const useOkAction = () => { + const form = useForm(); + const { service, resource } = useContext(SystemSettingsContext); + return { + async run() { + console.log('system_settings.values', form.values); + await resource.save(form.values); + await service.mutate(form.values); + }, + }; +}; + +const schema: ISchema = { + type: 'void', + name: 'action1', + // title: '下拉菜单', + 'x-component': 'Action', + 'x-component-props': { + className: 'nb-database-config', + icon: 'MoreOutlined', + type: 'primary', + }, + properties: { + dropdown1: { + type: 'void', + 'x-component': 'Action.Dropdown', + 'x-component-props': { + trigger: ['hover'], + }, + properties: { + item1: { + type: 'void', + title: `系统配置`, + 'x-component': 'Menu.Action', + 'x-component-props': { + icon: 'SettingOutlined', + }, + properties: { + drawer1: { + type: 'void', + title: '系统配置', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource, + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction, + }, + properties: { + title: { + type: 'string', + title: '系统名称', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + logo: { + type: 'string', + title: 'LOGO', + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + // accept: 'jpg,png' + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +export const More = () => { + return ; +}; diff --git a/packages/client/src/components/admin-layout/Permissions/ActionPermissionField.tsx b/packages/client/src/components/admin-layout/Permissions/ActionPermissionField.tsx new file mode 100644 index 0000000000000000000000000000000000000000..dab010d28d5512b7864032b25635226d7b0ef0f4 --- /dev/null +++ b/packages/client/src/components/admin-layout/Permissions/ActionPermissionField.tsx @@ -0,0 +1,266 @@ +import { SchemaRenderer, useResourceRequest } from '../../../'; +import React, { useContext, useEffect } from 'react'; +import { FormItem } from '@formily/antd'; +import { action } from '@formily/reactive'; +import { useCollectionsContext } from '../../../constate/Collections'; +import { Button, Select, Table, Tag } from 'antd'; +import { LockOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { uid } from '@formily/shared'; +import { Resource } from '../../../resource'; +import { TableRowContext, useTable } from '../../../schemas/table'; +import { useRequest } from 'ahooks'; +import { VisibleContext } from '../../../context'; +import { connect, ISchema, observer, useField } from '@formily/react'; +import { DescriptionsContext } from '../../../schemas/form'; +import { createContext } from 'react'; +import { RoleContext } from '.'; +import Checkbox from 'antd/lib/checkbox/Checkbox'; +import { useState } from 'react'; + +const actionTypeMap = new Map( + Object.entries({ + create: '添加', + get: '查看', + update: '编辑', + destroy: '删除', + }), +); + +const useActionDataSource = () => { + const field = useField(); + const dataSource = []; + for (const [actionName, value] of actionTypeMap) { + const item = field?.value?.find((item) => { + return item.actionName === actionName; + }); + dataSource.push({ + actionName, + ...item, + enable: !!item, + }); + } + return dataSource; +}; + +const useFieldPermissions = () => { + const role = useContext(RoleContext); + const ctx = useContext(TableRowContext); + const field = useField(); + const [dataSource, setDataSource] = useState([]); + const findFieldKeys = (actionName): any[] => { + const item = field?.value?.find((item) => { + return item.actionName === actionName; + }); + return ( + item?.fields?.map((field) => { + return typeof field === 'string' ? field : field.key; + }) || [] + ); + }; + const resource = useResourceRequest({ + associatedName: 'collections', + associatedKey: ctx.record.name, + resourceName: 'fields', + }); + const service = useRequest( + () => + resource.list({ + filter: { + state: 1, + }, + appends: ['uiSchema'], + }), + { + formatResult: (data) => data?.data, + onSuccess(data) { + setDataSource( + data.map((field) => { + return { + field, + }; + }), + ); + }, + // refreshDeps: [ctx.record.name], + }, + ); + const keys = { + get: findFieldKeys('get'), + update: findFieldKeys('update'), + destroy: findFieldKeys('destroy'), + create: findFieldKeys('create'), + }; + const renderCell = (actionName, value, record) => { + return ( + { + let fieldIndex = field?.value?.findIndex((item) => { + return item.actionName === actionName; + }); + if (e.target.checked) { + if (fieldIndex === -1) { + field.push({ + actionName, + collection_name: ctx.record.name, + role_name: role.name, + fields: [record.field.key], + }); + } else { + const fields = field.value[fieldIndex].fields || []; + fields.push(record.field.key); + field.value[fieldIndex].fields = fields; + } + } else if (fieldIndex > -1) { + const fields: any[] = field.value[fieldIndex].fields || []; + const index = fields?.findIndex((field) => { + let fieldKey = field; + if (typeof fieldKey === 'object') { + fieldKey = fieldKey.key; + } + return fieldKey === record?.field?.key; + }); + if (index > -1) { + fields.splice(index, 1); + field.value[fieldIndex].fields = [...fields]; + } + } + }} + /> + ); + }; + const ColumnTitle = ({ actionName }) => { + const checked = + dataSource?.length > 0 && keys[actionName]?.length === dataSource?.length; + return ( +
+ { + let fieldIndex = field?.value?.findIndex((item) => { + return item.actionName === actionName; + }); + if (e.target.checked) { + if (fieldIndex === -1) { + field.push({ + actionName, + collection_name: ctx.record.name, + role_name: role.name, + fields: dataSource?.map((item) => { + return item?.field?.key; + }), + }); + } else { + field.value[fieldIndex].fields = dataSource?.map((item) => { + return item?.field?.key; + }); + } + } else { + if (fieldIndex > -1) { + field.value[fieldIndex].fields = []; + } + } + }} + />{' '} + {actionTypeMap.get(actionName)} +
+ ); + }; + const columns: any[] = ['create', 'get', 'update'].map((actionName) => ({ + title: , + dataIndex: actionName, + render: (value, record) => renderCell(actionName, value, record), + })); + columns.unshift({ + title: '字段名称', + dataIndex: ['field', 'uiSchema', 'title'], + }); + return { columns, dataSource, service }; +}; + +export const ActionPermissionField = observer((props) => { + const role = useContext(RoleContext); + const ctx = useContext(TableRowContext); + const field = useField(); + const actionDataSource = useActionDataSource(); + const { columns, dataSource, service } = useFieldPermissions(); + console.log('actionPermissions', field?.value); + return ( +
+
{actionTypeMap.get(value)}, + }, + { + title: '类型', + dataIndex: 'actionName', + render: (value) => + value === 'create' ? ( + 对新数据操作 + ) : ( + 对已有数据操作 + ), + }, + { + title: '允许操作', + dataIndex: 'enable', + render: (value, record) => ( + { + const index = field?.value?.findIndex((item) => { + return item.actionName === record.actionName; + }); + console.log( + 'e.target.checked', + e.target.checked, + index, + field?.value, + ); + if (e.target.checked) { + if (index === -1) { + field.push({ + collection_name: ctx.record.name, + role_name: role.name, + actionName: record.actionName, + fields: [], + }); + } + } else { + if (index > -1) { + field.remove(index); + } + } + }} + /> + ), + }, + { + title: '可操作的数据范围', + dataIndex: ['scope', 'title'], + render: (value) => ( + + ), + }, + ]} + /> +
+
+ {/* ActionPermissionField
+ {role.name}
+ {ctx.record.name} */} +
+ + ); +}); diff --git a/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx b/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2ad8274a4cd47a756f68cf574e95d7be3c1477e1 --- /dev/null +++ b/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import { observer } from '@formily/react'; +import { Table, Checkbox, Spin } from 'antd'; +import { useRequest } from 'ahooks'; +import { Resource } from '../../../resource'; +import { useContext } from 'react'; +import { RoleContext } from '.'; +import { useState } from 'react'; +import { useResourceRequest } from '../../../constate'; + +const getKeys = (items: any[]) => { + const keys = []; + for (const item of items) { + keys.push(item.key); + const children = getKeys(item.children || []); + keys.push(...children); + } + return keys; +}; + +export const MenuPermissionTable = observer((props) => { + const role = useContext(RoleContext); + const [allUiSchemaKyes, setAllUiSchemaKyes] = useState([]); + const [uiSchemaKyes, setUiSchemaKeys] = useState([]); + const { data, loading } = useRequest('ui_schemas:getMenuItems', { + formatResult: (data) => data?.data, + onSuccess(data) { + setAllUiSchemaKyes(getKeys(data)); + }, + }); + console.log('allUiSchemaKyes', allUiSchemaKyes); + const resource = useResourceRequest({ + associatedName: 'roles', + associatedKey: role.name, + resourceName: 'ui_schemas', + }); + useRequest(() => resource.list(), { + formatResult: (data) => data?.data, + onSuccess(data) { + setUiSchemaKeys(getKeys(data)); + }, + }); + const resource2 = useResourceRequest({ + resourceName: 'roles', + resourceKey: role.name, + }); + if (loading) { + return ; + } + return ( +
+
+ 0 && + allUiSchemaKyes.length === uiSchemaKyes.length + } + onChange={async (e) => { + if (e.target.checked) { + await resource2.save({ + ui_schemas: allUiSchemaKyes, + }); + setUiSchemaKeys(allUiSchemaKyes); + } else { + await resource2.save({ + ui_schemas: [], + }); + setUiSchemaKeys([]); + } + }} + />{' '} + 允许访问 + + ), + dataIndex: 'key', + render: (value) => { + return ( + { + setUiSchemaKeys((prevUiSchemaKeys) => { + if (e.target.checked) { + prevUiSchemaKeys.push(value); + } else { + const index = prevUiSchemaKeys.findIndex( + (key) => key === value, + ); + prevUiSchemaKeys.splice(index, 1); + } + return [...prevUiSchemaKeys]; + }); + await resource.toggle({ + resourceKey: value, + }); + }} + /> + ); + }, + }, + ]} + /> + + ); +}); diff --git a/packages/client/src/components/admin-layout/Permissions/index.tsx b/packages/client/src/components/admin-layout/Permissions/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e0013848314873bc045163df8ef86eaa936559df --- /dev/null +++ b/packages/client/src/components/admin-layout/Permissions/index.tsx @@ -0,0 +1,498 @@ +import { SchemaRenderer, useResourceRequest } from '../../../'; +import React, { useContext, useEffect } from 'react'; +import { FormItem } from '@formily/antd'; +import { action } from '@formily/reactive'; +import { useCollectionsContext } from '../../../constate/Collections'; +import { Button } from 'antd'; +import { LockOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { uid, isValid } from '@formily/shared'; +import { Resource } from '../../../resource'; +import { TableRowContext, useTable } from '../../../schemas/table'; +import { useRequest } from 'ahooks'; +import { VisibleContext } from '../../../context'; +import { connect, observer, useForm } from '@formily/react'; +import { DescriptionsContext } from '../../../schemas/form'; +import { createContext } from 'react'; +import { ActionPermissionField } from './ActionPermissionField'; +import { MenuPermissionTable } from './MenuPermissionTable'; +import { ISchema } from '../../../'; + +export const RoleContext = createContext(null); + +function RoleProvider(props) { + const ctx = useContext(TableRowContext); + return ( + + {props.children} + + ); +} + +const useResource = () => { + const resource = useResourceRequest('roles'); + return { + resource, + }; +}; + +const useCollectionsResource = () => { + const descriptionsContext = useContext(DescriptionsContext); + console.log('descriptionsContext.service', descriptionsContext.service); + const resource = useResourceRequest('collections'); + return { + resource, + }; +}; + +class ActionPermissionResource extends Resource { + save(options?: any) { + console.log('ActionPermissionResource.save'); + return Promise.resolve({}); + } +} + +const useActionPermissionSubmit = () => { + const form = useForm(); + const role = useContext(RoleContext); + const resource = useResourceRequest({ + resourceName: 'roles', + resourceKey: role.name, + }); + return { + async run() { + await resource.save(form.values); + console.log('useActionPermissionSubmit', form.values?.actionPermissions); + }, + }; +}; + +const useActionPermissionResource = ({ onSuccess }) => { + const role = useContext(RoleContext); + console.log('RoleContext', role); + // const { props } = useTable(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest( + { + resourceName: 'action_permissions', + }, + ActionPermissionResource, + ); + const service = useRequest( + (params?: any) => { + return resource.list({ + ...params, + filter: { + role_name: role.name, + collection_name: ctx.record.name, + }, + appends: ['fields'], + }); + }, + { + formatResult: (result) => result?.data, + onSuccess(data) { + console.log('actionPermissions', data); + onSuccess({ + actionPermissions: data.map((permission) => { + const item: any = {}; + Object.keys(permission).forEach((key) => { + if (isValid(permission[key])) { + item[key] = permission[key]; + } + }); + item.fields = permission?.fields.map((field) => field.key) || []; + return item; + }), + }); + }, + manual: true, + }, + ); + const [visible] = useContext(VisibleContext); + + useEffect(() => { + if (visible) { + service.run({}); + } + }, [visible]); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const useDetailsResource = ({ onSuccess }) => { + const { props } = useTable(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest({ + resourceName: 'roles', + resourceKey: ctx.record[props.rowKey], + }); + const service = useRequest( + (params?: any) => { + return resource.get({ ...params }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + manual: true, + }, + ); + const [visible] = useContext(VisibleContext); + + useEffect(() => { + if (visible) { + service.run({}); + } + }, [visible]); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const collectionSchema: ISchema = { + type: 'array', + // 'x-decorator': 'CardItem', + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'name', + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + useResource: useCollectionsResource, + collectionName: 'collections', + }, + properties: { + column1: { + type: 'void', + title: '数据表名称', + 'x-component': 'Table.Column', + properties: { + title: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column2: { + type: 'void', + title: '数据表标识', + 'x-component': 'Table.Column', + properties: { + name: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column3: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': { + width: 60, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + title: '配置', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '数据表操作权限', + 'x-component': 'Action.Drawer', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: useActionPermissionResource, + }, + 'x-component-props': { + useOkAction: useActionPermissionSubmit, + }, + properties: { + actionPermissions: { + type: 'array', + 'x-component': 'ActionPermissionField', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +const menuSchema: ISchema = { + type: 'array', + 'x-component': 'MenuPermissionTable', +}; + +const schema: ISchema = { + type: 'void', + name: 'action', + 'x-component': 'Action', + 'x-component-props': { + tooltip: '权限配置', + className: 'nb-database-config', + icon: 'LockOutlined', + type: 'primary', + }, + properties: { + modal1: { + type: 'void', + title: '角色', + 'x-component': 'Action.Drawer', + properties: { + table: { + type: 'array', + // 'x-decorator': 'CardItem', + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'name', + dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + useResource, + collectionName: 'roles', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-component': 'Action', + 'x-component-props': { + icon: 'DeleteOutlined', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + [uid()]: { + type: 'void', + title: '添加', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableCreateAction }}', + }, + properties: { + title: { + type: 'string', + title: '角色名称', + 'x-component': 'Input', + 'x-decorator': 'FormilyFormItem', + }, + // name: { + // type: 'string', + // title: '角色标识', + // 'x-component': 'Input', + // 'x-decorator': 'FormilyFormItem', + // }, + }, + }, + }, + }, + }, + }, + column1: { + type: 'void', + title: '角色名称', + 'x-component': 'Table.Column', + properties: { + title: { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + // column2: { + // type: 'void', + // title: '角色标识', + // 'x-component': 'Table.Column', + // properties: { + // name: { + // type: 'string', + // 'x-component': 'Input', + // 'x-read-pretty': true, + // }, + // }, + // }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': { + width: 160, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + title: '配置', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '配置权限', + 'x-decorator': 'RoleProvider', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + paddingTop: 0, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + properties: { + [uid()]: { + type: 'void', + title: '数据表操作权限', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + collectionSchema, + }, + }, + [uid()]: { + type: 'void', + title: '菜单访问权限', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + menuSchema, + }, + }, + }, + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '编辑', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-action-type': 'update', + properties: { + [uid()]: { + type: 'void', + title: '编辑角色', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: useDetailsResource, + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + title: { + type: 'string', + title: '角色名称', + 'x-component': 'Input', + 'x-decorator': 'FormilyFormItem', + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '删除', + 'x-component': 'Action', + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'destroy', + 'x-component-props': { + type: 'link', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +export const Permissions = () => { + return ( + + ); +}; + +export default Permissions; diff --git a/packages/client/src/components/admin-layout/SiteTitle.tsx b/packages/client/src/components/admin-layout/SiteTitle.tsx new file mode 100644 index 0000000000000000000000000000000000000000..24c5dcfcb27ae78a8694cda47685195f08c028aa --- /dev/null +++ b/packages/client/src/components/admin-layout/SiteTitle.tsx @@ -0,0 +1,51 @@ +import React, { useContext, useEffect } from 'react'; +import { Button, Dropdown, Menu, Spin } from 'antd'; +import { useHistory } from 'react-router-dom'; +import { useRequest } from 'ahooks'; +import { createContext } from 'react'; +import { useResourceRequest } from '../../constate'; + +export const SystemSettingsContext = createContext(null); + +export function SystemSettingsProvider(props) { + const resource = useResourceRequest({ + resourceName: 'system_settings', + resourceKey: 1, + }); + const service = useRequest( + () => + resource.get({ + resourceKey: 1, + appends: ['logo'], + }), + { + formatResult: (data) => data?.data, + }, + ); + return ( + + {service.loading ? ( + + ) : ( + props.children + )} + + ); +} + +export const useSystemSettings = () => { + const ctx = useContext(SystemSettingsContext); + return ctx?.service?.data || {}; +}; + +export const SiteTitle = () => { + const { service = {} } = useContext(SystemSettingsContext); + const { loading, data } = service; + return ( +
+ {!loading && data?.logo?.url && ( + + )} +
+ ); +}; diff --git a/packages/client/src/components/admin-layout/UserInfo.tsx b/packages/client/src/components/admin-layout/UserInfo.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3828bcff3397c27d5a6331d8e7e609e58e3388ec --- /dev/null +++ b/packages/client/src/components/admin-layout/UserInfo.tsx @@ -0,0 +1,121 @@ +import React, { useContext, useEffect } from 'react'; +import { Button, Dropdown, Menu, Select } from 'antd'; +import { useHistory } from 'react-router-dom'; +import { SchemaField } from '../../schemas'; +import { AuthContext, useCurrentUser } from './Auth'; +import { FormButtonGroup, FormDrawer, FormLayout, Submit } from '@formily/antd'; +import { useState } from 'react'; +import { useClient } from '../../constate'; + +export const UserInfo = () => { + const history = useHistory(); + const { service, currentUser } = useContext(AuthContext); + const [visible, setVisible] = useState(false); + const { request } = useClient(); + return ( + + { + setVisible(false); + const values = await FormDrawer('个人资料', () => { + return ( + + + + + {}}>保存 + + + + ); + }).open({ + initialValues: currentUser || {}, + }); + const { data } = await request('users:updateProfile', { + method: 'post', + data: values, + }); + service.mutate(data); + }} + > + 个人资料 + + +
+ + 角色切换 + + +
+
+ + { + await request('users:logout'); + localStorage.removeItem('NOCOBASE_TOKEN'); + history.push('/login'); + }} + > + 退出登录 + + + } + > + +
+ ); +}; diff --git a/packages/client/src/components/admin-layout/datatable.tsx b/packages/client/src/components/admin-layout/datatable.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2902a304e4083f53066f2a37838da9837d0d5e03 --- /dev/null +++ b/packages/client/src/components/admin-layout/datatable.tsx @@ -0,0 +1,82 @@ +import { SchemaRenderer } from '../../'; +import React from 'react'; +import { FormItem } from '@formily/antd'; +import { action } from '@formily/reactive'; +import { useCollectionsContext } from '../../constate/Collections'; +import { Field } from '@formily/core'; + +export const useAsyncDataSource = (service: any) => (field: any) => { + console.log('loadCollectionFields'); + field.loading = true; + service(field).then( + action.bound((data: any) => { + field.dataSource = data; + field.loading = false; + }), + ); +}; + +export default () => { + const { collections = [], loading } = useCollectionsContext(); + + const loadCollections = async (field: any) => { + return collections.map((item: any) => ({ + label: item.title, + value: item.name, + })); + }; + + const loadCollectionFields = async (field: Field) => { + const target = field.query('....target').get('value'); + const f = field.query('....target').take(); + console.log('loadCollectionFields', f, field); + const collection = collections?.find((item) => item.name === target); + if (!collection) { + return []; + } + return collection?.generalFields + ?.filter((item) => item?.uiSchema?.title) + ?.map((item) => ({ + label: item?.uiSchema?.title || item.name, + value: item.name, + })); + }; + + const schema = { + type: 'array', + name: 'collections', + 'x-component': 'DatabaseCollection', + 'x-component-props': {}, + default: [], + properties: { + title: { + type: 'string', + title: '数据表名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + name: { + type: 'string', + title: '数据表标识', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + generalFields: { + type: 'array', + title: '数据表字段', + 'x-decorator': 'FormItem', + 'x-component': 'DatabaseField', + default: [], + }, + }, + }; + return ( + + ); +}; diff --git a/packages/client/src/components/admin-layout/index.tsx b/packages/client/src/components/admin-layout/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e1cc1331e8fd262e751d88c2bd08ff1331b4bba6 --- /dev/null +++ b/packages/client/src/components/admin-layout/index.tsx @@ -0,0 +1,326 @@ +import React, { useContext, useEffect, useRef, useState } from 'react'; +import { + Button, + Spin, + Layout, + PageHeader, + Modal, + Menu, + Collapse, + Dropdown, + Tooltip, +} from 'antd'; +import isEmpty from 'lodash/isEmpty'; +import { + Link, + useLocation, + useRouteMatch, + useHistory, + Redirect, +} from 'react-router-dom'; +import { SchemaRenderer } from '../../schemas'; +import { useRequest } from 'ahooks'; +import './style.less'; + +import { ISchema, Schema } from '@formily/react'; +import Database, { useAsyncDataSource } from './datatable'; +import { HighlightOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { + DesignableSwitchProvider, + useDesignableSwitchContext, + PageTitleProvider, + usePageTitleContext, + CollectionsProvider, + useCollectionsContext, +} from '../../constate'; +import { uid } from '@formily/shared'; +import { Permissions } from './Permissions'; +import { Collections } from './Collections'; +import { More } from './More'; +import { UserInfo } from './UserInfo'; +import { + SiteTitle, + SystemSettingsProvider, + useSystemSettings, +} from './SiteTitle'; +import { AuthProvider } from './Auth'; +import { Helmet } from 'react-helmet'; +import { MenuSelectedKeysContext } from '../../schemas/menu'; + +function DesignableToggle() { + const { designable, setDesignable } = useDesignableSwitchContext(); + const [visible, setVisible] = useState(false); + useEffect(() => { + if (designable) { + return; + } + if (localStorage.getItem('hide-tip')) { + return; + } + setTimeout(() => { + setVisible(true); + }, 2000); + }, []); + return ( +
+ + 点此进入界面配置{' '} + { + localStorage.setItem('hide-tip', 'true'); + setVisible(false); + }} + > + 关闭 + + + } + visible={visible} + onVisibleChange={(visible) => { + setVisible(visible); + }} + > + + + + + +
+ ); +} + +interface LayoutWithMenuProps { + schema: Schema; + [key: string]: any; +} + +function LayoutWithMenu(props: LayoutWithMenuProps) { + const { schema, defaultSelectedKeys } = props; + const match = useRouteMatch(); + const sideMenuRef = useRef(); + const history = useHistory(); + const { title } = useSystemSettings(); + const [activeKey, setActiveKey] = useState(match.params.name); + const { setPageTitle } = usePageTitleContext(); + + const [selectedKeys, setSelectedKeys] = useState(defaultSelectedKeys); + const onSelect = (info) => { + if (!info.schema) { + setActiveKey(null); + } else if (info.schema['x-component'] === 'Menu.SubMenu') { + const findMenuItem = (schema: Schema) => { + const first = Object.values(schema.properties || {}).shift(); + if (!first) { + return null; + } + if (['Menu.Link', 'Menu.URL'].includes(first['x-component'])) { + return first; + } + return findMenuItem(first); + }; + console.log('info.schema', findMenuItem(info.schema)); + // 实际应该取第一个子元素 + const node = findMenuItem(info.schema); + setActiveKey(node?.key); + if (node?.key) { + history.push(`/admin/${node?.key}`); + const keys = [node?.name]; + let parent = node?.parent; + while (parent) { + if (parent['x-component'] === 'Menu') { + break; + } + keys.unshift(parent.name); + parent = parent.parent; + } + setSelectedKeys(keys); + if (node.title) { + setPageTitle(node.title); + } + } + } else { + setActiveKey(info.schema.key); + history.push(`/admin/${info.schema.key}`); + if (info.schema.title) { + setPageTitle(info.schema.title); + const keys = [info.schema?.name]; + let parent = info.schema?.parent; + while (parent) { + if (parent['x-component'] === 'Menu') { + break; + } + keys.unshift(parent.name); + parent = parent.parent; + } + setSelectedKeys(keys); + // setSelectedKeys([info.schema.name]); + } + } + }; + useEffect(() => { + setActiveKey(match.params.name); + }, [match.params.name]); + const onMenuItemRemove = () => { + history.push(`/admin/${uid()}`); + }; + console.log({ activeKey, selectedKeys }); + return ( + + + + + { + console.log('getSelectedKeys', schema); + return selectedKeys.filter(Boolean); + }, + selectedKeys: selectedKeys.filter(Boolean), + }} + /> + + + + + + + + + + + {activeKey ? ( + + ) : ( + + {title} + + )} + + + + ); +} + +function Content({ activeKey }) { + const { designable } = useDesignableSwitchContext(); + const { collections } = useCollectionsContext(); + const { data = {}, loading } = useRequest( + `ui_schemas:getTree?filter[parentKey]=${activeKey}`, + { + refreshDeps: [activeKey, collections, designable], + formatResult: (result) => result?.data, + }, + ); + + if (loading) { + return ; + } + + return ; +} + +export function AdminLayout({ route, ...others }: any) { + const match = useRouteMatch(); + + const { data = {}, loading } = useRequest( + `ui_schemas:getTree/${route.uiSchemaKey}`, + { + refreshDeps: [route], + formatResult: (result) => result?.data, + }, + ); + + const first: any = Object.values(data?.properties || {}).shift(); + + const findMenuLinkProperties = (schema: Schema): Schema[] => { + if (!schema) { + return []; + } + if (schema['x-component'] == 'Menu.Link') { + return [schema]; + } + return schema.reduceProperties((items, current) => { + if (current['x-component'] == 'Menu.Link') { + return [...items, current]; + } + return [...items, ...findMenuLinkProperties(current)]; + }, []); + }; + + if (loading) { + return ; + } + + const f = findMenuLinkProperties(new Schema(first || {})).shift(); + + if (f?.['key'] && !match.params.name) { + return ; + } + + const findProperties = (schema: Schema): Schema[] => { + if (!schema) { + return []; + } + return schema.reduceProperties((items, current) => { + if (current['key'] == match.params.name) { + return [...items, current]; + } + return [...items, ...findProperties(current)]; + }, []); + }; + const current = findProperties(new Schema(data)).shift(); + const defaultSelectedKeys = [current?.name]; + let parent = current?.parent; + while (parent) { + if (parent['x-component'] === 'Menu') { + break; + } + defaultSelectedKeys.unshift(parent.name); + parent = parent.parent; + } + + return ( + + + + + + + + + + + + ); +} + +export default AdminLayout; diff --git a/packages/client/src/components/admin-layout/style.less b/packages/client/src/components/admin-layout/style.less new file mode 100644 index 0000000000000000000000000000000000000000..067a6dc4ccb3dac00d95ecfc1c0d158eadd4ed66 --- /dev/null +++ b/packages/client/src/components/admin-layout/style.less @@ -0,0 +1,120 @@ +// .fields-collapse { +// border: 1px solid #f0f0f0; +// border-bottom: 0; +// > .ant-collapse-item { +// border-bottom: 1px solid #f0f0f0; +// } +// .ant-collapse-content { +// &.ant-collapse-content-active { +// border-top: 1px solid #f0f0f0; +// } +// } +// > .ant-collapse-item > .ant-collapse-content { +// background: #fff; +// } +// > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box { +// padding: 16px; +// padding-bottom: 1px; +// } +// } + +// .ant-collapse { +// border: 1px solid #d9d9d9 !important; +// border-bottom: 0 !important; +// > .ant-collapse-item { +// border-bottom: 1px solid #d9d9d9 !important; +// } +// .ant-collapse-content { +// border-top: 1px solid #d9d9d9 !important; +// } +// .ant-collapse-content > .ant-collapse-content-box { +// padding: 24px !important; +// padding-bottom: 0 !important; +// } +// } +.roles-select { + .ant-select-selector { + // padding-left: 0 !important; + } +} +.nb-spin-center { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + max-height: inherit !important; +} + +.database-sider { + background: #fafafa; + padding-top: 16px; + .ant-menu { + background: #fafafa; + border-right: 0; + } + .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + background: #fff; + &::after { + display: none; + } + } +} + +.nb-designable-toggle { + background: none !important; + border-radius: 0 !important; + &.active { + // background: #faad14 !important; + } + &.has-tip { + background: #f18b62 !important; + } +} + +.user-info { + height: 46px; + color: #fff; + &:hover, + &:focus { + color: #fff; + } +} + +.site-info { + display: flex; + align-items: center; + .site-logo { + height: 20px; + padding: 0 16px; + } + .site-title { + color: #fff; + font-size: 20px; + padding-right: 8px; + } +} + +.site-header { + .ant-menu.ant-menu-dark .ant-menu-item-selected, + .ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { + background-color: rgba(255, 255, 255, 0.1); + } + .ant-menu-dark.ant-menu-horizontal > .ant-menu-item:hover { + background-color: rgba(255, 255, 255, 0.1); + } + .ant-btn { + color: rgba(255, 255, 255, 0.65) !important; + &.nb-designable-toggle:hover { + color: #fff !important; + background-color: #f18b62 !important; + } + } + .ant-btn:hover { + color: #fff !important; + background-color: rgba(255, 255, 255, 0.1) !important; + } +} diff --git a/packages/client/src/components/auth-layout/index.tsx b/packages/client/src/components/auth-layout/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ee656bd799bd883ef9915f564f2ce9ec01e631d9 --- /dev/null +++ b/packages/client/src/components/auth-layout/index.tsx @@ -0,0 +1,17 @@ +import { Card } from 'antd'; +import React from 'react'; +import { useLocation, useHistory } from 'react-router-dom'; +import { SystemSettingsProvider } from '../admin-layout/SiteTitle'; + +export function AuthLayout({ children, route }: any) { + const location = useLocation(); + const history = useHistory(); + return ( +
+

NocoBase

+ {children} +
+ ); +} + +export default AuthLayout; diff --git a/packages/client/src/components/drag-and-drop/index.tsx b/packages/client/src/components/drag-and-drop/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..388cbd8db6e14869853a26bd31a220e4fc45db49 --- /dev/null +++ b/packages/client/src/components/drag-and-drop/index.tsx @@ -0,0 +1,458 @@ +import React, { createContext, useContext, useEffect, useRef } from 'react'; +import { useState } from 'react'; +import { useMouseEvents, useWillUnmount } from 'beautiful-react-hooks'; +import { useField, useFieldSchema } from '@formily/react'; +import { useMount } from 'ahooks'; +import constate from 'constate'; +import { useSchemaPath } from '../../schemas'; + +export const DraggableBlockContext = createContext({ + dragRef: null, +}); + +export function useDragDropManager({ uid }) { + const [drag, setDrag] = useState(null); + const [drop, setDrop] = useState(null); + const [drops, setDrops] = useState({}); + const addDrop = (dropId, data) => + setDrops((prevDrops) => { + prevDrops[dropId] = data; + return prevDrops; + }); + const getDrop = (dropId) => { + return drops[dropId]; + }; + return { uid, drag, drop, drops, setDrag, addDrop, setDrop, getDrop }; +} + +const [DragDropManagerProvider, useDragDropManagerContext] = + constate(useDragDropManager); + +export function useDragDropUID() { + const { uid } = useDragDropManagerContext(); + return uid; +} + +export { DragDropManagerProvider, useDragDropManagerContext }; + +export function mergeRefs( + refs: Array | React.LegacyRef>, +): React.RefCallback { + return (value) => { + refs.forEach((ref) => { + if (typeof ref === 'function') { + ref(value); + } else if (ref != null) { + (ref as React.MutableRefObject).current = value; + } + }); + }; +} + +export function useDrag(options?: any) { + const { type, onDragStart, onDrag, onDragEnd, item = {} } = options; + const dragRef = useRef(); + const previewRef = useRef(); + const { onMouseDown } = useMouseEvents(dragRef); + const { onMouseMove, onMouseUp } = useMouseEvents(); + const [previewElement, setPreviewElement] = useState(); + const [isDragging, setIsDragging] = useState(false); + const [mousePostionWithinPreview, setMousePostionWithinPreview] = useState({ + left: 0, + top: 0, + }); + const { drag, setDrag, setDrop, getDrop } = useDragDropManagerContext(); + + useWillUnmount(() => { + setIsDragging(false); + // @ts-ignore + window.__previewElement && window.__previewElement.remove(); + // @ts-ignore + window.__previewElement = undefined; + + setDrag(null); + setDrop(null); + + document.body.classList.remove('dragging'); + document.body.style.cursor = null; + document.body.style.userSelect = null; + }); + + onMouseDown((event: React.MouseEvent) => { + if (event.button !== 0) { + return; + } + setDrop({ type, item }); + setDrag({ type, item }); + setIsDragging(true); + + const postion = { + left: event.clientX - previewRef.current.getBoundingClientRect().left, + top: event.clientY - previewRef.current.getBoundingClientRect().top, + }; + + setMousePostionWithinPreview(postion); + + const offset = { + left: event.pageX - postion.left, + top: event.pageY - postion.top, + }; + + const wrap = document.createElement('div'); + wrap.className = 'drag-container'; + wrap.style.position = 'absolute'; + wrap.style.pointerEvents = 'none'; + wrap.style.opacity = '0.7'; + wrap.style.left = `0px`; + wrap.style.top = `0px`; + wrap.style.zIndex = '9999'; + wrap.style.width = `${previewRef.current.clientWidth}px`; + wrap.style.transform = `translate(${offset.left}px, ${offset.top}px)`; + + setPreviewElement(wrap); + // @ts-ignore + window.__previewElement = wrap; + // console.log( + // 'dragDropManager.previewElement', + // dragDropManager.previewElement, + // ); + document.body.appendChild(wrap); + const el = document.createElement('div'); + wrap.appendChild(el); + el.outerHTML = previewRef.current.outerHTML; + onDragStart && onDragStart(event); + document.body.style.cursor = 'grab'; + document.body.style.userSelect = 'none'; + document.body.classList.add('dragging'); + + // console.log( + // 'onMouseDown', + // { isDragging, previewElement }, + // dragDropManager.previewElement, + // field ? field.address.segments : null, + // ); + // console.log('onMouseDown', event); + }); + + onMouseUp((event: React.MouseEvent) => { + if (!isDragging || !previewElement) { + return; + } + + // console.log( + // 'onMouseUp', + // { isDragging, previewElement }, + // field ? field.address.segments : null, + // ); + + // @ts-ignore + event.dragItem = item; + + setIsDragging(false); + setDrag(null); + // dragDropManager.drag = null; + previewElement.remove(); + setPreviewElement(undefined); + document.body.classList.remove('dragging'); + document.body.style.cursor = null; + document.body.style.userSelect = null; + // @ts-ignore + window.__previewElement && window.__previewElement.remove(); + // @ts-ignore + window.__previewElement = undefined; + + if (!type) { + onDragEnd && onDragEnd(event); + } + + let dropElement = document.elementFromPoint(event.clientX, event.clientY); + const dropIds = []; + while (dropElement) { + if (!dropElement.getAttribute) { + dropElement = dropElement.parentNode as HTMLElement; + continue; + } + const dropId = dropElement.getAttribute('data-drop-id'); + + const dropContext = getDrop(dropId); + if (dropContext && dropContext.accept === type) { + if ( + !dropContext.shallow || + (dropContext.shallow && dropIds.length === 0) + ) { + // @ts-ignore + event.data = dropContext.data; + onDragEnd && onDragEnd(event); + dropIds.push(dropId); + } + } + dropElement = dropElement.parentNode as HTMLElement; + } + }); + + onMouseMove((event: React.MouseEvent) => { + if (!isDragging || !previewElement) { + return; + } + + console.log('drag', drag.dropIds); + // console.log( + // 'onMouseMove', + // { isDragging, previewElement }, + // dragDropManager.previewElement, + // field ? field.address.segments : null, + // ); + // console.log({previewElement}) + + const offset = { + left: event.pageX - mousePostionWithinPreview.left, + top: event.pageY - mousePostionWithinPreview.top, + }; + + previewElement.style.transform = `translate(${offset.left}px, ${offset.top}px)`; + + if (type) { + let dropElement = document.elementFromPoint(event.clientX, event.clientY); + const dropIds = []; + while (dropElement) { + if (!dropElement.getAttribute) { + dropElement = dropElement.parentNode as HTMLElement; + continue; + } + const dropId = dropElement.getAttribute('data-drop-id'); + const dropContext = getDrop(dropId); + if (dropContext && dropContext.accept === type) { + if ( + !dropContext.shallow || + (dropContext.shallow && dropIds.length === 0) + ) { + dropIds.push(dropId); + } + // @ts-ignore + // event.data = dropContext.data; + } + dropElement = dropElement.parentNode as HTMLElement; + } + setDrag({ type, dropIds }); + } + + onDrag && onDrag(event); + }); + + return { isDragging, dragRef, previewRef }; +} + +export function useDrop(options) { + const { + uid: dropId, + accept, + data, + shallow, + onDrop, + onHover, + canDrop = true, + } = options; + const dropRef = useRef(); + const { onMouseEnter, onMouseLeave, onMouseMove, onMouseUp } = + useMouseEvents(dropRef); + const [isOver, setIsOver] = useState(false); + const [onTopHalf, setOnTopHalf] = useState(null); + // const dragDropManager = useContext(DragDropManagerContext); + const { drag, drop, addDrop, setDrop } = useDragDropManagerContext(); + + useEffect(() => { + addDrop(dropId, { + accept, + data, + shallow, + }); + // console.log('dragDropManager.drops', dragDropManager.drops); + // dragDropManager.drops[dropId] = { + // accept, + // data, + // shallow, + // }; + dropRef.current.setAttribute('data-drop-id', dropId); + }, [dropId]); + + onMouseEnter((event) => { + if (!canDrop) { + return; + } + // console.log({ dragDropManager }); + if (!drag || drag.type !== accept) { + return; + } + setIsOver(true); + }); + + onMouseMove((event: React.MouseEvent) => { + if (!canDrop) { + return; + } + if (!drag || drag.type !== accept) { + return; + } + console.log('drag.dropIds', drag.dropIds, dropId); + if (drag.dropIds && drag.dropIds.includes(dropId)) { + const top = event.clientY - dropRef.current.getBoundingClientRect().top; + const onTop = top < dropRef.current.clientHeight / 2; + setOnTopHalf(onTop); + // @ts-ignore + event.onTopHalf = onTop; + setIsOver(true); + onHover && onHover(event); + } else { + setIsOver(false); + } + }); + + onMouseUp((event: React.MouseEvent) => { + if (!canDrop) { + return; + } + if (event.button !== 0) { + return; + } + if (isOver) { + const top = event.clientY - dropRef.current.getBoundingClientRect().top; + const onTop = top < dropRef.current.clientHeight / 2; + setOnTopHalf(onTop); + // @ts-ignore + event.onTopHalf = onTop; + // @ts-ignore + event.data = data; + // @ts-ignore + event.dragItem = drop.item; + // @ts-ignore + event.dropElement = dropRef.current; + onDrop && onDrop(event); + // dragDropManager.onDrop && dragDropManager.onDrop(event); + setDrop(null); + } + setIsOver(false); + }); + + onMouseLeave(() => { + if (!canDrop) { + return; + } + setIsOver(false); + }); + + return { + onTopHalf: isOver ? onTopHalf : null, + isOver, + dropRef, + }; +} + +export function useColResizer(options?: any) { + const { onDragStart, onDrag, onDragEnd } = options || {}; + const dragRef = useRef(); + const [dragOffset, setDragOffset] = useState({ left: 0, top: 0 }); + const { onMouseDown } = useMouseEvents(dragRef); + const { onMouseMove, onMouseUp } = useMouseEvents(); + const [isDragging, setIsDragging] = useState(false); + const [columns, setColumns] = useState(options.columns || []); + const [initial, setInitial] = useState(null); + + onMouseDown((event: React.MouseEvent) => { + if (event.button !== 0) { + return; + } + const prev = dragRef.current.previousElementSibling as HTMLDivElement; + const next = dragRef.current.nextElementSibling as HTMLDivElement; + if (!prev || !next) { + return; + } + setIsDragging(true); + if (!initial) { + setInitial({ + offset: event.clientX, + prevWidth: prev.style.width, + nextWidth: next.style.width, + }); + } + }); + + onMouseUp((event: React.MouseEvent) => { + if (!isDragging) { + return; + } + const parent = dragRef.current.parentElement; + const els = parent.querySelectorAll(':scope > .nb-grid-col'); + const size = []; + const gap = dragRef.current.clientWidth; + console.log( + 'parent.clientWidth', + parent.clientWidth, + dragRef.current.clientWidth, + ); + els.forEach((el: HTMLDivElement) => { + const w = (100 * el.clientWidth) / parent.clientWidth; + const w2 = + (100 * (el.clientWidth + gap + gap / els.length)) / parent.clientWidth; + size.push(w2); + el.style.width = `${w}%`; + }); + console.log({ size }); + setIsDragging(false); + setInitial(null); + // @ts-ignore + event.data = { size }; + onDragEnd && onDragEnd(event); + }); + + onMouseMove((event: React.MouseEvent) => { + if (!isDragging) { + return; + } + const offset = event.clientX - initial.offset; + // dragRef.current.style.transform = `translateX(${event.clientX - initialOffset}px)`; + const prev = dragRef.current.previousElementSibling as HTMLDivElement; + const next = dragRef.current.nextElementSibling as HTMLDivElement; + prev.style.width = `calc(${initial.prevWidth} + ${offset}px)`; + next.style.width = `calc(${initial.nextWidth} - ${offset}px)`; + // console.log('dragRef.current.nextSibling', prev.style.width); + }); + + return { isDragging, dragOffset, dragRef, columns }; +} + +export function useBlockDragAndDrop() { + const schema = useFieldSchema(); + const uid = useDragDropUID(); + const path = useSchemaPath(); + const { isDragging, dragRef, previewRef } = useDrag({ + type: uid, + onDragStart() { + console.log('onDragStart'); + }, + onDragEnd(event) { + console.log('onDragEnd', event.data); + }, + onDrag(event) { + // console.log('onDrag'); + }, + item: { + path, + schema: schema.toJSON(), + }, + }); + const { isOver, onTopHalf, dropRef } = useDrop({ + uid: schema.name, + accept: uid, + data: {}, + canDrop: !isDragging, + }); + + return { + isDragging, + dragRef, + previewRef, + isOver, + onTopHalf, + dropRef, + }; +} diff --git a/packages/app/src/components/icons/index.tsx b/packages/client/src/components/icon-picker/index.tsx similarity index 58% rename from packages/app/src/components/icons/index.tsx rename to packages/client/src/components/icon-picker/index.tsx index 7c98853e83edd48c425a1279727a72a0cd31f032..f4805c8b89d0717e1e09911e0cd17326ec8c51cc 100644 --- a/packages/app/src/components/icons/index.tsx +++ b/packages/client/src/components/icon-picker/index.tsx @@ -1,16 +1,9 @@ -import React from 'react'; -import { - createFromIconfontCN, - UserOutlined, - TeamOutlined, - DatabaseOutlined, - DashboardOutlined, - SettingOutlined, - TableOutlined, - MenuOutlined, - HistoryOutlined, - NotificationOutlined, -} from '@ant-design/icons'; +import React, { useState } from 'react'; +import { connect, mapProps, mapReadPretty } from '@formily/react'; +import { Input, Popover, Button } from 'antd'; +import { LoadingOutlined, CloseOutlined } from '@ant-design/icons'; +import { createFromIconfontCN } from '@ant-design/icons'; +import * as antIcons from '@ant-design/icons'; export const IconFont = createFromIconfontCN({ scriptUrl: ['//at.alicdn.com/t/font_2261954_u9jzwc44ug.js'], @@ -30,21 +23,15 @@ export function hasIcon(type: string) { } export function registerIcons(components) { - Object.keys(components).forEach(type => { + Object.keys(components).forEach((type) => { registerIcon(type, components[type]); }); } -registerIcons({ - HistoryOutlined, - MenuOutlined, - TableOutlined, - SettingOutlined, - TeamOutlined, - UserOutlined, - DatabaseOutlined, - DashboardOutlined, - NotificationOutlined, +Object.keys(antIcons).forEach((name) => { + if (name.endsWith('Outlined')) { + registerIcon(name, antIcons[name]); + } }); interface IconProps { @@ -52,7 +39,7 @@ interface IconProps { [key: string]: any; } -export function Icon(props: IconProps) { +export function IconPicker(props: IconProps) { const { type = '', ...restProps } = props; if (type && icons.has(type.toLowerCase())) { const IconComponent = icons.get(type.toLowerCase()); @@ -61,7 +48,7 @@ export function Icon(props: IconProps) { } return ; } - return ; + return null; } -export default Icon; +export default IconPicker; diff --git a/packages/client/src/components/route-schema-renderer/index.tsx b/packages/client/src/components/route-schema-renderer/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7d2f1551626500c297e8b7068a6c895b4cad3d87 --- /dev/null +++ b/packages/client/src/components/route-schema-renderer/index.tsx @@ -0,0 +1,81 @@ +import React, { useContext, useEffect, useState } from 'react'; +import { message, Spin } from 'antd'; +import { Helmet } from 'react-helmet'; +import { useRequest } from 'ahooks'; +import { SchemaRenderer } from '../../schemas'; +import { useForm } from '@formily/react'; +import { useHistory, useLocation } from 'react-router-dom'; +import { useSystemSettings } from '../admin-layout/SiteTitle'; +import { useClient } from '../../constate'; + +function Div(props) { + return
; +} + +export function useLogin() { + const form = useForm(); + const history = useHistory(); + const location = useLocation(); + const query = new URLSearchParams(location.search); + const redirect = query.get('redirect'); + const { request } = useClient(); + return { + async run() { + await form.submit(); + const { data } = await request('users:login', { + method: 'post', + data: form.values, + }); + history.push(redirect || '/admin'); + localStorage.setItem('NOCOBASE_TOKEN', data?.token); + }, + }; +} + +export function useRegister() { + const form = useForm(); + const history = useHistory(); + const { request } = useClient(); + return { + async run() { + await form.submit(); + const { data } = await request('users:register', { + method: 'post', + data: form.values, + }); + message.success('注册成功,将跳转登录页'); + setTimeout(() => { + history.push('/login'); + }, 1000); + console.log(form.values); + }, + }; +} + +export function RouteSchemaRenderer({ route }) { + const { data = {}, loading } = useRequest( + `ui_schemas:getTree/${route.uiSchemaKey}`, + { + refreshDeps: [route], + formatResult: (result) => result?.data, + }, + ); + const { title } = useSystemSettings(); + if (loading) { + return ; + } + return ( +
+ + {title ? `${data.title} - ${title}` : data.title} + + +
+ ); +} + +export default RouteSchemaRenderer; diff --git a/packages/client/src/components/router-config/demos/demo1.tsx b/packages/client/src/components/router-config/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..db6597235bea5c1e64fd710299d6adca9d5d76dc --- /dev/null +++ b/packages/client/src/components/router-config/demos/demo1.tsx @@ -0,0 +1,49 @@ +import React, { useMemo } from 'react'; +import { + Link, + useLocation, + useRouteMatch, + MemoryRouter as Router, +} from 'react-router-dom'; +import { createRouteSwitch, RouteRedirectProps } from '..'; + +const RouteSwitch = createRouteSwitch({ + components: { + Home: (props) => { + console.log({ props }); + return
Home {props.children}
; + }, + Login: () =>
Login
, + }, +}); + +export default () => { + const routes: Array = [ + { + type: 'route', + path: '/login', + exact: true, + component: 'Login', + }, + { + type: 'route', + path: '/home', + component: 'Home', + routes: [ + { + type: 'route', + path: '/home/123', + exact: true, + component: 'Login', + }, + ], + }, + ]; + return ( +
+ + + +
+ ); +}; diff --git a/packages/client/src/components/router-config/demos/demo2.tsx b/packages/client/src/components/router-config/demos/demo2.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8d79e1f13796d02c70e54ffd6c066180136024ae --- /dev/null +++ b/packages/client/src/components/router-config/demos/demo2.tsx @@ -0,0 +1,65 @@ +import React, { useMemo } from 'react'; +import { + Link, + useLocation, + useRouteMatch, + MemoryRouter as Router, +} from 'react-router-dom'; +import { createRouteSwitch, RouteRedirectProps } from '..'; +import { AdminLayout } from '../../admin-layout'; +import { AuthLayout } from '../../auth-layout'; +import { RouteSchemaRenderer } from '../../route-schema-renderer'; + +const RouteSwitch = createRouteSwitch({ + components: { + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + }, +}); + +const routes: Array = [ + { + type: 'redirect', + from: '/', + to: '/admin', + exact: true, + }, + { + type: 'route', + path: '/admin/:name(.+)?', + component: 'AdminLayout', + title: `后台`, + uiSchemaKey: 'qqzzjakwkwl', + }, + { + type: 'route', + component: 'AuthLayout', + children: [ + { + type: 'route', + path: '/login', + component: 'RouteSchemaRenderer', + title: `登录`, + uiSchemaKey: 'dtf9j0b8p9u', + }, + { + type: 'route', + path: '/register', + component: 'RouteSchemaRenderer', + title: `注册`, + uiSchemaKey: '46qlxqam3xk', + }, + ], + }, +]; + +export default () => { + return ( +
+ + + +
+ ); +}; diff --git a/packages/client/src/components/router-config/index.md b/packages/client/src/components/router-config/index.md new file mode 100644 index 0000000000000000000000000000000000000000..a3673e456e4ba3d421828dc7c9a1e5b96798c482 --- /dev/null +++ b/packages/client/src/components/router-config/index.md @@ -0,0 +1,7 @@ +--- +hide: true +--- + + + + diff --git a/packages/client/src/components/router-config/index.tsx b/packages/client/src/components/router-config/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b47455d0e5ba19b503a76cf7859572c8dc64d07f --- /dev/null +++ b/packages/client/src/components/router-config/index.tsx @@ -0,0 +1,107 @@ +import { get } from 'lodash'; +import React from 'react'; +import { useContext } from 'react'; +import { createContext } from 'react'; +import { Switch, Route, Redirect } from 'react-router'; + +export interface RedirectProps { + type: 'redirect'; + to: any; + path?: string; + exact?: boolean; + strict?: boolean; + push?: boolean; + from?: string; + [key: string]: any; +} + +export interface RouteProps { + type: 'route'; + path?: string | string[]; + exact?: boolean; + strict?: boolean; + sensitive?: boolean; + component?: any; + routes?: RouteProps[]; + [key: string]: any; +} + +export type RouteRedirectProps = RedirectProps | RouteProps; + +export interface RouteSwitchOptions { + routes?: RouteRedirectProps[]; + components?: any; +} + +export interface RouteSwitchProps { + routes?: RouteRedirectProps[]; + components?: any; +} + +export const RouteComponentsContext = createContext(null); + +export function useComponent(route: RouteProps) { + const components = useContext(RouteComponentsContext); + if (typeof route.component === 'string') { + const component = get(components, route.component); + return component; + } + return route.component || (() => null); +} + +export function createRouteSwitch(options: RouteSwitchOptions) { + function ComponentRenderer(props) { + const Component = useComponent(props.route); + return ( + + + + ); + } + + function RouteSwitch(props: RouteSwitchProps) { + const { routes = [] } = props; + if (!routes.length) { + return null; + } + return ( + + + {routes.map((route, index) => { + if (route.type == 'redirect') { + return ( + + ); + } + if (!route.path && Array.isArray(route.routes)) { + route.path = route.routes.map((r) => r.path) as any; + } + return ( + { + return ; + }} + /> + ); + })} + + + ); + } + return RouteSwitch; +} diff --git a/packages/client/src/components/schema-renderer/demos/demo1.tsx b/packages/client/src/components/schema-renderer/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7e1433da11ab2225df67db0f9a52f3ee248bd877 --- /dev/null +++ b/packages/client/src/components/schema-renderer/demos/demo1.tsx @@ -0,0 +1,50 @@ +import { Button } from 'antd'; +import React from 'react'; +import { SchemaRenderer, useDesignable, useSchema } from '..'; +import { uid } from '@formily/shared'; + +const Hello = () => { + return
Hello
; +}; + +const AddNew = () => { + const { schema, refresh, insertBefore } = useDesignable(); + return ( +
+ +
+ ); +}; + +export default () => { + return ( + + ); +}; diff --git a/packages/client/src/components/schema-renderer/index.md b/packages/client/src/components/schema-renderer/index.md new file mode 100644 index 0000000000000000000000000000000000000000..a6497eefea4045896416fcd379e6f1da1c793b5e --- /dev/null +++ b/packages/client/src/components/schema-renderer/index.md @@ -0,0 +1,5 @@ +--- +hide: true +--- + + diff --git a/packages/client/src/components/schema-renderer/index.tsx b/packages/client/src/components/schema-renderer/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b7c02bcdb376623f82ef10e172306f365329b50d --- /dev/null +++ b/packages/client/src/components/schema-renderer/index.tsx @@ -0,0 +1,738 @@ +import { ArrayField, createForm } from '@formily/core'; +import { + createSchemaField, + FormProvider, + Schema, + SchemaOptionsContext, + useField, + useFieldSchema, + useForm, +} from '@formily/react'; +import { uid } from '@formily/shared'; +import constate from 'constate'; +import { get } from 'lodash'; +import React, { createContext } from 'react'; +import { useState } from 'react'; +import { useContext } from 'react'; +import { useMemo } from 'react'; + +import { CodeOutlined } from '@ant-design/icons'; +import Editor from '@monaco-editor/react'; + +import { + ArrayItems, + ArrayCollapse, + FormLayout, + FormItem as FormilyFormItem, +} from '@formily/antd'; + +import { Space, Card, Modal, Spin } from 'antd'; +import { ArrayTable } from '../../schemas/array-table'; +import { Action } from '../../schemas/action'; +import { AddNew } from '../../schemas/add-new'; +import { Calendar } from '../../schemas/calendar'; +import { Cascader } from '../../schemas/cascader'; +import { Checkbox } from '../../schemas/checkbox'; +import { ColorSelect } from '../../schemas/color-select'; +import { + DatabaseField, + DatabaseCollection, +} from '../../schemas/database-field'; +import { DatePicker } from '../../schemas/date-picker'; +import { Filter } from '../../schemas/filter'; +import { Form } from '../../schemas/form'; +import { ActionLogs } from '../../schemas/action-logs'; +import { Grid } from '../../schemas/grid'; +import { IconPicker } from '../../schemas/icon-picker'; +import { Input } from '../../schemas/input'; +import { InputNumber } from '../../schemas/input-number'; +import { Markdown } from '../../schemas/markdown'; +import { Kanban } from '../../schemas/kanban'; +import { Menu } from '../../schemas/menu'; +import { Password } from '../../schemas/password'; +import { Radio } from '../../schemas/radio'; +import { Select } from '../../schemas/select'; +import { + CollectionFieldContext, + Table, + TableRowContext, +} from '../../schemas/table'; +import { Tabs } from '../../schemas/tabs'; +import { TimePicker } from '../../schemas/time-picker'; +import { Upload } from '../../schemas/upload'; +import { FormItem } from '../../schemas/form-item'; +import { BlockItem } from '../../schemas/block-item'; +import { CardItem } from '../../schemas/card-item'; +import { DragAndDrop } from '../../schemas/drag-and-drop'; +import { TreeSelect } from '../../schemas/tree-select'; +import { Page } from '../../schemas/page'; +import { Chart } from '../../schemas/chart'; +import { useDesignableSwitchContext } from '../../constate/DesignableSwitch'; +import { action } from '@formily/reactive'; +import { ISchema, FormilyISchema } from '../../schemas'; +import { Resource } from '../../resource'; +import { useRequest } from 'ahooks'; +import { CascaderOptionType } from 'antd/lib/cascader'; +import { + useClient, + useCollectionContext, + useResourceRequest, +} from '../../constate'; + +export const BlockContext = createContext({ dragRef: null }); + +const Div = (props) =>
; + +interface DesignableContextProps { + schema?: Schema; + refresh?: any; +} + +export const useAsyncDataSource = (service: any) => (field: any) => { + field.loading = true; + const disableAsyncDataSource = field.componentProps.disableAsyncDataSource; + if (disableAsyncDataSource) { + return; + } + service(field).then( + action.bound((data: any) => { + field.dataSource = data; + field.loading = false; + }), + ); +}; + +export const loadChinaRegionDataSource = function () { + const resource = useResourceRequest('china_regions'); + return async (field: ArrayField) => { + if (field.readPretty) { + return []; + } + const maxLevel = field.componentProps.maxLevel || 3; + const { data } = await resource.list({ + perPage: -1, + filter: { + level: 1, + }, + }); + console.log('loadChinaRegions', data, field.value); + return ( + data?.map((item) => { + if (maxLevel !== 1) { + item.isLeaf = false; + } + return item; + }) || [] + ); + }; +}; + +export const loadChinaRegionData = function () { + const resource = useResourceRequest('china_regions'); + return (selectedOptions: CascaderOptionType[], field: ArrayField) => { + const maxLevel = field.componentProps.maxLevel || 3; + const targetOption = selectedOptions[selectedOptions.length - 1]; + targetOption.loading = true; + resource + .list({ + perPage: -1, + filter: { + parent_code: targetOption['code'], + }, + }) + .then((data) => { + targetOption.loading = false; + targetOption.children = + data?.data?.map((item) => { + if (maxLevel > item.level) { + item.isLeaf = false; + } + return item; + }) || []; + field.dataSource = [...field.dataSource]; + }); + }; +}; + +const useChinaRegionFieldValue = (field: ArrayField) => { + if (field.readPretty) { + field.value = field?.value?.sort((a, b) => a.level - b.level); + } + console.log('useChinaRegionFieldValue', field); +}; + +const useAssociationResource = (options) => { + const { schema } = useDesignable(); + const collectionField = useContext(CollectionFieldContext); + const { collection } = useCollectionContext(); + const ctx = useContext(TableRowContext); + const associatedKey = ctx?.record?.id; + console.log( + 'useAssociationResource', + collection, + collectionField, + schema['x-component-props'], + ); + const { associatedName, resourceName } = schema['x-component-props'] || {}; + const resource = useResourceRequest({ + associatedName, + resourceName, + associatedKey, + }); + const service = useRequest((params) => resource.list(params), { + manual: schema['x-component'] === 'Form', + formatResult: (data) => data?.data?.[0] || {}, + onSuccess: options?.onSuccess, + }); + return { resource, service, initialValues: service.data, ...service }; +}; + +export const SchemaField = createSchemaField({ + scope: { + Table, + Calendar, + Kanban, + useAsyncDataSource, + useClient, + useResourceRequest, + ChinaRegion: { + useFieldValue: useChinaRegionFieldValue, + loadData: loadChinaRegionData, + loadDataSource: loadChinaRegionDataSource, + }, + Select, + Association: { + useResource: useAssociationResource, + }, + }, + components: { + Card, + Div, + Space, + Page, + Chart, + + ArrayItems, + ArrayCollapse, + ArrayTable, + FormLayout, + TreeSelect, + FormilyFormItem, + + DragAndDrop, + + BlockItem, + CardItem, + FormItem, + + Action, + AddNew, + Calendar, + Cascader, + Checkbox, + ColorSelect, + DatabaseField, + DatabaseCollection, + DatePicker, + Filter, + Form, + Grid, + IconPicker, + Input, + InputNumber, + Kanban, + Markdown, + Menu, + Password, + Radio, + Select, + Table, + Tabs, + TimePicker, + Upload, + + ActionLogs, + }, +}); + +export const DesignableContext = createContext({}); + +export function useSchema(path?: any) { + const { schema, refresh } = useContext(DesignableContext); + return { schema, refresh }; +} + +export function pathToArray(path): string[] { + if (Array.isArray(path)) { + return [...path]; + } + + if (typeof path === 'string') { + return path.split('.'); + } +} + +export function findPropertyByPath(schema: Schema, path?: any): Schema { + if (!path) { + return schema; + } + const arr = pathToArray(path); + let property = schema; + while (arr.length) { + const name = arr.shift(); + if (!property.properties) { + console.warn('property does not exist.'); + return null; + } + property = property.properties[name]; + if (!property) { + console.warn('property does not exist.'); + return null; + } + } + return property; +} + +export function addPropertyBefore( + target: Schema, + data: ISchema | FormilyISchema, +) { + Object.keys(target.parent.properties).forEach((name) => { + if (name === target.name) { + target.parent.addProperty(data.name, data); + } + const property = target.parent.properties[name]; + property.parent.removeProperty(property.name); + target.parent.addProperty(property.name, property.toJSON()); + }); +} + +export function addPropertyAfter( + target: Schema, + data: ISchema | FormilyISchema, +) { + Object.keys(target.parent.properties).forEach((name) => { + const property = target.parent.properties[name]; + property.parent.removeProperty(property.name); + target.parent.addProperty(property.name, property.toJSON()); + if (name === target.name) { + target.parent.addProperty(data.name, data); + } + }); +} + +function setKeys(schema: ISchema | FormilyISchema, parentKey = null) { + if (!schema['key']) { + schema['key'] = uid(); + } + if (parentKey) { + schema['parentKey'] = parentKey; + } + Object.keys(schema.properties || {}).forEach((name) => { + setKeys(schema.properties[name], schema['key']); + }); +} + +export function useSchemaComponent(component: string) { + if (!component) { + return null; + } + const options = useContext(SchemaOptionsContext); + return get(options.components, component); +} + +export function useDesignable(path?: any) { + let { designable = true } = useDesignableSwitchContext(); + const { schema = new Schema({}), refresh } = useContext(DesignableContext); + const schemaPath = path || useSchemaPath(); + const fieldSchema = useFieldSchema(); + let current; + let currentSchema = (current = + findPropertyByPath(schema, schemaPath) || ({} as Schema)); + if (!currentSchema) { + currentSchema = fieldSchema; + } + if (Object.keys(currentSchema).length === 0) { + currentSchema = fieldSchema; + } + // console.log('useDesignable', { schema, schemaPath, currentSchema }); + const options = useContext(SchemaOptionsContext); + let DesignableBar = get( + options.components, + currentSchema['x-designable-bar'], + ); + if (!designable) { + DesignableBar = () => null; + } + if (!DesignableBar) { + DesignableBar = () => null; + } + return { + designable, + root: schema, + currentSchema: current, + DesignableBar, + schema: currentSchema, + refresh, + prepend: (property: ISchema | FormilyISchema, targetPath?: any): Schema => { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + if (target['key']) { + property['parentKey'] = target['key']; + setKeys(property); + property['__prepend__'] = true; + // if (!property['key']) { + // property['key'] = uid(); + // } + } + const properties = {}; + properties[property.name] = property; + Object.keys(target.properties).forEach((name, index) => { + const current = target.properties[name]; + current.parent.removeProperty(current.name); + properties[current.name] = current.toJSON(); + }); + // console.log({ properties }, target.properties); + target.setProperties(properties); + refresh(); + return target.properties[property.name]; + }, + appendChild: ( + property: ISchema | FormilyISchema, + targetPath?: any, + ): Schema => { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + if (target['key']) { + property['parentKey'] = target['key']; + // if (!property['key']) { + // property['key'] = uid(); + // } + setKeys(property); + } + target.addProperty(property.name, property); + // BUG: 空 properties 时,addProperty 无反应。 + const tmp = { name: uid() }; + addPropertyAfter(target, tmp); + target.parent.removeProperty(tmp.name); + refresh(); + return target.properties[property.name]; + }, + insertAfter: ( + property: ISchema | FormilyISchema, + targetPath?: any, + ): Schema => { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + console.log('target.parentKey', target); + if (target['parentKey']) { + property['parentKey'] = target['parentKey']; + setKeys(property); + property['__insertAfter__'] = target['key']; + } + addPropertyAfter(target, property); + refresh(); + return target.parent.properties[property.name]; + }, + insertBefore(property: ISchema | FormilyISchema, targetPath?: any): Schema { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + if (target['parentKey']) { + property['parentKey'] = target['parentKey']; + setKeys(property); + property['__insertBefore__'] = target['key']; + } + addPropertyBefore(target, property); + refresh(); + return target.parent.properties[property.name]; + }, + deepRemoveIfEmpty(targetPath) { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + const removed = []; + const remove = (s: Schema) => { + if (!s.parent) { + return; + } + s.parent.removeProperty(s.name); + removed.push(s); + if (s['x-component'] === 'Grid.Row') { + return; + } + if (Object.keys(s.parent.properties || {}).length === 0) { + remove(s.parent); + } + }; + console.log({ removed }); + if (Object.keys(target.properties || {}).length === 0) { + remove(target); + } + refresh(); + return removed; + }, + deepRemove(targetPath?: any) { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + const removed = []; + const remove = (s: Schema) => { + if (!s.parent) { + return; + } + s.parent.removeProperty(s.name); + removed.push(s); + if (s['x-component'] === 'Grid.Row') { + return; + } + if (Object.keys(s.parent.properties || {}).length === 0) { + remove(s.parent); + } + }; + console.log({ removed }); + remove(target); + refresh(); + return removed; + }, + remove(targetPath?: any) { + let target = currentSchema; + if (targetPath) { + target = findPropertyByPath(schema, targetPath); + } + if (!target) { + console.error('target schema does not exist.'); + return; + } + target.parent.removeProperty(target.name); + refresh(); + return target; + }, + moveToBefore(path1, path2) { + const source = findPropertyByPath(schema, path1); + const property = source.toJSON() as ISchema; + const target = findPropertyByPath(schema, path2); + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + if (target['parentKey']) { + property['parentKey'] = target['parentKey']; + setKeys(property); + property['__insertBefore__'] = target['key']; + } + addPropertyBefore(target, property); + refresh(); + return target.parent.properties[property.name]; + }, + moveToAfter(path1, path2) { + const source = findPropertyByPath(schema, path1); + const property = source.toJSON() as ISchema; + const target = findPropertyByPath(schema, path2); + if (!target) { + console.error('target schema does not exist.'); + return; + } + if (!property.name) { + property.name = uid(); + } + if (target['parentKey']) { + property['parentKey'] = target['parentKey']; + setKeys(property); + property['__insertAfter__'] = target['key']; + } + addPropertyAfter(target, property); + + refresh(); + return target.parent.properties[property.name]; + }, + }; +} + +export function getSchemaPath(schema: Schema) { + const path = schema['x-path'] || [schema.name]; + let parent = schema.parent; + while (parent) { + // if (!parent.name) { + // break; + // } + if (parent['x-path']) { + path.unshift(...parent['x-path']); + } else if (parent.name) { + path.unshift(parent.name); + } + parent = parent.parent; + } + // console.log('getSchemaPath', path, schema); + return [...path]; +} + +export function useSchemaPath() { + const schema = useFieldSchema(); + const path = getSchemaPath(schema); + return [...path]; +} + +const FormValues = () => { + const form = useForm(); + const [visible, setVisible] = useState(false); + return ( + <> + setVisible(true)} /> + setVisible(false)} + onCancel={() => setVisible(false)} + visible={visible} + > + + {/*
{JSON.stringify(schema.toJSON(), null, 2)}
*/} +
+ + ); +}; + +const CodePreview = ({ schema }) => { + const [visible, setVisible] = useState(false); + return ( + <> + setVisible(true)} + /> + setVisible(false)} + onCancel={() => setVisible(false)} + visible={visible} + > + + {/*
{JSON.stringify(schema.toJSON(), null, 2)}
*/} +
+ + ); +}; + +export interface SchemaRendererProps { + schema: Schema | ISchema | FormilyISchema; + form?: any; + render?: any; + components?: any; + scope?: any; + debug?: boolean; + onlyRenderProperties?: boolean; + onRefresh?: any; + [key: string]: any; +} + +export const SchemaRenderer = (props: SchemaRendererProps) => { + const { designable = true } = useDesignableSwitchContext(); + const [, refresh] = useState(uid()); + const form = useMemo(() => props.form || createForm(), []); + const schema = useMemo(() => { + if (Schema.isSchemaInstance(props.schema)) { + return schema; + } + let s = props.schema; + if (props.onlyRenderProperties) { + s = { + type: 'object', + properties: s.properties, + }; + } else if (s.name) { + s = { + type: 'object', + properties: { + [s.name]: s, + }, + }; + } + return new Schema(s); + }, []); + // useEffect(() => { + // refresh(uid()); + // }, [designable]); + console.log({ designable }, 'designable'); + const defaultRender = ({ schema }) => ( + + + {props.debug && } + {props.debug && } + + ); + return ( + { + props.onRefresh && props.onRefresh(schema); + refresh(uid()); + }, + }} + > + + {props.render || defaultRender} + + + ); +}; diff --git a/packages/client/src/constate/Client.tsx b/packages/client/src/constate/Client.tsx new file mode 100644 index 0000000000000000000000000000000000000000..26f1c6b7156faae06c7c91ef0dfa4d595f88a576 --- /dev/null +++ b/packages/client/src/constate/Client.tsx @@ -0,0 +1,111 @@ +import React, { createContext, useContext } from 'react'; +import { UseRequestProvider } from 'ahooks'; +import { ISchema } from '../schemas'; +import { Schema, useField } from '@formily/react'; +import { Resource } from '../resource'; +import { ClientSDK } from '../ClientSDK'; +import { extend } from 'umi-request'; + +const request = extend({ + prefix: process.env.API_URL, + timeout: 30000, +}); + +request.use(async (ctx, next) => { + const { headers } = ctx.req.options as any; + const token = localStorage.getItem('NOCOBASE_TOKEN'); + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + await next(); +}); + +const client = new ClientSDK({ + request, +}); + +const ClientContext = createContext(client); + +export function ClientProvider(props) { + const { client } = props; + return ( + + client.request(service), + }} + > + {props.children} + + + ); +} + +export function useResourceRequest(options, ResourceClass?: any) { + const Cls = ResourceClass || Resource; + const { request } = useClient(); + return Cls.make(options, request); +} + +export function useClient() { + const client = useContext(ClientContext); + const request = client.options.request; + + return { + client, + request, + async createSchema(schema: ISchema) { + if (!schema) { + return; + } + if (!schema['key']) { + return; + } + return await request('ui_schemas:create', { + method: 'post', + data: schema.toJSON(), + }); + }, + + async collectionMoveToAfter(source, target) { + if (source && target) { + return request(`collections:sort/${source}`, { + method: 'post', + data: { + field: 'sort', + target: { + name: target, + }, + }, + }); + } + }, + + async updateSchema(schema: ISchema) { + if (!schema) { + return; + } + if (!schema['key']) { + return; + } + return await request(`ui_schemas:update/${schema.key}`, { + method: 'post', + data: Schema.isSchemaInstance(schema) ? schema.toJSON() : schema, + }); + }, + + async removeSchema(schema: ISchema) { + if (!schema['key']) { + return; + } + await request('ui_schemas:destroy', { + method: 'post', + params: { + filter: { + key: schema['key'], + }, + }, + }); + }, + }; +} diff --git a/packages/client/src/constate/Collections.ts b/packages/client/src/constate/Collections.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f7634fe4f6067eceb2ce84f83bb8815a3b5bd2f --- /dev/null +++ b/packages/client/src/constate/Collections.ts @@ -0,0 +1,69 @@ +import { useRequest } from 'ahooks'; +import constate from 'constate'; + +const [CollectionsProvider, useCollectionsContext] = constate( + () => { + const result = useRequest('collections:findAll', { + formatResult: (result) => result?.data, + }); + return { + ...result, + collections: result.data || [], + findCollection(name) { + return result?.data?.find((item) => item.name === name); + }, + async loadCollections(field: any) { + return result?.data?.map((item: any) => ({ + label: item.title, + value: item.name, + })); + }, + getFieldsByCollection(collectionName) { + const collection = result?.data?.find( + (item) => item.name === collectionName, + ); + return collection?.generalFields; + }, + }; + }, +); + +export { CollectionsProvider, useCollectionsContext }; + +export interface CollectionProviderProps { + collectionName?: string; +} + +export function useCollection(props: CollectionProviderProps) { + const { collectionName } = props; + const { collections = [], loading, refresh } = useCollectionsContext(); + let collection: any; + let fields = []; + if (collectionName) { + collection = collections.find((item) => item.name === collectionName); + } + if (collection) { + fields = collection?.generalFields || []; + } + let sortableField = collection?.sortable; + if (collection?.sortable && typeof collection?.sortable === 'object') { + sortableField = collection?.sortable?.name; + } + return { + sortableField, + collection, + fields, + loading, + refresh, + getField(name: string) { + if (!name) { + return null; + } + return fields.find((item) => item.name === name); + }, + }; +} + +const [CollectionProvider, useCollectionContext] = constate(useCollection); + +export { CollectionProvider, useCollectionContext }; diff --git a/packages/client/src/constate/DesignableSwitch.ts b/packages/client/src/constate/DesignableSwitch.ts new file mode 100644 index 0000000000000000000000000000000000000000..a541586790caac299c04adb40adc0705eec48158 --- /dev/null +++ b/packages/client/src/constate/DesignableSwitch.ts @@ -0,0 +1,15 @@ +import { useCookieState } from 'ahooks'; +import constate from 'constate'; + +const [DesignableSwitchProvider, useDesignableSwitchContext] = constate(() => { + const [active, setActive] = useCookieState('useCookieDesignable'); + + return { + designable: active === 'true', + setDesignable(value) { + setActive(value ? 'true' : 'false'); + }, + }; +}); + +export { DesignableSwitchProvider, useDesignableSwitchContext }; diff --git a/packages/client/src/constate/DisplayedMap.ts b/packages/client/src/constate/DisplayedMap.ts new file mode 100644 index 0000000000000000000000000000000000000000..5eef73158bc12abadb11b5e2214b954155b530f6 --- /dev/null +++ b/packages/client/src/constate/DisplayedMap.ts @@ -0,0 +1,9 @@ +import { useMap } from 'ahooks'; +import constate from 'constate'; + +const [DisplayedMapProvider, useDisplayedMapContext] = constate(() => { + const [map, { set, remove, get }] = useMap([]); + return { map, set, remove, get, has: (key: any) => !!get(key) }; +}); + +export { DisplayedMapProvider, useDisplayedMapContext }; diff --git a/packages/client/src/constate/PageTitle.ts b/packages/client/src/constate/PageTitle.ts new file mode 100644 index 0000000000000000000000000000000000000000..99b4910f6f45254876eb7f518859d05f0ddbab38 --- /dev/null +++ b/packages/client/src/constate/PageTitle.ts @@ -0,0 +1,18 @@ +import constate from 'constate'; +import { useState } from 'react'; +import { useSystemSettings } from '../components/admin-layout/SiteTitle'; + +export interface PageTitleProviderProps { + defaultPageTitle?: string; +} + +const [PageTitleProvider, usePageTitleContext] = constate( + ({ defaultPageTitle }: PageTitleProviderProps) => { + const { title } = useSystemSettings(); + const [pageTitle, setPageTitle] = useState(defaultPageTitle); + const documentTitle = title ? `${pageTitle} - ${title}` : pageTitle; + return { documentTitle, pageTitle, setPageTitle }; + }, +); + +export { PageTitleProvider, usePageTitleContext }; diff --git a/packages/client/src/constate/index.tsx b/packages/client/src/constate/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..08bb030486c84149201e48c62c6511405f4338ab --- /dev/null +++ b/packages/client/src/constate/index.tsx @@ -0,0 +1,5 @@ +export * from './Collections'; +export * from './DesignableSwitch'; +export * from './DisplayedMap'; +export * from './PageTitle'; +export * from './Client'; diff --git a/packages/client/src/context.ts b/packages/client/src/context.ts new file mode 100644 index 0000000000000000000000000000000000000000..325f6aab977db1b0a9a9ae0a20557f4d3ed31102 --- /dev/null +++ b/packages/client/src/context.ts @@ -0,0 +1,5 @@ +import { createContext } from 'react'; +import { Schema } from '@formily/react'; + +export const VisibleContext = createContext([]); +export const BlockSchemaContext = createContext(null); diff --git a/packages/client/src/demo.md b/packages/client/src/demo.md new file mode 100644 index 0000000000000000000000000000000000000000..3ef08f2d950dcd4672a4084a641bdc5edd10e450 --- /dev/null +++ b/packages/client/src/demo.md @@ -0,0 +1,14 @@ +--- +title: 全站演示 +nav: + title: 组件 + path: /client +toc: menu +group: + order: 0 + title: 概念 + path: /client +--- + + + diff --git a/packages/client/src/demos/demo1.tsx b/packages/client/src/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..88574aaa2bd644b852b48232e90c579a27323672 --- /dev/null +++ b/packages/client/src/demos/demo1.tsx @@ -0,0 +1,72 @@ +import { useRequest } from 'ahooks'; +import { Spin } from 'antd'; +import React, { useMemo } from 'react'; +import { MemoryRouter as Router } from 'react-router-dom'; +import { + createRouteSwitch, + RouteRedirectProps, + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + ConfigProvider, + ClientSDK, +} from '../'; +import { UseRequestProvider } from 'ahooks'; +import { extend } from 'umi-request'; + +const request = extend({ + prefix: process.env.API_URL, + timeout: 30000, +}); + +request.use(async (ctx, next) => { + const { headers } = ctx.req.options as any; + const token = localStorage.getItem('NOCOBASE_TOKEN'); + if (token) { + headers['Authorization'] = `Bearer ${token}`; + headers['X-Hostname'] = process.env.API_HOSTNAME; + } + await next(); +}); + +const client = new ClientSDK({ + request, +}); + +console.log('process.env.API_URL', process.env.API_URL); + +// console.log = () => {} + +const RouteSwitch = createRouteSwitch({ + components: { + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + }, +}); + +const App = () => { + const { data, loading } = useRequest('routes:getAccessible', { + formatResult: (result) => result?.data, + }); + + if (loading) { + return ; + } + + return ( +
+ + + +
+ ); +}; + +export default () => { + return ( + + + + ); +}; diff --git a/packages/client/src/hooks/useResource.ts b/packages/client/src/hooks/useResource.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7fe437a773d4ab61734b42db857ddfb6448f62c --- /dev/null +++ b/packages/client/src/hooks/useResource.ts @@ -0,0 +1,17 @@ +import { useEffect } from 'react'; +import { useCollectionContext, useResourceRequest } from '../constate'; +import { Resource } from '../resource'; + +export const useResource = (options: any = {}) => { + const { collection } = useCollectionContext(); + const resource = useResourceRequest(collection?.name); + useEffect(() => { + options.onSuccess && options.onSuccess({}); + }, []); + return { + initialValues: {}, + loading: false, + async run() {}, + resource, + }; +}; diff --git a/packages/client/src/index.md b/packages/client/src/index.md new file mode 100644 index 0000000000000000000000000000000000000000..e9f1065f6326630fe1554894b3c1041204b86b74 --- /dev/null +++ b/packages/client/src/index.md @@ -0,0 +1,14 @@ +--- +title: 介绍 +nav: + title: 组件 + path: /client +toc: menu +group: + order: 0 + title: 概念 + path: /client +--- + +# 介绍 + diff --git a/packages/client/src/index.tsx b/packages/client/src/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d737261182482910ca8dc29c2b79d67bb097085f --- /dev/null +++ b/packages/client/src/index.tsx @@ -0,0 +1,8 @@ +export * from './components/router-config'; +export * from './components/admin-layout'; +export * from './components/auth-layout'; +export * from './components/route-schema-renderer'; +export * from './schemas'; +export * from './constate'; +export * from './ClientSDK'; +export * from './ConfigProvider'; diff --git a/packages/client/src/locale/en_US.ts b/packages/client/src/locale/en_US.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff8b4c56321a3362fc00224b01800f62466f9a1f --- /dev/null +++ b/packages/client/src/locale/en_US.ts @@ -0,0 +1 @@ +export default {}; diff --git a/packages/client/src/locale/zh_CN.ts b/packages/client/src/locale/zh_CN.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff8b4c56321a3362fc00224b01800f62466f9a1f --- /dev/null +++ b/packages/client/src/locale/zh_CN.ts @@ -0,0 +1 @@ +export default {}; diff --git a/packages/client/src/resource.ts b/packages/client/src/resource.ts new file mode 100644 index 0000000000000000000000000000000000000000..8acd5b981c242da45796b162b97a4d6868eb8e54 --- /dev/null +++ b/packages/client/src/resource.ts @@ -0,0 +1,198 @@ +import { RequestMethod } from 'umi-request'; +import { request as req } from './schemas'; + +export interface ResourceOptions { + resourceName: string; + associatedKey?: any; + associatedName?: string; + resourceKey?: any; +} + +export interface GetOptions { + resourceKey?: any; + defaultAppends?: any[]; + appends?: string[]; +} + +export interface SaveOptions { + resourceKey?: any; +} + +export interface ListOptions { + defaultFilter?: any; + filter?: any; + pageSize?: number; + defaultAppends?: any[]; + appends?: string[]; + perPage?: number; +} + +export class Resource { + public options: ResourceOptions; + public request: RequestMethod; + + constructor(options: string | ResourceOptions, request?: any) { + if (typeof options === 'string') { + this.options = { resourceName: options }; + } else { + this.options = options; + } + this.request = request || req; + } + + sort(options) { + const { resourceName } = this.options; + const { resourceKey, target, field = 'sort' } = options; + return this.request(`${resourceName}:sort/${resourceKey}`, { + method: 'post', + data: { + target, + field, + }, + }); + } + + list(options: ListOptions = {}) { + const { + defaultAppends = [], + appends = [], + defaultFilter, + filter, + pageSize, + ...others + } = options; + const { associatedKey, associatedName, resourceName } = this.options; + let url = `${resourceName}:list`; + if (associatedName && associatedKey) { + url = `${associatedName}/${associatedKey}/${resourceName}:list`; + } + return this.request(url, { + method: 'get', + params: { + filter: decodeURIComponent( + JSON.stringify({ and: [defaultFilter, filter].filter(Boolean) }), + ), + 'fields[appends]': defaultAppends.concat(appends).join(','), + perPage: pageSize, + ...others, + }, + }); + } + + get(options: GetOptions = {}) { + const resourceKey = options.resourceKey || this.options.resourceKey; + const { resourceName } = this.options; + if (!resourceKey) { + return Promise.resolve({ data: {} }); + } + const { defaultAppends = [], appends = [], ...others } = options; + return this.request(`${resourceName}:get/${resourceKey}`, { + params: { + ...others, + 'fields[appends]': defaultAppends.concat(appends).join(','), + }, + }); + } + + create(values: any) { + const { associatedKey, associatedName, resourceName } = this.options; + let url = `${resourceName}:create`; + if (associatedKey && associatedName) { + url = `${associatedName}/${associatedKey}/${url}`; + } + return this.request(url, { + method: 'post', + data: values, + }); + } + + save(values: any, options: SaveOptions = {}) { + const resourceKey = options.resourceKey || this.options.resourceKey; + const { associatedKey, associatedName, resourceName } = this.options; + let url = `${resourceName}:${ + resourceKey ? `update/${resourceKey}` : 'create' + }`; + if (associatedKey && associatedName) { + url = `${associatedName}/${associatedKey}/${url}`; + } + return this.request(url, { + method: 'post', + data: values, + }); + } + + export(options: any) { + const { resourceName } = this.options; + const { columns, ...others } = options; + const url = `${resourceName}:export`; + return this.request(url, { + method: 'post', + params: { + columns: JSON.stringify(columns), + ...others, + }, + parseResponse: false, + responseType: 'blob', + }).then(async (response: Response) => { + const filename = decodeURI( + response.headers + .get('Content-Disposition') + .replace('attachment; filename=', ''), + ); + // ReadableStream + let res = new Response(response.body); + let blob = await res.blob(); + let url = URL.createObjectURL(blob); + let a = document.createElement('a'); + a.style.display = 'none'; + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + // cleanup + URL.revokeObjectURL(url); + document.body.removeChild(a); + a = null; + blob = null; + url = null; + res = null; + }); + } + + destroy(filter: any) { + const { resourceName } = this.options; + const url = `${resourceName}:destroy`; + return this.request(url, { + method: 'get', + params: { + filter, + }, + }); + } + + toggle(options?: any) { + const { associatedKey, associatedName, resourceName } = this.options; + const { resourceKey } = options; + let url = `${associatedName}/${associatedKey}/${resourceName}:toggle/${resourceKey}`; + return this.request(url, { + method: 'post', + }); + } + + static make( + options: null | string | Resource | ResourceOptions, + request?: any, + ): Resource | null { + if (typeof options === 'string') { + return new this({ resourceName: options }, request); + } + if (options instanceof Resource) { + return options; + } + if (typeof options === 'object' && options.resourceName) { + return new this(options, request); + } + console.warn('resource 初始化参数错误'); + return null; + } +} diff --git a/packages/client/src/schemas/action-logs/index.tsx b/packages/client/src/schemas/action-logs/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..26daf9227387c1382de123df69417d4c42801048 --- /dev/null +++ b/packages/client/src/schemas/action-logs/index.tsx @@ -0,0 +1,55 @@ +import { Field } from '@formily/core'; +import { + ISchema, + observer, + RecursionField, + Schema, + useField, +} from '@formily/react'; +import React from 'react'; +import { SchemaRenderer } from '../../components/schema-renderer'; +import ArrayTable from '../array-table'; + +export const ActionLogs = () => null; + +ActionLogs.Field = observer((props: any) => { + const { value } = props; + return
{value?.uiSchema?.title || value?.name}
; +}); + +ActionLogs.FieldValue = observer((props: any) => { + const field = useField(); + const array = ArrayTable.useArray(); + const index = ArrayTable.useIndex(); + const collectionField = array.field.value[index]?.field; + console.log('ffffff', collectionField?.uiSchema, field.value); + + if (!collectionField.uiSchema) { + if (!field.value) { + return
; + } + if (typeof field.value === 'boolean') { + return
{field.value ? 'true' : 'false'}
; + } + if (typeof field.value === 'string' || typeof field.value === 'number') { + return
{field.value}
; + } + return
{JSON.stringify(field.value, null, 2)}
; + } + + return ( + + ); +}); diff --git a/packages/client/src/schemas/action/ActionBar.tsx b/packages/client/src/schemas/action/ActionBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a4e64c32317776b71a18f00bc7ff13ac9e3b8877 --- /dev/null +++ b/packages/client/src/schemas/action/ActionBar.tsx @@ -0,0 +1,274 @@ +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { observer, RecursionField, Schema } from '@formily/react'; +import React, { useState } from 'react'; +import { ISchema } from '..'; +import { + findPropertyByPath, + getSchemaPath, + useDesignable, +} from '../../components/schema-renderer'; +import { DisplayedMapProvider, useDisplayedMapContext } from '../../constate'; +import cls from 'classnames'; +import { Button, Dropdown, Menu, Space } from 'antd'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { uid } from '@formily/shared'; +import { PlusOutlined } from '@ant-design/icons'; +import { Droppable, SortableItem } from '../../components/Sortable'; +import { useClient } from '../../constate'; + +export const ActionBar = observer((props: any) => { + const { align = 'top' } = props; + // const { schema, designable } = useDesignable(); + const { root, schema, insertAfter, remove, appendChild } = useDesignable(); + const moveToAfter = (path1, path2, extra = {}) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter( + { + ...data.toJSON(), + ...extra, + }, + path2, + ); + }; + const { updateSchema } = useClient(); + + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + { + setDragOverlayContent(event.active.data?.current?.title || ''); + // const previewRef = event.active.data?.current?.previewRef; + // if (previewRef) { + // setDragOverlayContent(previewRef?.current?.innerHTML); + // } else { + // setDragOverlayContent(''); + // } + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const align = event.over?.data?.current?.align; + const draggable = event.over?.data?.current?.draggable; + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + if (!draggable) { + console.log('alignalignalignalign', align); + const p = findPropertyByPath(root, path1); + if (!p) { + return; + } + remove(path1); + const data = appendChild( + { + ...p.toJSON(), + 'x-align': align, + }, + path2, + ); + await updateSchema(data); + } else { + const data = moveToAfter(path1, path2, { + 'x-align': align, + }); + await updateSchema(data); + } + }} + > + + {dragOverlayContent} + {/*
*/} +
+ +
+
+ +
+
+ +
+ +
+
+
+ ); +}); + +function generateActionSchema(type) { + const actions: { [key: string]: ISchema } = { + update: { + type: 'void', + title: '编辑', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'update', + }, + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + }, + 'x-action-type': 'update', + 'x-designable-bar': 'Action.DesignableBar', + properties: { + modal: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Table.useResource }}', + useValues: '{{ Table.useTableRowRecord }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + destroy: { + type: 'void', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-action-type': 'destroy', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + }; + return actions[type]; +} + +function AddActionButton() { + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { appendChild, remove } = useDesignable(); + const { schema, designable } = useDesignable(); + const { createSchema, removeSchema } = useClient(); + if (!designable) { + return null; + } + return ( + + + {[ + { title: '编辑', name: 'update' }, + { title: '删除', name: 'destroy' }, + ].map((item) => ( + { + if (!checked) { + const s = displayed.get(item.name) as Schema; + const path = getSchemaPath(s); + displayed.remove(item.name); + const removed = remove(path); + await removeSchema(removed); + } else { + const s = generateActionSchema(item.name); + const data = appendChild(s); + await createSchema(data); + } + }} + /> + ))} + + + + 函数操作 + 弹窗表单 + 复杂弹窗 + + + } + > + + + ); +} + +function Actions(props: any) { + const { align = 'left' } = props; + const { schema, designable } = useDesignable(); + return ( + + + {schema.mapProperties((s) => { + const currentAlign = s['x-align'] || 'left'; + if (currentAlign !== align) { + return null; + } + return ( + + + + ); + })} + + + ); +} diff --git a/packages/client/src/schemas/action/index.md b/packages/client/src/schemas/action/index.md new file mode 100644 index 0000000000000000000000000000000000000000..272b19acbe88cbd10e525af088d7eec7568bcf41 --- /dev/null +++ b/packages/client/src/schemas/action/index.md @@ -0,0 +1,483 @@ +--- +nav: + path: /components +group: + title: Schema Components + path: /components/schema-components + order: 2 +--- + +# Action - 操作 + +## Node Tree + +
+////////// 单节点 //////////
+
+// 常规按钮操作
+
+// 内链
+
+// 外链
+
+
+////////// 弹出层相关操作 //////////
+
+// 对话框
+
+  
+    // 添加其他节点
+  
+
+
+// 抽屉
+
+  
+    // 添加其他节点
+  
+
+
+// 气泡
+
+  
+    // 添加其他节点
+  
+
+
+// 指定容器
+
+  
+    // 添加其他节点
+  
+
+
+////////// 操作分组 //////////
+
+// 下拉操作
+
+  
+  
+    
+      // 添加其他节点
+    
+  
+
+
+ +## Designable Bar + +- Action.DesignableBar +- Action.Modal.DesignableBar +- Action.Drawer.DesignableBar +- Action.Popover.DesignableBar + +## Examples + +### Action + +```tsx +/** + * title: 按钮操作 + * desc: 可以通过配置 `useAction` 来处理操作逻辑 + */ +import React from 'react'; +// @ts-ignore +import { SchemaRenderer } from '@nocobase/client'; + +function useAction() { + return { + run() { + alert('这是自定义的操作逻辑'); + }, + }; +} + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + useAction: '{{ useAction }}', + tooltip: '提示信息', + confirm: { + title: 'Do you Want to delete these items?', + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Modal + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'ModalForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Drawer + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-component': 'Action.Drawer', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'DrawerForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Dropdown + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'action1', + title: '下拉菜单', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + dropdown1: { + type: 'void', + 'x-component': 'Action.Dropdown', + 'x-component-props': {}, + properties: { + item1: { + type: 'void', + title: `操作1`, + 'x-designable-bar': 'Action.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-designable-bar': 'Input.DesignableBar', + }, + grid: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + item2: { + type: 'void', + title: `操作2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal2: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + } + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Popover + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-component': 'Action.Popover', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'PopoverForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Popover', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Group + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'group1', + 'x-component': 'Action.Group', + properties: { + a1: { + type: 'void', + title: '按钮1', + 'x-component': 'Action', + 'x-component-props': {}, + }, + a2: { + type: 'void', + title: '按钮2', + 'x-component': 'Action', + 'x-component-props': {}, + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Bar + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'actionbar1', + 'x-component': 'Action.Bar', + 'x-designable-bar': 'Action.Bar.DesignableBar', + 'x-component-props': { + }, +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/action/index.tsx b/packages/client/src/schemas/action/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f654589002d52fbbe7ba5b2e47872061fcdb04f2 --- /dev/null +++ b/packages/client/src/schemas/action/index.tsx @@ -0,0 +1,563 @@ +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { + useForm, + FormProvider, + createSchemaField, + observer, + useFieldSchema, + RecursionField, + SchemaOptionsContext, + Schema, + useField, + SchemaExpressionScopeContext, +} from '@formily/react'; +import { + Button, + Dropdown, + Menu, + Popover, + Space, + Drawer, + Modal, + Select, + Tooltip, +} from 'antd'; +import { Link, useHistory, LinkProps, Switch } from 'react-router-dom'; +import { + useDesignable, + useDefaultAction, + updateSchema, + removeSchema, +} from '..'; +import './style.less'; +import { uid } from '@formily/shared'; +import cls from 'classnames'; +import { MenuOutlined } from '@ant-design/icons'; +import { FormDialog, FormLayout } from '@formily/antd'; +import IconPicker from '../../components/icon-picker'; +import { + findPropertyByPath, + getSchemaPath, + SchemaField, + useSchemaComponent, +} from '../../components/schema-renderer'; +import { VisibleContext } from '../../context'; +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { createPortal } from 'react-dom'; +import { ActionBar } from './ActionBar'; +import { DragHandle, SortableItem } from '../../components/Sortable'; +import { useDisplayedMapContext } from '../../constate'; + +export const ButtonComponentContext = createContext(null); + +function getTooltipProps(tooltip) { + if (typeof tooltip === 'string') { + return { title: tooltip }; + } + return tooltip; +} + +export const Action: any = observer((props: any) => { + const { + tooltip, + confirm, + useAction = useDefaultAction, + icon, + ...others + } = props; + const { run } = useAction(); + const field = useField(); + const { schema, DesignableBar } = useDesignable(); + const [visible, setVisible] = useState(false); + const child = Object.values(schema.properties || {}).shift(); + const isDropdownOrPopover = + child && + ['Action.Dropdown', 'Action.Popover'].includes(child['x-component']); + let button = ( + + ); + if (tooltip) { + button = {button}; + } + return ( + + + {!isDropdownOrPopover && button} + + + + ); +}); + +Action.Link = observer((props: any) => { + const { schema } = useDesignable(); + return {schema.title}; +}); + +Action.URL = observer((props: any) => { + const { schema } = useDesignable(); + return ( + + {schema.title} + + ); +}); + +Action.Group = observer((props: any) => { + const { type = 'button' } = props; + const { root, schema, insertAfter, remove } = useDesignable(); + const moveToAfter = (path1, path2) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter(data.toJSON(), path2); + }; + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + { + console.log({ event }); + setDragOverlayContent(event.active.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const data = moveToAfter(path1, path2); + await updateSchema(data); + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} +
+ + {schema.mapProperties((s) => { + return ( + + + + ); + })} + +
+
+ ); +}); + +Action.Modal = observer((props: any) => { + const { + useOkAction = useDefaultAction, + useCancelAction = useDefaultAction, + ...others + } = props; + const { schema } = useDesignable(); + const [visible, setVisible] = useContext(VisibleContext); + const form = useForm(); + const { run: runOk } = useOkAction(); + const { run: runCancel } = useCancelAction(); + const isFormDecorator = schema['x-decorator'] === 'Form'; + const field = useField(); + console.log('Action.Modal.field', schema['x-read-pretty']); + return ( + { + if (isFormDecorator) { + form.clearErrors(); + } + runCancel && (await runCancel()); + setVisible(false); + if (isFormDecorator) { + await form.reset(); + } + }} + > + 取消 + , + , + ] + : null + } + {...others} + onCancel={async () => { + if (isFormDecorator) { + form.clearErrors(); + } + runCancel && (await runCancel()); + setVisible(false); + if (isFormDecorator) { + await form.reset(); + } + }} + visible={visible} + > + {props.children} + + ); +}); + +Action.Drawer = observer((props: any) => { + const { + useOkAction = useDefaultAction, + useCancelAction = useDefaultAction, + ...others + } = props; + const { schema } = useDesignable(); + const [visible, setVisible] = useContext(VisibleContext); + const form = useForm(); + const { run: runOk } = useOkAction(); + const { run: runCancel } = useCancelAction(); + const isFormDecorator = schema['x-decorator'] === 'Form'; + console.log('Action.Modal.field', schema['x-read-pretty']); + return ( + <> + {createPortal( + + + + + ) + } + {...others} + visible={visible} + onClose={async (e) => { + props.onClose && (await props.onClose(e)); + runCancel && (await runCancel()); + setVisible(false); + if (isFormDecorator) { + await form.reset(); + } + }} + > + {props.children} + , + document.body, + )} + + ); +}); + +Action.Dropdown = observer((props: any) => { + const button = useContext(ButtonComponentContext); + const { root, schema, insertAfter, remove } = useDesignable(); + const moveToAfter = (path1, path2) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter(data.toJSON(), path2); + }; + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + { + console.log({ event }); + setDragOverlayContent(event.active.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const data = moveToAfter(path1, path2); + await updateSchema(data); + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} + + + + } + > + {button} + + + ); +}); + +Action.Popover = observer((props) => { + const { schema } = useDesignable(); + const form = useForm(); + const isFormDecorator = schema['x-decorator'] === 'Form'; + const [visible, setVisible] = useContext(VisibleContext); + const button = useContext(ButtonComponentContext); + return ( + + {props.children} + {isFormDecorator && ( +
+ + + + +
+ )} +
+ } + > + {button} + + ); +}); + +Action.DesignableBar = (props: any) => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const isPopup = Object.keys(schema.properties || {}).length > 0; + const displayed = useDisplayedMapContext(); + const field = useField(); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + { + const values = await FormDialog('编辑按钮', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + schema['title'] = values.title; + schema['x-component-props']['icon'] = values.icon; + field.componentProps.icon = values.icon; + field.title = values.title; + updateSchema(schema); + refresh(); + }} + > + 编辑按钮 + + {isPopup && ( + + 在{' '} + {' '} + 内打开 + + )} + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; + +Action.Bar = ActionBar; diff --git a/packages/client/src/schemas/action/index.zh-CN.md b/packages/client/src/schemas/action/index.zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..02d0fa741dfb0abccf03cccf3a4e44c1fe2119c8 --- /dev/null +++ b/packages/client/src/schemas/action/index.zh-CN.md @@ -0,0 +1,483 @@ +--- +nav: + path: /zh-CN/components +group: + title: Schema 组件 + path: /zh-CN/components/schema-components + order: 2 +--- + +# Action - 操作 + +## Node Tree + +
+////////// 单节点 //////////
+
+// 常规按钮操作
+
+// 内链
+
+// 外链
+
+
+////////// 弹出层相关操作 //////////
+
+// 对话框
+
+  
+    // 添加其他节点
+  
+
+
+// 抽屉
+
+  
+    // 添加其他节点
+  
+
+
+// 气泡
+
+  
+    // 添加其他节点
+  
+
+
+// 指定容器
+
+  
+    // 添加其他节点
+  
+
+
+////////// 操作分组 //////////
+
+// 下拉操作
+
+  
+  
+    
+      // 添加其他节点
+    
+  
+
+
+ +## Designable Bar + +- Action.DesignableBar +- Action.Modal.DesignableBar +- Action.Drawer.DesignableBar +- Action.Popover.DesignableBar + +## Examples + +### Action + +```tsx +/** + * title: 按钮操作 + * desc: 可以通过配置 `useAction` 来处理操作逻辑 + */ +import React from 'react'; +// @ts-ignore +import { SchemaRenderer } from '@nocobase/client'; + +function useAction() { + return { + run() { + alert('这是自定义的操作逻辑'); + }, + }; +} + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + useAction: '{{ useAction }}', + tooltip: '提示信息', + confirm: { + title: 'Do you Want to delete these items?', + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Modal + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'ModalForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Drawer + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-component': 'Action.Drawer', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'DrawerForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Dropdown + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'action1', + title: '下拉菜单', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + dropdown1: { + type: 'void', + 'x-component': 'Action.Dropdown', + 'x-component-props': {}, + properties: { + item1: { + type: 'void', + title: `操作1`, + 'x-designable-bar': 'Action.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + title: '输入框', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-designable-bar': 'Input.DesignableBar', + }, + grid: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + item2: { + type: 'void', + title: `操作2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal2: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + } + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Popover + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Space } from 'antd'; + +const schema = { + type: 'void', + name: 'action1', + title: '按钮', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-component': 'Action.Popover', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +const schema2 = { + type: 'void', + name: 'action1', + title: 'PopoverForm', + 'x-component': 'Action', + 'x-designable-bar': 'Action.DesignableBar', + 'x-component-props': { + }, + properties: { + modal1: { + type: 'void', + title: '抽屉标题', + 'x-decorator': 'Form', + 'x-component': 'Action.Popover', + properties: { + input: { + type: 'string', + title: '输入框', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + + ); +}; +``` + +### Action.Group + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'group1', + 'x-component': 'Action.Group', + properties: { + a1: { + type: 'void', + title: '按钮1', + 'x-component': 'Action', + 'x-component-props': {}, + }, + a2: { + type: 'void', + title: '按钮2', + 'x-component': 'Action', + 'x-component-props': {}, + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Action.Bar + +```tsx +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'void', + name: 'actionbar1', + 'x-component': 'Action.Bar', + 'x-designable-bar': 'Action.Bar.DesignableBar', + 'x-component-props': { + }, +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/action/style.less b/packages/client/src/schemas/action/style.less new file mode 100644 index 0000000000000000000000000000000000000000..28956d2775d1a9ee189e22462a849b1e3f37d943 --- /dev/null +++ b/packages/client/src/schemas/action/style.less @@ -0,0 +1,108 @@ +// .designable { +// display: inline-block; +// position: relative; +// &:hover { +// .designable-bar { +// display: block; +// } +// } +// .designable-bar { +// display: none; +// background: #fff; +// z-index: 2; +// position: absolute; +// right: 10px; +// top: 50%; +// transform: translateY(-50%); +// &.active { +// display: block; +// } +// } +// } +.ant-btn { + &:hover { + .designable-bar { + display: block; + } + } + .designable-bar { + display: none; + position: absolute; + top: -1px; + right: -1px; + left: -1px; + bottom: -1px; + border-radius: 2px; + border: 2px solid #1890ff; + &.active { + display: block; + } + .designable-bar-actions { + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + font-size: 10px; + } + } + } +} + +.ant-popover.nb-action-group { + z-index: 1000; + padding-top: 0; + .ant-popover-arrow { + display: none; + } + .ant-popover-inner-content { + padding: 4px 0; + .ant-btn { + display: block; + min-width: 100px; + width: 100%; + border: 0; + border-radius: 0; + text-align: left; + padding: 5px 12px; + color: #000; + &:hover { + background-color: #f5f5f5; + } + &[disabled] { + color: #00000040; + background-color: #fff; + cursor: not-allowed; + } + } + } +} + +.designable-bar-actions { + .ant-btn { + border: 0; + padding: 0; + background: none; + height: auto; + line-height: 1em; + width: auto; + color: #fff; + } +} + +.ant-btn-group-link { + display: inline-block; + .ant-btn { + padding: 0; + height: auto; + .designable-bar { + top: -6px !important; + left: -12px !important; + bottom: -6px !important; + right: -12px !important; + } + } +} diff --git a/packages/client/src/schemas/add-new/chart.ts b/packages/client/src/schemas/add-new/chart.ts new file mode 100644 index 0000000000000000000000000000000000000000..2b055c9696cfab0b1bcd5dd606cef3346ca002ee --- /dev/null +++ b/packages/client/src/schemas/add-new/chart.ts @@ -0,0 +1,150 @@ +export const columnChartConfig = { + data: [ + { + type: '家具家电', + sales: 38, + }, + { + type: '粮油副食', + sales: 52, + }, + { + type: '生鲜水果', + sales: 61, + }, + { + type: '美容洗护', + sales: 145, + }, + { + type: '母婴用品', + sales: 48, + }, + { + type: '进口食品', + sales: 38, + }, + { + type: '食品饮料', + sales: 38, + }, + { + type: '家庭清洁', + sales: 38, + }, + ], + xField: 'type', + yField: 'sales', + label: { + position: 'middle', + style: { + fill: '#FFFFFF', + opacity: 0.6, + }, + }, + xAxis: { + label: { + autoHide: true, + autoRotate: false, + }, + }, + meta: { + type: { alias: '类别' }, + sales: { alias: '销售额' }, + }, +}; + +var data = [ + { + type: '家具家电', + sales: 38, + }, + { + type: '粮油副食', + sales: 52, + }, + { + type: '生鲜水果', + sales: 61, + }, + { + type: '美容洗护', + sales: 145, + }, + { + type: '母婴用品', + sales: 48, + }, + { + type: '进口食品', + sales: 38, + }, + { + type: '食品饮料', + sales: 38, + }, + { + type: '家庭清洁', + sales: 38, + }, +]; +var config = { + data: data, + xField: 'sales', + yField: 'type', + legend: { position: 'top-left' }, + barBackground: { style: { fill: 'rgba(0,0,0,0.1)' } }, + interactions: [ + { + type: 'active-region', + enable: false, + }, + ], +}; + +export const barChartConfig = { + data: [ + { + type: '家具家电', + sales: 38, + }, + { + type: '粮油副食', + sales: 52, + }, + { + type: '生鲜水果', + sales: 61, + }, + { + type: '美容洗护', + sales: 145, + }, + { + type: '母婴用品', + sales: 48, + }, + { + type: '进口食品', + sales: 38, + }, + { + type: '食品饮料', + sales: 38, + }, + { + type: '家庭清洁', + sales: 38, + }, + ], + xField: 'sales', + yField: 'type', + legend: { position: 'top-left' }, + barBackground: { style: { fill: 'rgba(0,0,0,0.1)' } }, + interactions: [ + { + type: 'active-region', + enable: false, + }, + ], +}; diff --git a/packages/client/src/schemas/add-new/index.md b/packages/client/src/schemas/add-new/index.md new file mode 100644 index 0000000000000000000000000000000000000000..7862a6a6732abb3a3c66d923287ce64175d70b2a --- /dev/null +++ b/packages/client/src/schemas/add-new/index.md @@ -0,0 +1,175 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# AddNew - 添加 + +## Node Tree + +
+// 简单场景,只支持上下拖拽布局
+
+  // 常规区块
+  
+  // 或表单控件
+  
+
+
+// 栅格布局,支持行列等复杂的拖拽操作
+
+  
+    
+      // 常规区块
+      
+      // 或表单控件
+      
+    
+  
+
+
+ +## Designable Bar + +暂无 + +## Examples + +### AddNew.BlockItem + +如果需要支持拖拽,需要将 AddNew.BlockItem 组件放于 DragAndDrop 组件中。 + +```tsx +import React from 'react'; +import { ISchema } from '@formily/react'; +import { uid } from '@formily/shared'; +import { SchemaRenderer } from '../'; + +const schema: ISchema = { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'DragAndDrop', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'AddNew.BlockItem', + } + } + }, + }, +}; + +export default () => { + return +} +``` + + +### AddNew.FormItem + +如果需要支持拖拽,需要将 AddNew.FormItem 组件放于 DragAndDrop 组件中。 + +```tsx +import React from 'react'; +import { ISchema } from '@formily/react'; +import { uid } from '@formily/shared'; +import { SchemaRenderer } from '../'; + +const schema: ISchema = { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'DragAndDrop', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'AddNew.FormItem', + } + } + }, + }, +}; + +export default () => { + return +} +``` + +### Grid 布局中的 AddNew.BlockItem + +```tsx +import React from 'react'; +import { ISchema } from '@formily/react'; +import { uid } from '@formily/shared'; +import { SchemaRenderer } from '../'; + +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': 'Grid', + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'AddNew.BlockItem', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return +} +``` + +### Grid 布局的 AddNew.FormItem + +```tsx +import React from 'react'; +import { ISchema } from '@formily/react'; +import { uid } from '@formily/shared'; +import { SchemaRenderer } from '../'; + +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': 'Grid', + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return +} +``` diff --git a/packages/client/src/schemas/add-new/index.tsx b/packages/client/src/schemas/add-new/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..42d4dee8a66c9bea18ed3716ddc8d458812285a2 --- /dev/null +++ b/packages/client/src/schemas/add-new/index.tsx @@ -0,0 +1,1942 @@ +import React, { + Children, + createContext, + useContext, + useEffect, + useState, +} from 'react'; +import { FormDialog, FormLayout } from '@formily/antd'; +import { + connect, + observer, + mapProps, + mapReadPretty, + useField, + useFieldSchema, + RecursionField, + Schema, + useForm, +} from '@formily/react'; +import { + Menu, + MenuProps, + MenuItemProps, + SubMenuProps, + DividerProps, + Dropdown, + Modal, + Button, + Spin, + Switch, + Checkbox, +} from 'antd'; +import { + MenuOutlined, + GroupOutlined, + PlusOutlined, + LinkOutlined, + AppstoreAddOutlined, + EditOutlined, + DeleteOutlined, + ArrowRightOutlined, + SettingOutlined, + ArrowUpOutlined, + ArrowDownOutlined, + LoadingOutlined, + DownOutlined, + DatabaseOutlined, +} from '@ant-design/icons'; +import { + createCollectionField, + createOrUpdateCollection, + ISchema, + useDesignable, + useSchemaPath, +} from '../'; +import { uid } from '@formily/shared'; +import { getSchemaPath, SchemaField } from '../../components/schema-renderer'; +import { cloneDeep } from 'lodash'; +import { options } from '../database-field/interfaces'; + +import './style.less'; +import IconPicker from '../../components/icon-picker'; +import { barChartConfig, columnChartConfig } from './chart'; +import { isGridRowOrCol } from '../grid'; +import { + useCollectionContext, + useCollectionsContext, + useDisplayedMapContext, + useClient, +} from '../../constate'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { BlockSchemaContext } from '../../context'; + +const generateGridBlock = (schema: ISchema) => { + const name = schema.name || uid(); + return { + type: 'void', + name: uid(), + 'x-component': 'Grid.Row', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [name]: schema, + }, + }, + }, + }; +}; + +const isGrid = (schema: Schema) => { + return schema['x-component'] === 'Grid'; +}; + +const isGridBlock = (schema: Schema) => { + if (schema.parent['x-component'] !== 'Grid.Col') { + return false; + } + // Grid.Col 里有多少 Block + if (Object.keys(schema.parent.properties).length > 1) { + return false; + } + // 有多少 Grid.Row + if (Object.keys(schema.parent.parent.properties).length > 1) { + return false; + } + return true; +}; + +function generateCardItemSchema(component) { + const defaults: { [key: string]: ISchema } = { + 'Markdown.Void': { + type: 'void', + default: '这是一段演示文字,**支持使用 Markdown 语法**', + 'x-designable-bar': 'Markdown.Void.DesignableBar', + 'x-decorator': 'CardItem', + 'x-read-pretty': true, + 'x-component': 'Markdown.Void', + }, + Table: { + type: 'array', + 'x-designable-bar': 'Table.DesignableBar', + 'x-decorator': 'CardItem', + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'id', + dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + 'x-designable-bar': 'Table.ActionBar.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-designable-bar': 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + [uid()]: { + type: 'void', + name: 'action1', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-component': 'Action', + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-component-props': { + icon: 'DeleteOutlined', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + [uid()]: { + type: 'void', + name: 'action1', + title: '添加', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'Action', + 'x-component-props': { + icon: 'PlusOutlined', + type: 'primary', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': {}, + 'x-designable-bar': 'Table.Operation.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '查看', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + // paddingTop: 0, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '编辑', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'update', + properties: { + [uid()]: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Table.useResource }}', + useValues: '{{ Table.useTableRowRecord }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + // [uid()]: { + // type: 'void', + // title: '删除', + // 'x-component': 'Action', + // 'x-designable-bar': 'Table.Action.DesignableBar', + // 'x-action-type': 'destroy', + // 'x-component-props': { + // type: 'link', + // useAction: '{{ Table.useTableDestroyAction }}', + // }, + // }, + }, + }, + }, + }, + }, + }, + Form: { + type: 'void', + name: uid(), + 'x-decorator': 'CardItem', + 'x-component': 'Form', + 'x-component-props': { + showDefaultButtons: true, + }, + 'x-designable-bar': 'Form.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + Descriptions: { + type: 'void', + name: uid(), + 'x-decorator': 'CardItem', + 'x-component': 'Form', + 'x-read-pretty': true, + 'x-designable-bar': 'Form.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + Kanban: { + type: 'array', + 'x-component': 'Kanban', + 'x-designable-bar': 'Kanban.DesignableBar', + 'x-component-props': {}, + 'x-decorator': 'CardItem', + 'x-decorator-props': { + style: { + background: 'none', + }, + bodyStyle: { + padding: 0, + }, + }, + properties: { + create: { + type: 'void', + title: '添加卡片', + // 'x-designable-bar': 'Kanban.AddCardDesignableBar', + 'x-component': 'Kanban.Card.AddNew', + // 'x-decorator': 'AddNew.Displayed', + 'x-component-props': { + type: 'text', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Kanban.useCreateResource }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Kanban.useCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + card1: { + type: 'void', + name: uid(), + 'x-decorator': 'Form', + 'x-component': 'Kanban.Card', + 'x-designable-bar': 'Kanban.Card.DesignableBar', + 'x-read-pretty': true, + 'x-decorator-props': { + useResource: '{{ Kanban.useRowResource }}', + }, + properties: {}, + }, + view1: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-component': 'Kanban.Card.View', + 'x-component-props': { + useOkAction: '{{ Kanban.useUpdateAction }}', + }, + 'x-decorator-props': { + useResource: '{{ Kanban.useSingleResource }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + Calendar: { + type: 'array', + name: 'calendar1', + 'x-component': 'Calendar', + 'x-designable-bar': 'Calendar.DesignableBar', + 'x-decorator': 'CardItem', + default: [], + properties: { + toolbar: { + type: 'void', + 'x-component': 'Calendar.Toolbar', + properties: { + today: { + type: 'void', + title: '今天', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Today', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'today', + }, + }, + nav: { + type: 'void', + title: '翻页', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Nav', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'nav', + }, + }, + title: { + type: 'void', + title: '标题', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Title', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'title', + }, + }, + viewSelect: { + type: 'void', + title: '视图切换', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.ViewSelect', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'viewSelect', + }, + }, + filter: { + type: 'void', + title: '筛选', + 'x-align': 'right', + 'x-designable-bar': 'Calendar.Filter.DesignableBar', + 'x-component': 'Calendar.Filter', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + }, + create: { + type: 'void', + title: '添加', + 'x-align': 'right', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Action', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Calendar.useCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + }, + }, + event: { + type: 'void', + 'x-component': 'Calendar.Event', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + 'Chart.Column': { + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'Chart.Column', + 'x-designable-bar': 'Chart.DesignableBar', + 'x-component-props': { + config: cloneDeep(columnChartConfig), + }, + }, + 'Chart.Bar': { + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'Chart.Bar', + 'x-designable-bar': 'Chart.DesignableBar', + 'x-component-props': { + config: cloneDeep(barChartConfig), + }, + }, + 'Ref.ActionLogs': { + type: 'array', + name: 'table', + 'x-decorator': 'CardItem', + 'x-component': 'Table', + 'x-designable-bar': 'Table.SimpleDesignableBar', + default: [], + 'x-component-props': { + useResource: '{{ Table.useActionLogsResource }}', + collectionName: 'action_logs', + rowKey: 'id', + // dragSort: true, + showIndex: true, + defaultSort: ['-id'], + defaultAppends: ['user', 'collection'], + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-component-props': { + fieldNames: [], + }, + properties: { + column1: { + type: 'void', + title: '操作类型', + 'x-component': 'Filter.Column', + 'x-component-props': { + operations: [ + { + label: '等于', + value: 'eq', + selected: true, + schema: { 'x-component': 'Select' }, + }, + { + label: '不等于', + value: 'ne', + schema: { 'x-component': 'Select' }, + }, + { + label: '包含', + value: 'in', + schema: { + 'x-component': 'Select', + 'x-component-props': { mode: 'tags' }, + }, + }, + { + label: '不包含', + value: 'notIn', + schema: { + 'x-component': 'Select', + 'x-component-props': { mode: 'tags' }, + }, + }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], + }, + properties: { + type: { + type: 'string', + 'x-component': 'Select', + enum: [ + { label: '新增', value: 'create', color: 'green' }, + { label: '更新', value: 'update', color: 'blue' }, + { label: '删除', value: 'destroy', color: 'red' }, + ], + }, + }, + }, + }, + }, + }, + }, + column1: { + type: 'void', + title: '操作时间', + 'x-component': 'Table.Column', + properties: { + created_at: { + type: 'string', + 'x-component': 'DatePicker', + 'x-read-pretty': true, + 'x-component-props': { + format: 'YYYY-MM-DD HH:mm:ss', + }, + }, + }, + }, + column2: { + type: 'void', + title: '操作用户', + 'x-component': 'Table.Column', + properties: { + 'user.nickname': { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column3: { + type: 'void', + title: '数据表', + 'x-component': 'Table.Column', + properties: { + 'collection.title': { + type: 'string', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + }, + }, + column4: { + type: 'void', + title: '操作类型', + 'x-component': 'Table.Column', + properties: { + type: { + type: 'string', + 'x-component': 'Select', + 'x-read-pretty': true, + enum: [ + { label: '新增', value: 'create', color: 'green' }, + { label: '更新', value: 'update', color: 'blue' }, + { label: '删除', value: 'destroy', color: 'red' }, + ], + }, + }, + }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': { + width: 60, + align: 'center', + }, + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '查看', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + style: { + padding: '0', + height: 'auto', + }, + }, + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-read-pretty': true, + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Table.useActionLogDetailsResource }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + // bodyStyle: { + // background: '#f0f2f5', + // // paddingTop: 0, + // }, + }, + properties: { + created_at: { + type: 'string', + title: '操作时间', + 'x-decorator': 'FormItem', + 'x-component': 'DatePicker', + 'x-read-pretty': true, + 'x-component-props': { + format: 'YYYY-MM-DD HH:mm:ss', + }, + }, + 'user.nickname': { + type: 'string', + title: '操作用户', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + 'collection.title': { + type: 'string', + title: '数据表', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + type: { + type: 'string', + title: '操作类型', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-read-pretty': true, + enum: [ + { + label: '新增', + value: 'create', + color: 'green', + }, + { + label: '更新', + value: 'update', + color: 'blue', + }, + { + label: '删除', + value: 'destroy', + color: 'red', + }, + ], + }, + changes: { + type: 'array', + title: '数据变动', + 'x-decorator': 'FormItem', + 'x-component': 'ArrayTable', + 'x-component-props': { + pagination: false, + // scroll: { x: '100%' }, + }, + // 'x-reactions': ['{{ filterActionLogs }}'], + items: { + type: 'object', + properties: { + column0: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { + width: 80, + align: 'center', + }, + properties: { + index: { + type: 'void', + 'x-component': 'ArrayTable.Index', + }, + }, + }, + column1: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '字段名称' }, + properties: { + field: { + type: 'string', + 'x-decorator': 'FormilyFormItem', + 'x-component': 'ActionLogs.Field', + }, + }, + }, + column3: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '操作前' }, + properties: { + before: { + type: 'string', + 'x-decorator': 'FormilyFormItem', + 'x-component': 'ActionLogs.FieldValue', + }, + }, + }, + column4: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '操作后' }, + properties: { + after: { + type: 'string', + 'x-decorator': 'FormilyFormItem', + 'x-component': 'ActionLogs.FieldValue', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }; + return defaults[component]; +} + +function generateFormItemSchema(component) { + const defaults = { + Markdown: { + type: 'string', + title: uid(), + 'x-designable-bar': 'Markdown.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Markdown', + 'x-component-props': {}, + }, + }; + return defaults[component]; +} + +const dbSchema = { + type: 'object', + properties: { + title: { + type: 'string', + title: '数据表名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + name: { + type: 'string', + title: '数据表标识', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + generalFields: { + type: 'array', + title: '数据表字段', + 'x-decorator': 'FormItem', + 'x-component': 'DatabaseField', + default: [], + }, + }, +}; + +export const AddNew = () => null; + +AddNew.CardItem = observer((props: any) => { + const { ghost, defaultAction } = props; + const { schema, insertBefore, insertAfter, appendChild } = useDesignable(); + const path = useSchemaPath(); + const { collections = [], loading, refresh } = useCollectionsContext(); + const { createSchema } = useClient(); + return ( + { + console.log('onVisibleChange', visible); + }} + overlay={ + { + if (info.key.startsWith('Calendar.')) { + return; + } + if (info.key.startsWith('Kanban.')) { + return; + } + let data: ISchema; + let collectionName = null; + let isNew = false; + if (['addNewTable', 'addNewForm'].includes(info.key)) { + // const values = await FormDialog(`创建数据表`, () => { + // return ( + // + // + // + // ); + // }).open({ + // initialValues: { + // name: `t_${uid()}`, + // fields: [], + // }, + // }); + // await createOrUpdateCollection(values); + // isNew = true; + // data = generateCardItemSchema( + // info.key === 'addNewTable' ? 'Table' : 'Form', + // ); + // collectionName = values.name; + } else if (info.key.startsWith('collection.')) { + const keys = info.key.split('.'); + const component = keys.pop(); + const tableName = keys.pop(); + collectionName = tableName; + data = generateCardItemSchema(component); + console.log('info.keyPath', component, tableName); + } else { + data = generateCardItemSchema(info.key); + console.log('generateCardItemSchema', data, info.key); + } + if (schema['key']) { + data['key'] = uid(); + } + if (collectionName) { + data['x-component-props'] = data['x-component-props'] || {}; + data['x-component-props']['resource'] = collectionName; + data['x-component-props']['collectionName'] = collectionName; + } + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + if (isNew) { + await refresh(); + } + }} + > + + {[ + { key: 'Table', title: '表格', icon: 'TableOutlined' }, + { key: 'Form', title: '表单', icon: 'FormOutlined' }, + ].map((view) => ( + } + // disabled={view.disabled} + key={view.key} + title={view.title} + > + + {collections?.map((item) => ( + + {item.title} + + ))} + + {/* */} + {/* } key={`addNew${view.key}`}> + 创建数据表 + */} + + ))} + {[ + { + key: 'Calendar', + title: '日历', + icon: 'CalendarOutlined', + // disabled: true, + }, + ].map((view) => ( + } + // disabled={view.disabled} + key={view.key} + title={view.title} + > + + {collections?.map((item) => ( + { + const values = await FormDialog(`日历配置`, () => { + return ( + + { + return { + label: field?.uiSchema.title, + value: field?.name, + }; + }, + ), + }, + start: { + title: '开始日期字段', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + enum: item?.generalFields + ?.filter( + (field) => field.dataType === 'date', + ) + ?.map((field) => { + return { + label: field?.uiSchema.title, + value: field?.name, + }; + }), + }, + end: { + title: '结束日期字段', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + enum: item?.generalFields + ?.filter( + (field) => field.dataType === 'date', + ) + ?.map((field) => { + return { + label: field?.uiSchema.title, + value: field?.name, + }; + }), + }, + }, + }} + /> + + ); + }).open({}); + let data = generateCardItemSchema('Calendar'); + const collectionName = item.name; + if (schema['key']) { + data['key'] = uid(); + } + console.log('fieldNames', values); + if (collectionName) { + data['x-component-props'] = + data['x-component-props'] || {}; + data['x-component-props']['resource'] = + collectionName; + data['x-component-props']['collectionName'] = + collectionName; + data['x-component-props']['fieldNames'] = values; + } + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + }} + > + {item.title} + + ))} + + {/* */} + {/* } key={`addNew${view.key}`}> + 创建数据表 + */} + + ))} + {[ + { + key: 'Kanban', + title: '看板', + icon: 'CreditCardOutlined', + // disabled: true, + }, + ].map((view) => ( + } + // disabled={view.disabled} + key={view.key} + title={view.title} + > + + {collections?.map((item) => ( + + + {item?.generalFields + ?.filter((item) => { + return item?.uiSchema?.enum; + }) + ?.map((field) => { + return ( + { + let data = generateCardItemSchema('Kanban'); + const collectionName = item.name; + if (schema['key']) { + data['key'] = uid(); + } + if (collectionName) { + data['x-component-props'] = + data['x-component-props'] || {}; + data['x-component-props']['resource'] = + collectionName; + data['x-component-props'][ + 'collectionName' + ] = collectionName; + data['x-component-props']['groupField'] = { + name: field.name, + }; + } + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if ( + defaultAction === 'insertAfter' + ) { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + }} + > + {field?.uiSchema?.title} + + ); + })} + + + // + // {item.title} + // + ))} + + {/* + } key={`addNew${view.key}`}> + 创建数据表 + */} + + ))} + + + + } + > + Markdown + + } + > + 富文本 + + + + + } + > + 柱状图 + + } + > + 条形图 + + } + > + 折线图 + + } + > + 饼图 + + + + } title={'引用模板'}> + + 操作日志 + + + + 添加模板 + + + + } + > + {ghost ? ( + + ) : ( + + )} + + ); +}); + +AddNew.FormItem = observer((props: any) => { + const { ghost, defaultAction } = props; + const { schema, insertBefore, insertAfter, appendChild, deepRemove } = + useDesignable(); + const path = useSchemaPath(); + const { loadCollections } = useCollectionsContext(); + const { collection, fields, refresh } = useCollectionContext(); + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { createSchema, removeSchema } = useClient(); + + return ( + + + {fields?.map((field) => ( + { + if (!checked) { + const s: any = displayed.get(field.name); + const p = getSchemaPath(s); + const removed = deepRemove(p); + if (!removed) { + console.log('getSchemaPath', p, removed); + return; + } + const last = removed.pop(); + displayed.remove(field.name); + if (isGridRowOrCol(last)) { + await removeSchema(last); + } + return; + } + let data: ISchema = { + key: uid(), + type: 'void', + 'x-decorator': 'Form.Field.Item', + 'x-designable-bar': 'Form.Field.DesignableBar', + 'x-component': 'Form.Field', + 'x-component-props': { + fieldName: field.name, + }, + }; + if (field.interface === 'linkTo') { + data.properties = { + options: { + type: 'void', + 'x-decorator': 'Form', + 'x-component': 'Select.Options.Drawer', + 'x-component-props': { + useOkAction: '{{ Select.useOkAction }}', + }, + title: '关联数据', + properties: { + table: { + type: 'array', + 'x-designable-bar': 'Table.DesignableBar', + 'x-decorator': 'BlockItem', + 'x-decorator-props': { + draggable: false, + }, + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'id', + useSelectedRowKeys: + '{{ Select.useSelectedRowKeys }}', + onSelect: '{{ Select.useSelect() }}', + useRowSelection: '{{ Select.useRowSelection }}', + collectionName: field.target, + // dragSort: true, + // showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + 'x-designable-bar': + 'Table.ActionBar.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-designable-bar': + 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + }, + }, + }, + }, + }, + }, + option: { + type: 'void', + 'x-component': 'Select.OptionTag', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': + 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }; + } + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + }} + /> + ))} + + + + {options.map( + (option) => + option.children.length > 0 && ( + + {option.children.map((item) => ( + { + setVisible(false); + const values = await FormDialog(`添加字段`, () => { + return ( + + + + ); + }).open({ + initialValues: { + interface: item.name, + ...item.default, + key: uid(), + name: `f_${uid()}`, + }, + }); + await createCollectionField(collection?.name, values); + let data: ISchema = cloneDeep(values.uiSchema); + data['name'] = values.name; + data['referenceKey'] = data['key']; + data['key'] = uid(); + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + await refresh(); + }} + > + {item.title} + + ))} + + ), + )} + + {/* */} + { + let data: ISchema = { + type: 'void', + default: '这是一段演示文字,**支持使用 Markdown 语法**', + 'x-designable-bar': 'Markdown.Void.DesignableBar', + 'x-decorator': 'FormItem', + 'x-read-pretty': true, + 'x-component': 'Markdown.Void', + }; + if (schema['key']) { + data['key'] = uid(); + } + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + console.log('ISchema', schema, data, path); + await createSchema(s); + } + setVisible(false); + }} + > + 添加说明文字 + + + } + > + {ghost ? ( + + ) : ( + + )} + + ); +}); + +AddNew.PaneItem = observer((props: any) => { + const { ghost, defaultAction } = props; + const { schema, insertBefore, insertAfter, appendChild } = useDesignable(); + const path = useSchemaPath(); + const [visible, setVisible] = useState(false); + const blockSchema = useContext(BlockSchemaContext); + const useResource = `{{ ${blockSchema['x-component']}.useResource }}`; + console.log('AddNew.PaneItem.useResource', useResource); + const { collection, fields } = useCollectionContext(); + const { createSchema } = useClient(); + + return ( + + + } + onClick={async () => { + let data: ISchema = { + type: 'void', + name: uid(), + 'x-decorator': 'CardItem', + 'x-component': 'Form', + 'x-read-pretty': true, + 'x-component-props': { + useResource, + }, + 'x-designable-bar': 'Form.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Bar', + 'x-designable-bar': 'Action.Bar.DesignableBar', + 'x-component-props': {}, + }, + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }; + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + setVisible(false); + }} + style={{ minWidth: 150 }} + > + 详情 + + } + onClick={async () => { + let data: ISchema = { + type: 'void', + name: uid(), + 'x-decorator': 'CardItem', + 'x-component': 'Form', + 'x-component-props': { + useResource, + showDefaultButtons: true, + }, + 'x-designable-bar': 'Form.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }; + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + setVisible(false); + }} + > + 表单 + + + + } + onClick={async () => { + let data: ISchema = generateCardItemSchema('Ref.ActionLogs'); + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + setVisible(false); + }} + > + 日志 + + {fields + ?.filter((f) => f.interface === 'linkTo') + ?.map((collectionField) => { + return ( + { + const multiple = + collectionField?.uiSchema?.['x-component-props'] + ?.multiple; + let data = generateCardItemSchema( + multiple ? 'Table' : 'Descriptions', + ); + if (schema['key']) { + data['key'] = uid(); + } + data['x-component-props'] = + data['x-component-props'] || {}; + data['x-component-props']['collectionName'] = + collectionField?.target; + data['x-component-props']['resourceName'] = + collectionField?.name; + data['x-component-props']['associatedName'] = + collection?.name; + data['x-component-props']['useResource'] = + '{{ Association.useResource }}'; + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + }} + > + {collectionField?.uiSchema?.title} + + ); + })} + + + } + onClick={async () => { + let data: ISchema = { + key: uid(), + type: 'void', + default: '这是一段演示文字,**支持使用 Markdown 语法**', + 'x-designable-bar': 'Markdown.Void.DesignableBar', + 'x-decorator': 'CardItem', + 'x-read-pretty': true, + 'x-component': 'Markdown.Void', + }; + if (isGridBlock(schema)) { + path.pop(); + path.pop(); + data = generateGridBlock(data); + } else if (isGrid(schema)) { + data = generateGridBlock(data); + } + if (data) { + let s; + if (isGrid(schema)) { + s = appendChild(data, [...path]); + } else if (defaultAction === 'insertAfter') { + s = insertAfter(data, [...path]); + } else { + s = insertBefore(data, [...path]); + } + await createSchema(s); + } + setVisible(false); + }} + > + Markdown + + + + } + > + {ghost ? ( + + ) : ( + + )} + + ); +}); + +AddNew.Displayed = observer((props: any) => { + const { displayName, children } = props; + const displayed = useDisplayedMapContext(); + const { schema } = useDesignable(); + useEffect(() => { + if (displayName) { + displayed.set(displayName, schema); + } + }, [displayName, schema]); + return children; +}); + +export default AddNew; diff --git a/packages/client/src/schemas/add-new/style.less b/packages/client/src/schemas/add-new/style.less new file mode 100644 index 0000000000000000000000000000000000000000..b43b94140e5be61f891cb3f39e60919d117e68c7 --- /dev/null +++ b/packages/client/src/schemas/add-new/style.less @@ -0,0 +1,10 @@ +.ant-dropdown-menu-item-group.display-fields { + .ant-dropdown-menu-item-group-list { + overflow: auto; + max-height: 300px; + } +} +.add-new-fields-popup .ant-dropdown-menu { + overflow: auto; + max-height: 300px; +} diff --git a/packages/client/src/schemas/array-table/index.tsx b/packages/client/src/schemas/array-table/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..66f6edc82a1fe8739f0f40751b7557a65eb15668 --- /dev/null +++ b/packages/client/src/schemas/array-table/index.tsx @@ -0,0 +1,420 @@ +// import React from 'react'; +// import { ArrayTable as Table } from '@formily/antd'; +// import { useField, Schema } from '@formily/react'; +// import { Button } from 'antd'; +// import cls from 'classnames'; +// import { isValid, uid } from '@formily/shared'; +// import { PlusOutlined } from '@ant-design/icons'; +// import { usePrefixCls } from '@formily/antd/lib/__builtins__'; + +import React, { Fragment, useState, useRef, useEffect } from 'react'; +import { Table, Pagination, Space, Select, Badge, Button } from 'antd'; +import { PaginationProps } from 'antd/lib/pagination'; +import { TableProps, ColumnProps } from 'antd/lib/table'; +import { SelectProps } from 'antd/lib/select'; +import cls from 'classnames'; +import { SortableContainer, SortableElement } from 'react-sortable-hoc'; +import { GeneralField, FieldDisplayTypes, ArrayField } from '@formily/core'; +import { + useForm, + useField, + observer, + useFieldSchema, + RecursionField, +} from '@formily/react'; +import { FormPath, isArr, isBool, uid, isValid } from '@formily/shared'; +import { Schema } from '@formily/json-schema'; +import { usePrefixCls } from '@formily/antd/lib/__builtins__'; +import { ArrayBase, ArrayBaseMixins } from '@formily/antd/lib/array-base'; +import { PlusOutlined } from '@ant-design/icons'; + +interface ObservableColumnSource { + field: GeneralField; + columnProps: ColumnProps; + schema: Schema; + display: FieldDisplayTypes; + name: string; +} +interface IArrayTablePaginationProps extends PaginationProps { + dataSource?: any[]; + paging?: boolean; + children?: ( + dataSource: any[], + pagination: React.ReactNode, + ) => React.ReactElement; +} + +interface IStatusSelectProps extends SelectProps { + pageSize?: number; +} + +type ComposedArrayTable = React.FC> & + ArrayBaseMixins & { + Column?: React.FC>; + }; + +const SortableRow = SortableElement((props: any) =>
); +const SortableBody = SortableContainer((props: any) => ); + +const isColumnComponent = (schema: Schema) => { + return schema['x-component']?.indexOf('Column') > -1; +}; + +const isOperationsComponent = (schema: Schema) => { + return schema['x-component']?.indexOf('Operations') > -1; +}; + +const isAdditionComponent = (schema: Schema) => { + return schema['x-component']?.indexOf('Addition') > -1; +}; + +const useArrayTableSources = () => { + const arrayField = useField(); + const schema = useFieldSchema(); + const parseSources = (schema: Schema): ObservableColumnSource[] => { + if ( + isColumnComponent(schema) || + isOperationsComponent(schema) || + isAdditionComponent(schema) + ) { + if (!schema['x-component-props']?.['dataIndex'] && !schema['name']) + return []; + const name = schema['x-component-props']?.['dataIndex'] || schema['name']; + const field = arrayField.query(arrayField.address.concat(name)).take(); + const columnProps = + field?.component?.[1] || schema['x-component-props'] || {}; + const display = field?.display || schema['x-display']; + return [ + { + name, + display, + field, + schema, + columnProps, + }, + ]; + } else if (schema.properties) { + return schema.reduceProperties((buf, schema) => { + return buf.concat(parseSources(schema)); + }, []); + } + }; + + const parseArrayItems = (schema: Schema['items']) => { + const sources: ObservableColumnSource[] = []; + const items = isArr(schema) ? schema : [schema]; + return items.reduce((columns, schema) => { + const item = parseSources(schema); + if (item) { + return columns.concat(item); + } + return columns; + }, sources); + }; + + if (!schema) throw new Error('can not found schema object'); + + return parseArrayItems(schema.items); +}; + +const useArrayTableColumns = ( + dataSource: any[], + sources: ObservableColumnSource[], +): TableProps['columns'] => { + return sources.reduce((buf, { name, columnProps, schema, display }, key) => { + if (display !== 'visible') return buf; + if (!isColumnComponent(schema)) return buf; + return buf.concat({ + ...columnProps, + key, + dataIndex: name, + render: (value: any, record: any) => { + const index = dataSource.indexOf(record); + const children = ( + + + + ); + return children; + }, + }); + }, []); +}; + +const useAddition = () => { + const schema = useFieldSchema(); + return schema.reduceProperties((addition, schema, key) => { + if (isAdditionComponent(schema)) { + return ; + } + return addition; + }, null); +}; + +const StatusSelect: React.FC = observer((props) => { + const form = useForm(); + const field = useField(); + const prefixCls = usePrefixCls('formily-array-table'); + const errors = form.queryFeedbacks({ + type: 'error', + address: `${field.address}.*`, + }); + const createIndexPattern = (page: number) => { + const pattern = `${field.address}.*[${(page - 1) * props.pageSize}:${ + page * props.pageSize + }].*`; + return FormPath.parse(pattern); + }; + const options = props.options?.map(({ label, value }) => { + const hasError = errors.some(({ address }) => { + return createIndexPattern(value).match(address); + }); + return { + label: hasError ? {label} : label, + value, + }; + }); + + const width = String(options?.length).length * 15; + + return ( +
{}} + pagination={false} + columns={columns} + dataSource={dataSource} + components={{ + body: { + wrapper: (props: any) => ( + { + return ref.current?.querySelector('tbody'); + }} + onSortStart={({ node }) => { + addTdStyles(node); + }} + onSortEnd={({ oldIndex, newIndex }) => { + field.move(oldIndex, newIndex); + }} + {...props} + /> + ), + row: (props: any) => { + return ( + + ); + }, + }, + }} + /> +
{pager}
+ {sources.map((column, key) => { + //专门用来承接对Column的状态管理 + if (!isColumnComponent(column.schema)) return; + return React.createElement(RecursionField, { + name: column.name, + schema: column.schema, + onlyRenderSelf: true, + key, + }); + })} + {addition} + + + )} + + ); + }, +); + +ArrayTable.displayName = 'ArrayTable'; + +ArrayTable.Column = () => { + return ; +}; + +ArrayBase.mixin(ArrayTable); + +ArrayTable.Index = (props) => { + const index = ArrayBase.useIndex(); + return {index + 1}; +}; + +const getDefaultValue = (defaultValue: any, schema: Schema) => { + if (isValid(defaultValue)) return defaultValue; + if (Array.isArray(schema?.items)) + return getDefaultValue(defaultValue, schema.items[0]); + if (schema?.items?.type === 'array') return []; + if (schema?.items?.type === 'boolean') return true; + if (schema?.items?.type === 'date') return ''; + if (schema?.items?.type === 'datetime') return ''; + if (schema?.items?.type === 'number') return 0; + if (schema?.items?.type === 'object') return {}; + if (schema?.items?.type === 'string') return ''; + return null; +}; + +ArrayTable.Addition = (props: any) => { + const { randomValue } = props; + const self = useField(); + const array = ArrayBase.useArray(); + const prefixCls = usePrefixCls('formily-array-base'); + if (!array) return null; + if (array.field?.pattern !== 'editable') return null; + return ( + + ); +}; + +export default ArrayTable; diff --git a/packages/client/src/schemas/block-item/index.md b/packages/client/src/schemas/block-item/index.md new file mode 100644 index 0000000000000000000000000000000000000000..b4ec353fa8c11824b87e7e5e5bdbdf96ac821a7b --- /dev/null +++ b/packages/client/src/schemas/block-item/index.md @@ -0,0 +1,22 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# BlockItem - 区块项 + +## Node Tree + +通常 BlockItem 并不单独占用一个节点,而是节点的 x-decorator + +
+
+ + +BlockItem 的作用主要用于处理 DesignableBar,如: + +
+
+ \ No newline at end of file diff --git a/packages/client/src/schemas/block-item/index.tsx b/packages/client/src/schemas/block-item/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7811ba65774c31e1c9214de93c3fc96e2ddbb581 --- /dev/null +++ b/packages/client/src/schemas/block-item/index.tsx @@ -0,0 +1,75 @@ +import React, { createContext, useContext, useState } from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + SchemaOptionsContext, + useField, + useFieldSchema, +} from '@formily/react'; +import { FormItem as FormilyFormItem } from '@formily/antd'; +import { Dropdown, Menu, Space } from 'antd'; +import classNames from 'classnames'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import './style.less'; +import get from 'lodash/get'; +import { uid } from '@formily/shared'; +import { useDesignable, useSchemaPath } from '../'; +import { AddNew } from '../add-new'; +import { Card } from 'antd'; +import { + mergeRefs, + DraggableBlockContext, + useBlockDragAndDrop, + useDragDropUID, +} from '../../components/drag-and-drop'; +import cls from 'classnames'; +import { Droppable, SortableItem } from '../../components/Sortable'; +import { useDndContext } from '@dnd-kit/core'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { BlockSchemaContext } from '../../context'; + +const DraggableBlock = (props) => { + const { className, children, ...others } = props; + const { DesignableBar, schema } = useDesignable(); + return ( + + {children} + + + ); +}; + +const Block = (props) => { + const { DesignableBar } = useDesignable(); + const { className, children, ...others } = props; + return ( +
+ {children} + +
+ ); +}; + +export const BlockItem: any = observer((props: any) => { + const { draggable = true } = props; + const ctx = useDndContext(); + const { schema } = useDesignable(); + return ( + + {React.createElement( + draggable && ctx.activators?.length > 0 ? DraggableBlock : Block, + props, + )} + + ); +}); diff --git a/packages/client/src/schemas/block-item/style.less b/packages/client/src/schemas/block-item/style.less new file mode 100644 index 0000000000000000000000000000000000000000..f84a8786eee18833b2c53c52e476753b5dd6baf2 --- /dev/null +++ b/packages/client/src/schemas/block-item/style.less @@ -0,0 +1,51 @@ +.nb-block-item { + position: relative; + &:hover, + &.active { + > .designable-bar { + display: block; + } + } + > .designable-bar { + z-index: 1; + pointer-events: none; + display: none; + position: absolute; + top: 0; + right: -0; + left: -0; + bottom: -0; + border-radius: 2px; + border: 2px solid #1890ff; + &:hover, + &.active { + display: block; + } + .designable-bar-actions { + pointer-events: auto; + position: absolute; + right: 0; + line-height: 1rem; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + width: 16px; + height: 16px; + vertical-align: top; + line-height: 16px; + font-size: 10px; + background-color: #1890ff; + } + } + } + .ant-formily-item + .designable-bar { + top: -5px; + left: -5px; + right: -5px; + bottom: -5px; + } + &.nb-card-item { + margin-bottom: 24px; + } +} diff --git a/packages/client/src/schemas/calendar/Action.tsx b/packages/client/src/schemas/calendar/Action.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d3e895c38afeb482510cd6cfaadccef6034df231 --- /dev/null +++ b/packages/client/src/schemas/calendar/Action.tsx @@ -0,0 +1,85 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +// import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { useDisplayedMapContext } from '../../constate'; +import { DragHandle } from '../../components/Sortable'; + +export const ActionDesignableBar = (props: any) => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const isPopup = Object.keys(schema.properties || {}).length > 0; + const displayed = useDisplayedMapContext(); + const field = useField(); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; diff --git a/packages/client/src/schemas/calendar/ActionBar.tsx b/packages/client/src/schemas/calendar/ActionBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e9b5f9a89392b905943e9a4607591276d86d7ac1 --- /dev/null +++ b/packages/client/src/schemas/calendar/ActionBar.tsx @@ -0,0 +1,308 @@ +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { observer, RecursionField, Schema } from '@formily/react'; +import React, { useState } from 'react'; +import { ISchema } from '..'; +import { + findPropertyByPath, + getSchemaPath, + useDesignable, +} from '../../components/schema-renderer'; +import { + useClient, + DisplayedMapProvider, + useDisplayedMapContext, +} from '../../constate'; +import cls from 'classnames'; +import { Button, Dropdown, Menu, Space } from 'antd'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { uid } from '@formily/shared'; +import { SettingOutlined } from '@ant-design/icons'; +import { Droppable, SortableItem } from '../../components/Sortable'; + +export const ActionBar = observer((props: any) => { + const { align = 'top' } = props; + // const { schema, designable } = useDesignable(); + const { root, schema, insertAfter, remove, appendChild } = useDesignable(); + const moveToAfter = (path1, path2, extra = {}) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter( + { + ...data.toJSON(), + ...extra, + }, + path2, + ); + }; + const { updateSchema } = useClient(); + + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + { + setDragOverlayContent(event.active.data?.current?.title || ''); + // const previewRef = event.active.data?.current?.previewRef; + // if (previewRef) { + // setDragOverlayContent(previewRef?.current?.innerHTML); + // } else { + // setDragOverlayContent(''); + // } + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const align = event.over?.data?.current?.align; + const draggable = event.over?.data?.current?.draggable; + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + if (!draggable) { + console.log('alignalignalignalign', align); + const p = findPropertyByPath(root, path1); + if (!p) { + return; + } + remove(path1); + const data = appendChild( + { + ...p.toJSON(), + 'x-align': align, + }, + path2, + ); + await updateSchema(data); + } else { + const data = moveToAfter(path1, path2, { + 'x-align': align, + }); + await updateSchema(data); + } + }} + > + + {dragOverlayContent} + {/*
*/} +
+ +
+
+ +
+
+ +
+ +
+
+
+ ); +}); + +function generateActionSchema(type) { + const actions: { [key: string]: ISchema } = { + today: { + type: 'void', + title: '今天', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Today', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'today', + }, + }, + nav: { + type: 'void', + title: '翻页', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Nav', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'nav', + }, + }, + title: { + type: 'void', + title: '标题', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Title', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'title', + }, + }, + viewSelect: { + type: 'void', + title: '视图切换', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.ViewSelect', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'viewSelect', + }, + }, + filter: { + type: 'void', + title: '过滤', + 'x-align': 'right', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Calendar.Filter', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + }, + create: { + type: 'void', + title: '添加', + 'x-align': 'right', + 'x-designable-bar': 'Calendar.ActionDesignableBar', + 'x-component': 'Action', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Calendar.useCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + }; + return actions[type]; +} + +function AddActionButton() { + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { appendChild, remove } = useDesignable(); + const { schema, designable } = useDesignable(); + const { createSchema, removeSchema } = useClient(); + + if (!designable) { + return null; + } + return ( + + + {[ + { title: '今天', name: 'today' }, + { title: '翻页', name: 'nav' }, + { title: '标题', name: 'title' }, + { title: '视图切换', name: 'viewSelect' }, + { title: '筛选', name: 'filter' }, + { title: '添加', name: 'create' }, + ].map((item) => ( + { + if (!checked) { + const s = displayed.get(item.name) as Schema; + const path = getSchemaPath(s); + displayed.remove(item.name); + const removed = remove(path); + await removeSchema(removed); + } else { + const s = generateActionSchema(item.name); + const data = appendChild(s); + await createSchema(data); + } + }} + /> + ))} + + + + 函数操作 + 弹窗表单 + 复杂弹窗 + + + } + > + + + ); +} + +function Actions(props: any) { + const { align = 'left' } = props; + const { schema, designable } = useDesignable(); + return ( + + + {schema.mapProperties((s) => { + const currentAlign = s['x-align'] || 'left'; + if (currentAlign !== align) { + return null; + } + return ( + + + + ); + })} + + + ); +} diff --git a/packages/client/src/schemas/calendar/DesignableBar.tsx b/packages/client/src/schemas/calendar/DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..02cfd34e81eae5d2b93e900f951991a0308a0964 --- /dev/null +++ b/packages/client/src/schemas/calendar/DesignableBar.tsx @@ -0,0 +1,245 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Modal, Dropdown, Menu, Select, Space } from 'antd'; +import { + MenuOutlined, + DragOutlined, + CalendarOutlined, + FontSizeOutlined, +} from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +// import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { useCollection, useCollectionContext } from '../../constate'; +import { useTable } from '../table'; +import { fieldsToFilterColumns } from './'; +import { set } from 'lodash'; +import { DragHandle } from '../../components/Sortable'; +import { DeleteOutlined, FilterOutlined } from '@ant-design/icons'; + +export const DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const { props: tableProps } = useTable(); + const collectionName = + field.componentProps?.collectionName || tableProps?.collectionName; + const { collection, fields } = useCollection({ collectionName }); + const fieldNames = field.componentProps.fieldNames; + return ( +
+
+ {collection?.title || collection?.name} +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + setVisible(visible); + }} + overlay={ + + }> +
+ 标题字段: + { + field.componentProps.fieldNames = { + ...fieldNames, + start: value, + }; + // set(field.componentProps, 'fieldNames.start', value); + set( + schema['x-component-props'], + 'fieldNames.start', + value, + ); + await updateSchema(schema); + }} + options={fields + ?.filter((field) => field.dataType === 'date') + ?.map((field) => { + return { + label: field?.uiSchema.title, + value: field?.name, + }; + })} + /> +
+
+ }> +
+ 结束日期字段: + + {views.map((name) => ( + {messages[name]} + ))} + + +
+ ); +}); + +export const fieldsToFilterColumns = (fields: any[], options: any = {}) => { + const { fieldNames = [] } = options; + const properties = {}; + fields.forEach((field, index) => { + if (fieldNames?.length && !fieldNames.includes(field.name)) { + return; + } + const fieldOption = interfaces.get(field.interface); + if (!fieldOption?.operations) { + return; + } + properties[`column${index}`] = { + type: 'void', + title: field?.uiSchema?.title, + 'x-component': 'Filter.Column', + 'x-component-props': { + operations: fieldOption.operations, + }, + properties: { + [field.name]: { + ...field.uiSchema, + 'x-decorator': 'FormilyFormItem', + title: null, + }, + }, + }; + }); + return properties; +}; + +Calendar.Filter = observer((props: any) => { + const { service } = useCalendar(); + const { fieldNames = [] } = props; + const { schema, DesignableBar } = useDesignable(); + const form = useMemo(() => createForm(), []); + const { fields = [] } = useCollectionContext(); + const [visible, setVisible] = useState(false); + const obj = flatten(form.values.filter || {}); + console.log('flatten', obj, Object.values(obj)); + const count = Object.values(obj).filter((i) => + Array.isArray(i) ? i.length : i, + ).length; + const icon = props.icon || 'FilterOutlined'; + const properties = fieldsToFilterColumns(fields, { fieldNames }); + schema.mapProperties((p) => { + properties[p.name] = p; + }); + return ( + + + + + { + const { filter } = form.values; + console.log('Table.Filter', form.values); + setVisible(false); + // return service.run({ + // ...service.params[0], + // filter, + // }); + }} + > + 提交 + + + +
+ } + > + + + ); +}); + +Calendar.Filter.DesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { fields } = useCollectionContext(); + const field = useField(); + let fieldNames = field.componentProps.fieldNames || []; + if (fieldNames.length === 0) { + fieldNames = fields.map((field) => field.name); + } + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + + {fields + .filter((collectionField) => { + const option = interfaces.get(collectionField.interface); + return option?.operations?.length; + }) + .map((collectionField) => ( + { + if (checked) { + fieldNames.push(collectionField.name); + } else { + const index = fieldNames.indexOf( + collectionField.name, + ); + if (index > -1) { + fieldNames.splice(index, 1); + } + } + console.log({ fieldNames, field }); + schema['x-component-props']['fieldNames'] = + fieldNames; + field.componentProps.fieldNames = fieldNames; + updateSchema(schema); + }} + /> + ))} + + + { + setVisible(false); + const values = await FormDialog('编辑按钮', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + schema['title'] = values.title; + schema['x-component-props']['icon'] = values.icon; + field.componentProps.icon = values.icon; + field.title = values.title; + updateSchema(schema); + refresh(); + }} + > + 编辑按钮 + + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; + +Calendar.DesignableBar = DesignableBar; + +Calendar.ActionDesignableBar = ActionDesignableBar; diff --git a/packages/client/src/schemas/calendar/style.less b/packages/client/src/schemas/calendar/style.less new file mode 100644 index 0000000000000000000000000000000000000000..96fb00cac5a1cd6ee6350abdd6b2dad98d74fee6 --- /dev/null +++ b/packages/client/src/schemas/calendar/style.less @@ -0,0 +1,672 @@ +.rbc-btn { + color: inherit; + font: inherit; + margin: 0; +} + +button.rbc-btn { + overflow: visible; + text-transform: none; + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled].rbc-btn { + cursor: not-allowed; +} + +button.rbc-input::-moz-focus-inner { + border: 0; + padding: 0; +} + +.rbc-calendar { + box-sizing: border-box; + height: 100%; + display: flex; + flex-direction: column; + align-items: stretch; +} + +.rbc-calendar *, +.rbc-calendar *:before, +.rbc-calendar *:after { + box-sizing: inherit; +} + +.rbc-abs-full, +.rbc-row-bg { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.rbc-ellipsis, +.rbc-event-label, +.rbc-row-segment .rbc-event-content, +.rbc-show-more { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rbc-rtl { + direction: rtl; +} + +.rbc-off-range { + color: #999999; +} + +.rbc-off-range-bg { + background: #e6e6e6; +} + +.rbc-header { + overflow: hidden; + flex: 1 0 0%; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 3px; + text-align: center; + vertical-align: middle; + font-weight: bold; + font-size: 90%; + min-height: 0; + border-bottom: 1px solid #ddd; +} +.rbc-header + .rbc-header { + border-left: 1px solid #ddd; +} +.rbc-rtl .rbc-header + .rbc-header { + border-left-width: 0; + border-right: 1px solid #ddd; +} +.rbc-header > a, +.rbc-header > a:active, +.rbc-header > a:visited { + color: inherit; + text-decoration: none; +} + +.rbc-row-content { + position: relative; + user-select: none; + -webkit-user-select: none; + z-index: 4; +} + +.rbc-row-content-scrollable { + display: flex; + flex-direction: column; + height: 100%; +} +.rbc-row-content-scrollable .rbc-row-content-scroll-container { + height: 100%; + overflow-y: scroll; + /* Hide scrollbar for Chrome, Safari and Opera */ + -ms-overflow-style: none; + /* IE and Edge */ + scrollbar-width: none; + /* Firefox */ +} +.rbc-row-content-scrollable + .rbc-row-content-scroll-container::-webkit-scrollbar { + display: none; +} + +.rbc-today { + background-color: #eaf6ff; +} + +.rbc-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + margin-bottom: 10px; + font-size: 16px; +} +.rbc-toolbar .rbc-toolbar-label { + flex-grow: 1; + padding: 0 10px; + text-align: center; +} +.rbc-toolbar button { + color: #373a3c; + display: inline-block; + margin: 0; + text-align: center; + vertical-align: middle; + background: none; + background-image: none; + border: 1px solid #ccc; + padding: 0.375rem 1rem; + border-radius: 4px; + line-height: normal; + white-space: nowrap; +} +.rbc-toolbar button:active, +.rbc-toolbar button.rbc-active { + background-image: none; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + background-color: #e6e6e6; + border-color: #adadad; +} +.rbc-toolbar button:active:hover, +.rbc-toolbar button:active:focus, +.rbc-toolbar button.rbc-active:hover, +.rbc-toolbar button.rbc-active:focus { + color: #373a3c; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.rbc-toolbar button:focus { + color: #373a3c; + background-color: #e6e6e6; + border-color: #adadad; +} +.rbc-toolbar button:hover { + color: #373a3c; + background-color: #e6e6e6; + border-color: #adadad; +} + +.rbc-btn-group { + display: inline-block; + white-space: nowrap; +} +.rbc-btn-group > button:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.rbc-btn-group > button:last-child:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.rbc-rtl .rbc-btn-group > button:first-child:not(:last-child) { + border-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.rbc-rtl .rbc-btn-group > button:last-child:not(:first-child) { + border-radius: 4px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.rbc-btn-group > button:not(:first-child):not(:last-child) { + border-radius: 0; +} +.rbc-btn-group button + button { + margin-left: -1px; +} +.rbc-rtl .rbc-btn-group button + button { + margin-left: 0; + margin-right: -1px; +} +.rbc-btn-group + .rbc-btn-group, +.rbc-btn-group + button { + margin-left: 10px; +} + +.rbc-event, +.rbc-day-slot .rbc-background-event { + border: none; + box-sizing: border-box; + box-shadow: none; + margin: 0; + padding: 2px 5px; + background-color: #3174ad; + border-radius: 5px; + color: #fff; + cursor: pointer; + width: 100%; + text-align: left; +} +.rbc-slot-selecting .rbc-event, +.rbc-slot-selecting .rbc-day-slot .rbc-background-event, +.rbc-day-slot .rbc-slot-selecting .rbc-background-event { + cursor: inherit; + pointer-events: none; +} +.rbc-event.rbc-selected, +.rbc-day-slot .rbc-selected.rbc-background-event { + background-color: #265985; +} +.rbc-event:focus, +.rbc-day-slot .rbc-background-event:focus { + outline: 5px auto #3b99fc; +} + +.rbc-event-label { + font-size: 80%; +} + +.rbc-event-overlaps { + box-shadow: -1px 1px 5px 0px rgba(51, 51, 51, 0.5); +} + +.rbc-event-continues-prior { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.rbc-event-continues-after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.rbc-event-continues-earlier { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.rbc-event-continues-later { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.rbc-row { + display: flex; + flex-direction: row; +} + +.rbc-row-segment { + padding: 0 1px 1px 1px; +} + +.rbc-selected-cell { + background-color: rgba(0, 0, 0, 0.1); +} + +.rbc-show-more { + background-color: rgba(255, 255, 255, 0.3); + z-index: 4; + font-weight: bold; + font-size: 85%; + height: auto; + line-height: normal; +} + +.rbc-month-view { + position: relative; + border: 1px solid #ddd; + display: flex; + flex-direction: column; + flex: 1 0 0; + width: 100%; + user-select: none; + -webkit-user-select: none; + height: 100%; +} + +.rbc-month-header { + display: flex; + flex-direction: row; +} + +.rbc-month-row { + display: flex; + position: relative; + flex-direction: column; + flex: 1 0 0; + flex-basis: 0px; + overflow: hidden; + height: 100%; +} +.rbc-month-row + .rbc-month-row { + border-top: 1px solid #ddd; +} + +.rbc-date-cell { + flex: 1 1 0; + min-width: 0; + padding-right: 5px; + text-align: right; +} +.rbc-date-cell.rbc-now { + font-weight: bold; +} +.rbc-date-cell > a, +.rbc-date-cell > a:active, +.rbc-date-cell > a:visited { + color: inherit; + text-decoration: none; +} + +.rbc-row-bg { + display: flex; + flex-direction: row; + flex: 1 0 0; + overflow: hidden; +} + +.rbc-day-bg { + flex: 1 0 0%; +} +.rbc-day-bg + .rbc-day-bg { + border-left: 1px solid #ddd; +} +.rbc-rtl .rbc-day-bg + .rbc-day-bg { + border-left-width: 0; + border-right: 1px solid #ddd; +} + +.rbc-overlay { + position: absolute; + z-index: 5; + border: 1px solid #e5e5e5; + background-color: #fff; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.25); + padding: 10px; +} +.rbc-overlay > * + * { + margin-top: 1px; +} + +.rbc-overlay-header { + border-bottom: 1px solid #e5e5e5; + margin: -10px -10px 5px -10px; + padding: 2px 10px; +} + +.rbc-agenda-view { + display: flex; + flex-direction: column; + flex: 1 0 0; + overflow: auto; +} +.rbc-agenda-view table.rbc-agenda-table { + width: 100%; + border: 1px solid #ddd; + border-spacing: 0; + border-collapse: collapse; +} +.rbc-agenda-view table.rbc-agenda-table tbody > tr > td { + padding: 5px 10px; + vertical-align: top; +} +.rbc-agenda-view table.rbc-agenda-table .rbc-agenda-time-cell { + padding-left: 15px; + padding-right: 15px; + text-transform: lowercase; +} +.rbc-agenda-view table.rbc-agenda-table tbody > tr > td + td { + border-left: 1px solid #ddd; +} +.rbc-rtl .rbc-agenda-view table.rbc-agenda-table tbody > tr > td + td { + border-left-width: 0; + border-right: 1px solid #ddd; +} +.rbc-agenda-view table.rbc-agenda-table tbody > tr + tr { + border-top: 1px solid #ddd; +} +.rbc-agenda-view table.rbc-agenda-table thead > tr > th { + padding: 3px 5px; + text-align: left; + border-bottom: 1px solid #ddd; +} +.rbc-rtl .rbc-agenda-view table.rbc-agenda-table thead > tr > th { + text-align: right; +} + +.rbc-agenda-time-cell { + text-transform: lowercase; +} +.rbc-agenda-time-cell .rbc-continues-after:after { + content: ' »'; +} +.rbc-agenda-time-cell .rbc-continues-prior:before { + content: '« '; +} + +.rbc-agenda-date-cell, +.rbc-agenda-time-cell { + white-space: nowrap; +} + +.rbc-agenda-event-cell { + width: 100%; +} + +.rbc-time-column { + display: flex; + flex-direction: column; + min-height: 100%; +} +.rbc-time-column .rbc-timeslot-group { + flex: 1; +} + +.rbc-timeslot-group { + border-bottom: 1px solid #ddd; + min-height: 40px; + display: flex; + flex-flow: column nowrap; +} + +.rbc-time-gutter, +.rbc-header-gutter { + flex: none; +} + +.rbc-label { + padding: 0 5px; +} + +.rbc-day-slot { + position: relative; +} +.rbc-day-slot .rbc-events-container { + bottom: 0; + left: 0; + position: absolute; + right: 0; + margin-right: 10px; + top: 0; +} +.rbc-day-slot .rbc-events-container.rbc-rtl { + left: 10px; + right: 0; +} +.rbc-day-slot .rbc-event, +.rbc-day-slot .rbc-background-event { + border: 1px solid #265985; + display: flex; + max-height: 100%; + min-height: 20px; + flex-flow: column wrap; + align-items: flex-start; + overflow: hidden; + position: absolute; +} +.rbc-day-slot .rbc-background-event { + opacity: 0.75; +} +.rbc-day-slot .rbc-event-label { + flex: none; + padding-right: 5px; + width: auto; +} +.rbc-day-slot .rbc-event-content { + width: 100%; + flex: 1 1 0; + word-wrap: break-word; + line-height: 1; + height: 100%; + min-height: 1em; +} +.rbc-day-slot .rbc-time-slot { + border-top: 1px solid #f7f7f7; +} + +.rbc-time-view-resources .rbc-time-gutter, +.rbc-time-view-resources .rbc-time-header-gutter { + position: sticky; + left: 0; + background-color: white; + border-right: 1px solid #ddd; + z-index: 10; + margin-right: -1px; +} + +.rbc-time-view-resources .rbc-time-header { + overflow: hidden; +} + +.rbc-time-view-resources .rbc-time-header-content { + min-width: auto; + flex: 1 0 0; + flex-basis: 0px; +} + +.rbc-time-view-resources .rbc-time-header-cell-single-day { + display: none; +} + +.rbc-time-view-resources .rbc-day-slot { + min-width: 140px; +} + +.rbc-time-view-resources .rbc-header, +.rbc-time-view-resources .rbc-day-bg { + width: 140px; + flex: 1 1 0; + flex-basis: 0 px; +} + +.rbc-time-header-content + .rbc-time-header-content { + margin-left: -1px; +} + +.rbc-time-slot { + flex: 1 0 0; +} +.rbc-time-slot.rbc-now { + font-weight: bold; +} + +.rbc-day-header { + text-align: center; +} + +.rbc-slot-selection { + z-index: 10; + position: absolute; + background-color: rgba(0, 0, 0, 0.5); + color: white; + font-size: 75%; + width: 100%; + padding: 3px; +} + +.rbc-slot-selecting { + cursor: move; +} + +.rbc-time-view { + display: flex; + flex-direction: column; + flex: 1; + width: 100%; + border: 1px solid #ddd; + min-height: 0; +} +.rbc-time-view .rbc-time-gutter { + white-space: nowrap; +} +.rbc-time-view .rbc-allday-cell { + box-sizing: content-box; + width: 100%; + height: 100%; + position: relative; +} +.rbc-time-view .rbc-allday-cell + .rbc-allday-cell { + border-left: 1px solid #ddd; +} +.rbc-time-view .rbc-allday-events { + position: relative; + z-index: 4; +} +.rbc-time-view .rbc-row { + box-sizing: border-box; + min-height: 20px; +} + +.rbc-time-header { + display: flex; + flex: 0 0 auto; + flex-direction: row; +} +.rbc-time-header.rbc-overflowing { + border-right: 1px solid #ddd; +} +.rbc-rtl .rbc-time-header.rbc-overflowing { + border-right-width: 0; + border-left: 1px solid #ddd; +} +.rbc-time-header > .rbc-row:first-child { + border-bottom: 1px solid #ddd; +} +.rbc-time-header > .rbc-row.rbc-row-resource { + border-bottom: 1px solid #ddd; +} + +.rbc-time-header-cell-single-day { + display: none; +} + +.rbc-time-header-content { + flex: 1; + display: flex; + min-width: 0; + flex-direction: column; + border-left: 1px solid #ddd; +} +.rbc-rtl .rbc-time-header-content { + border-left-width: 0; + border-right: 1px solid #ddd; +} +.rbc-time-header-content > .rbc-row.rbc-row-resource { + border-bottom: 1px solid #ddd; + flex-shrink: 0; +} + +.rbc-time-content { + display: flex; + flex: 1 0 0%; + align-items: flex-start; + width: 100%; + border-top: 2px solid #ddd; + overflow-y: auto; + position: relative; +} +.rbc-time-content > .rbc-time-gutter { + flex: none; +} +.rbc-time-content > * + * > * { + border-left: 1px solid #ddd; +} +.rbc-rtl .rbc-time-content > * + * > * { + border-left-width: 0; + border-right: 1px solid #ddd; +} +.rbc-time-content > .rbc-day-slot { + width: 100%; + user-select: none; + -webkit-user-select: none; +} + +.rbc-current-time-indicator { + position: absolute; + z-index: 3; + left: 0; + right: 0; + height: 1px; + background-color: #74ad31; + pointer-events: none; +} diff --git a/packages/app/src/components/views/Calendar/style.less b/packages/client/src/schemas/calendar/style2.less similarity index 99% rename from packages/app/src/components/views/Calendar/style.less rename to packages/client/src/schemas/calendar/style2.less index 01fe7d9dcd0912719d62374efc6fa14b8536f015..49a5e9516cb9beed139cb954835a844d101cb768 100644 --- a/packages/app/src/components/views/Calendar/style.less +++ b/packages/client/src/schemas/calendar/style2.less @@ -26,9 +26,7 @@ button.rbc-input::-moz-focus-inner { display: flex; flex-direction: column; align-items: stretch; - &.view-month { - height: 75vh; - } + height: 100%; } .rbc-calendar *, @@ -232,7 +230,7 @@ button.rbc-input::-moz-focus-inner { box-shadow: none; margin: 0; padding: 2px 5px; - background-color: #f0f0f0; + background-color: rgba(240, 240, 240, 0.65); border-radius: 2px; // color: #1890ff; cursor: pointer; diff --git a/packages/client/src/schemas/card-item/index.tsx b/packages/client/src/schemas/card-item/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b9ab881e564516a8cd1631a8eb111d859301f948 --- /dev/null +++ b/packages/client/src/schemas/card-item/index.tsx @@ -0,0 +1,33 @@ +import React, { useContext, useState } from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + SchemaOptionsContext, + useField, + useFieldSchema, +} from '@formily/react'; +import { FormItem as FormilyFormItem } from '@formily/antd'; +import { Card, Dropdown, Menu, Space } from 'antd'; +import classNames from 'classnames'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +// import './style.less'; +import get from 'lodash/get'; +import { uid } from '@formily/shared'; +import { useDesignable } from '../'; +import { AddNew } from '../add-new'; +import { BlockItem } from '../block-item'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { BlockSchemaContext } from '../../context'; + +export const CardItem: any = connect((props) => { + const { schema } = useDesignable(); + return ( + + + {props.children} + + + ); +}); diff --git a/packages/client/src/schemas/cascader/demos/demo1.tsx b/packages/client/src/schemas/cascader/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f47242ca991c1afa1c14d1297d42197498ba52b9 --- /dev/null +++ b/packages/client/src/schemas/cascader/demos/demo1.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { SchemaRenderer } from '../..'; + +const options = [ + { + value: 'zhejiang', + label: 'Zhejiang', + children: [ + { + value: 'hangzhou', + label: 'Hangzhou', + children: [ + { + value: 'xihu', + label: 'West Lake', + }, + ], + }, + ], + }, + { + value: 'jiangsu', + label: 'Jiangsu', + children: [ + { + value: 'nanjing', + label: 'Nanjing', + children: [ + { + value: 'zhonghuamen', + label: 'Zhong Hua Men', + }, + ], + }, + ], + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + name: 'name1', + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Cascader', + 'x-component-props': { + // changeOnSelect: true, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + enum: options, + name: 'name2', + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Cascader', + 'x-component-props': { + changeOnSelect: true, + }, + }, + }, +}; + +export default () => { + return ; +}; diff --git a/packages/client/src/schemas/cascader/demos/demo2.tsx b/packages/client/src/schemas/cascader/demos/demo2.tsx new file mode 100644 index 0000000000000000000000000000000000000000..24ce34333340482fad123f3eef5f1e4244effc69 --- /dev/null +++ b/packages/client/src/schemas/cascader/demos/demo2.tsx @@ -0,0 +1,137 @@ +import React from 'react'; +import { SchemaRenderer } from '../..'; +import { CascaderOptionType } from 'antd/lib/cascader'; +import { ArrayField } from '@formily/core'; +import { action } from '@formily/reactive'; +import { uid } from '@formily/shared'; +import { useField } from '@formily/react'; +import { useEffect } from 'react'; +import { useRequest } from 'ahooks'; +import { Resource } from '../../../resource'; + +const options = [ + { + value: 'zhejiang', + label: 'Zhejiang', + isLeaf: false, + }, + { + value: 'jiangsu', + label: 'Jiangsu', + isLeaf: false, + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + name: 'name1', + // enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Cascader', + 'x-component-props': { + changeOnSelect: true, + loadData: '{{ loadChinaRegionData }}', + labelInValue: true, + maxLevel: 3, + fieldNames: { + label: 'name', + value: 'code', + children: 'children', + }, + // changeOnSelect: true, + }, + 'x-reactions': [ + '{{useAsyncDataSource(loadChinaRegions)}}', + { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + ], + }, + read: { + type: 'string', + title: `阅读模式`, + enum: options, + name: 'name2', + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Cascader', + 'x-component-props': { + changeOnSelect: true, + loadData: '{{ loadChinaRegionData }}', + labelInValue: true, + fieldNames: { + label: 'name', + value: 'code', + children: 'children', + }, + }, + }, + }, +}; + +// disableAsyncDataSource +const loadChinaRegions = async (field) => { + const maxLevel = field.componentProps.maxLevel || 3; + const resource = Resource.make('china_regions'); + const { data } = await resource.list({ + perPage: -1, + filter: { + level: 1, + }, + }); + return ( + data?.map((item) => { + if (maxLevel !== 1) { + item.isLeaf = false; + } + return item; + }) || [] + ); +}; + +const loadChinaRegionData = ( + selectedOptions: CascaderOptionType[], + field: ArrayField, +) => { + const maxLevel = field.componentProps.maxLevel || 3; + const targetOption = selectedOptions[selectedOptions.length - 1]; + targetOption.loading = true; + const resource = Resource.make('china_regions'); + resource + .list({ + perPage: -1, + filter: { + parent_code: targetOption['code'], + }, + }) + .then((data) => { + targetOption.loading = false; + targetOption.children = + data?.data?.map((item) => { + if (maxLevel > item.level) { + item.isLeaf = false; + } + return item; + }) || []; + field.dataSource = [...field.dataSource]; + }); +}; + +export default () => { + return ( + + ); +}; diff --git a/packages/client/src/schemas/cascader/index.md b/packages/client/src/schemas/cascader/index.md new file mode 100644 index 0000000000000000000000000000000000000000..812f06b62a1bbdfaf3fb23cf46d9b65a0057021a --- /dev/null +++ b/packages/client/src/schemas/cascader/index.md @@ -0,0 +1,28 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Cascader - 级联选择 + +## Node Tree + +
+  
+
+ +## Designable Bar + +- Cascader.DesignableBar + +## Examples + +### 基本用法 + + + +### 省市区级联 + + \ No newline at end of file diff --git a/packages/client/src/schemas/cascader/index.tsx b/packages/client/src/schemas/cascader/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..311d2072fe1694d0f410721163222a1742c74a78 --- /dev/null +++ b/packages/client/src/schemas/cascader/index.tsx @@ -0,0 +1,158 @@ +import React from 'react'; +import { + connect, + mapReadPretty, + mapProps, + useField, + observer, +} from '@formily/react'; +import { Cascader as AntdCascader } from 'antd'; +import { Display } from '../display'; +import { LoadingOutlined } from '@ant-design/icons'; +import { CascaderOptionType } from 'antd/lib/cascader'; +import { ArrayField } from '@formily/core'; +import { toArr } from '@formily/shared'; +import { isBoolean, omit } from 'lodash'; + +const defaultFieldNames = { + label: 'label', + value: 'value', + children: 'children', +}; + +export const Cascader = connect( + (props: any) => { + const field = useField(); + const { + value, + onChange, + loadData, + labelInValue, + fieldNames = defaultFieldNames, + changeOnSelectLast, + changeOnSelect, + ...others + } = props; + console.log('changeOnSelectLast', changeOnSelectLast); + // 兼容值为 object[] 的情况 + const toValue = () => { + return toArr(value).map((item) => { + if (typeof item === 'object') { + return item[fieldNames.value]; + } + return item; + }); + }; + const displayRender = (labels: string[], selectedOptions: any[]) => { + const values = toArr(value); + if (values.length !== labels.length) { + labels = toValue(); + selectedOptions = values; + } + if (selectedOptions.length === 0) { + selectedOptions = values; + } + return labels.map((label, i) => { + let option = selectedOptions[i]; + if ( + !option || + typeof option === 'string' || + typeof option === 'number' + ) { + option = { [fieldNames.label]: label, [fieldNames.value]: label }; + } + if (i === labels.length - 1) { + return ( + + {option[fieldNames.label]} + + ); + } + return ( + + {option[fieldNames.label]} /{' '} + + ); + }); + }; + if (loadData) { + Object.assign(others, { + loadData: (selectedOptions: CascaderOptionType[]) => { + // 将 field 传给 loadData + loadData(selectedOptions, field); + }, + }); + } + return ( + { + if (labelInValue) { + onChange( + selectedOptions.map((option) => + omit(option, [fieldNames.children]), + ), + ); + } else { + onChange(value); + } + console.log({ value, selectedOptions }); + }} + /> + ); + }, + mapProps( + { + dataSource: 'options', + }, + (props, field) => { + return { + ...props, + suffixIcon: + field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffixIcon + ), + }; + }, + ), + mapReadPretty((props) => { + const { fieldNames = defaultFieldNames } = props; + const values = toArr(props.value); + const len = values.length; + const field = useField(); + let dataSource = field.dataSource; + const data = []; + for (const item of values) { + if (typeof item === 'object') { + data.push(item); + } else { + const curr = dataSource?.find((v) => v[fieldNames.value] === item); + dataSource = curr?.[fieldNames.children] || []; + data.push(curr || { label: item, value: item }); + } + } + // console.log({ data }); + return ( +
+ {data.map((item, index) => { + return ( + + {typeof item === 'object' ? item[fieldNames.label] : item} + {len > index + 1 && ' / '} + + ); + })} +
+ ); + }), +); + +export default Cascader; diff --git a/packages/client/src/schemas/chart/G2Plot.tsx b/packages/client/src/schemas/chart/G2Plot.tsx new file mode 100644 index 0000000000000000000000000000000000000000..bc91acde760abf93852db4a97707efeb3e0948a5 --- /dev/null +++ b/packages/client/src/schemas/chart/G2Plot.tsx @@ -0,0 +1,52 @@ +import React, { useEffect, useRef, forwardRef } from 'react'; +import cls from 'classnames'; + +export type ReactG2PlotProps = { + readonly className?: string; + readonly plot: any; + readonly config: O; +}; + +export default forwardRef(function ( + props: ReactG2PlotProps, + ref: any, +) { + const { className, plot, config } = props; + + const containerRef = useRef(undefined); + const plotRef = useRef(undefined); + + function syncRef(source, target) { + if (typeof target === 'function') { + target(source.current); + } else if (target) { + target.current = source.current; + } + } + + function renderPlot() { + if (plotRef.current) { + plotRef.current.update(config); + } else { + plotRef.current = new plot(containerRef.current, config); + plotRef.current.render(); + } + + syncRef(plotRef, ref); + } + + function destoryPlot() { + if (plotRef.current) { + plotRef.current.destroy(); + plotRef.current = undefined; + } + } + + useEffect(() => { + renderPlot(); + + return () => destoryPlot(); + }, [config, plot]); + + return
; +}); diff --git a/packages/client/src/schemas/chart/index.md b/packages/client/src/schemas/chart/index.md new file mode 100644 index 0000000000000000000000000000000000000000..2c251a5996a3c076b8b91d1152237f3d6fa9b41a --- /dev/null +++ b/packages/client/src/schemas/chart/index.md @@ -0,0 +1,10 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Chart - 图表 + +Coming soon... \ No newline at end of file diff --git a/packages/client/src/schemas/chart/index.tsx b/packages/client/src/schemas/chart/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..aa9f682f9a208c2d1bc530567aece255d8a67ec7 --- /dev/null +++ b/packages/client/src/schemas/chart/index.tsx @@ -0,0 +1,100 @@ +import React, { useContext } from 'react'; + +import { + connect, + mapProps, + observer, + useField, + useFieldSchema, + mapReadPretty, +} from '@formily/react'; +import { Button, Dropdown, Input as AntdInput, Menu, Space } from 'antd'; +import { LoadingOutlined, MenuOutlined, DragOutlined } from '@ant-design/icons'; +import { useDesignable } from '../../components/schema-renderer'; +import { useState } from 'react'; +import AddNew from '../add-new'; +import cls from 'classnames'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { uid } from '@formily/shared'; +import { removeSchema, updateSchema } from '..'; +import { isGridRowOrCol } from '../grid'; +import G2Plot from './G2Plot'; +import { Column, Line, Pie, Bar } from '@antv/g2plot'; +import { DragHandle } from '../../components/Sortable'; + +export const Chart: any = {}; + +Chart.Column = observer((props: any) => { + return ; +}); + +Chart.Line = observer((props: any) => { + return ; +}); + +Chart.Pie = observer((props: any) => { + return ; +}); + +Chart.Bar = observer((props: any) => { + return ; +}); + +Chart.DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + if (!designable) { + return null; + } + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + setVisible(visible); + }} + overlay={ + + { + field.readPretty = false; + setVisible(false); + }} + > + 编辑图表 + + + { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/checkbox/index.md b/packages/client/src/schemas/checkbox/index.md new file mode 100644 index 0000000000000000000000000000000000000000..8b1266aebc367c4ef2786f37b0029b97ba731823 --- /dev/null +++ b/packages/client/src/schemas/checkbox/index.md @@ -0,0 +1,127 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + + +# Checkbox - 多选框 + +## Node Tree + +
+// 勾选
+
+// 多选框
+
+
+ +## Designable Bar + +- Checkbox.DesignableBar + +## Examples + +### 勾选 + +```tsx +/** + * title: 勾选 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'string', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 组 + +```tsx +/** + * title: 组 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const options = [ + { + label: '选项1', + value: 1, + color: 'red', + }, + { + label: '选项2', + value: 2, + color: 'blue', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox.Group', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + enum: options, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox.Group', + } + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/checkbox/index.tsx b/packages/client/src/schemas/checkbox/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..75a321fb188ec895ce2e15590756b77d97a39aae --- /dev/null +++ b/packages/client/src/schemas/checkbox/index.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { connect, mapProps, mapReadPretty, useField } from '@formily/react'; +import { Checkbox as AntdCheckbox, Tag } from 'antd'; +import { CheckboxProps, CheckboxGroupProps } from 'antd/lib/checkbox'; +import uniq from 'lodash/uniq'; +import { CheckOutlined, CloseOutlined } from '@ant-design/icons'; +import { isValid } from '@formily/shared'; + +type ComposedCheckbox = React.FC & { + Group?: React.FC; + __ANT_CHECKBOX?: boolean; +}; + +export const Checkbox: ComposedCheckbox = connect( + AntdCheckbox, + mapProps( + { + value: 'checked', + onInput: 'onChange', + }, + (props, field) => { + // console.log({ props, field }); + return { + ...props, + }; + }, + ), + mapReadPretty((props) => { + if (!isValid(props.value)) { + return
; + } + return props.value ? ( + + ) : ( + + ); + }), +); + +Checkbox.__ANT_CHECKBOX = true; + +Checkbox.Group = connect( + AntdCheckbox.Group, + mapProps({ + dataSource: 'options', + }), + mapReadPretty((props) => { + if (!isValid(props.value)) { + return
; + } + const { options = [] } = props; + const field = useField(); + const dataSource = field.dataSource || []; + const value = uniq(field.value ? field.value : []); + return ( +
+ {dataSource + .filter((option) => value.includes(option.value)) + .map((option, key) => ( + + {option.label} + + ))} +
+ ); + }), +); + +export default Checkbox; diff --git a/packages/client/src/schemas/color-select/index.md b/packages/client/src/schemas/color-select/index.md new file mode 100644 index 0000000000000000000000000000000000000000..69b36d3954e5127b01a70d114e5d3a24d04552ca --- /dev/null +++ b/packages/client/src/schemas/color-select/index.md @@ -0,0 +1,75 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# ColorSelect - 颜色选择器 + +## Node Tree + +
+
+
+ +## Designable Bar + +- ColorSelect.DesignableBar + +## Examples + +### 颜色选择器 + +```tsx +/** + * title: 颜色选择器 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'icon', + type: 'string', + title: `编辑模式`, + name: 'name1', + 'x-decorator': 'FormItem', + 'x-component': 'ColorSelect', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'icon', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'ColorSelect', + }, + designable: { + interface: 'icon', + type: 'string', + title: `配置模式`, + // 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-component': 'ColorSelect', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/color-select/index.tsx b/packages/client/src/schemas/color-select/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..88bb669d358d5915afe6f072b7885ff814f6e26d --- /dev/null +++ b/packages/client/src/schemas/color-select/index.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { connect, mapProps, mapReadPretty } from '@formily/react'; +import { Tag, Select } from 'antd'; +import { LoadingOutlined } from '@ant-design/icons'; + +const colors = { + red: '薄暮', + magenta: '法式洋红', + volcano: '火山', + orange: '日暮', + gold: '金盏花', + lime: '青柠', + green: '极光绿', + cyan: '明青', + blue: '拂晓蓝', + geekblue: '极客蓝', + purple: '酱紫', + default: '默认', +}; + +export const ColorSelect = connect( + (props) => { + return ( + + ); + }, + mapProps((props, field) => { + return { + ...props, + suffix: ( + + {field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffix + )} + + ), + }; + }), + mapReadPretty((props) => { + const { value } = props; + if (!colors[value]) { + return null; + } + return {colors[value]}; + }), +); + +export default ColorSelect; diff --git a/packages/client/src/schemas/database-field/demos/demo1.tsx b/packages/client/src/schemas/database-field/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..58706661ec70bb1bfddfc6b6bc5068a58094423f --- /dev/null +++ b/packages/client/src/schemas/database-field/demos/demo1.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { createForm } from '@formily/core'; +import { SchemaRenderer } from '../../'; +import { observer, connect, useField } from '@formily/react'; + +const schema = { + type: 'object', + properties: { + fields: { + type: 'array', + 'x-component': 'DatabaseField', + default: [ + { + id: 1, + interface: 'string', + dataType: 'string', + name: 'title', + ui: { + title: '标题', + }, + }, + { + id: 2, + dataType: 'text', + interface: 'textarea', + name: 'content', + ui: { + title: '内容', + }, + }, + ], + }, + }, +}; + +const form = createForm(); + +export default observer(() => { + return ( +
+ +
+ ); +}); diff --git a/packages/client/src/schemas/database-field/demos/demo2.tsx b/packages/client/src/schemas/database-field/demos/demo2.tsx new file mode 100644 index 0000000000000000000000000000000000000000..902c6149fa815c813d7a37e23793a25dbabca3f5 --- /dev/null +++ b/packages/client/src/schemas/database-field/demos/demo2.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { createForm } from '@formily/core'; +import { SchemaRenderer } from '../../'; +import { observer, connect, useField, ISchema } from '@formily/react'; + +const schema: ISchema = { + type: 'array', + name: 'collections', + 'x-component': 'DatabaseCollection', + 'x-component-props': {}, + default: [ + { + name: 'test1', + title: '数据表 1', + }, + { + name: 'test2', + title: '数据表 2', + }, + ], + properties: { + title: { + type: 'string', + title: '数据表名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + name: { + type: 'string', + title: '数据表标识', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-read-pretty': true, + }, + fields: { + type: 'array', + title: '数据表字段', + 'x-decorator': 'FormItem', + 'x-component': 'DatabaseField', + default: [], + }, + }, +}; + +const form = createForm(); + +export default observer(() => { + return ( +
+ +
+ ); +}); diff --git a/packages/client/src/schemas/database-field/index.md b/packages/client/src/schemas/database-field/index.md new file mode 100644 index 0000000000000000000000000000000000000000..debe92bc9da89d2cd680a5973fa9aea5eb0de7ce --- /dev/null +++ b/packages/client/src/schemas/database-field/index.md @@ -0,0 +1,24 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# DatabaseField - 数据表字段 + +## Node Tree + +
+
+
+ +## Designable Bar + +暂无 + +## Examples + + + + diff --git a/packages/client/src/schemas/database-field/index.tsx b/packages/client/src/schemas/database-field/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..743d1b18be0873090a2d61a50ef3631b3910857a --- /dev/null +++ b/packages/client/src/schemas/database-field/index.tsx @@ -0,0 +1,499 @@ +import React, { forwardRef, useState } from 'react'; +import { + observer, + connect, + useField, + RecursionField, + ISchema, + Schema, + useFieldSchema, + useForm, + FormConsumer, +} from '@formily/react'; +import { ArrayCollapse, FormLayout } from '@formily/antd'; +import { uid, isValid } from '@formily/shared'; +import '@formily/antd/lib/form-tab/style'; +import { + Collapse, + Button, + Dropdown, + Menu, + Tag, + Select, + Divider, + Input, + Badge, + message, + Drawer, + Space, + Tooltip, +} from 'antd'; +import { options, interfaces, getDefaultFields } from './interfaces'; +import { + DeleteOutlined, + DatabaseOutlined, + PlusOutlined, + CloseOutlined, + MenuOutlined, +} from '@ant-design/icons'; +import cls from 'classnames'; +import './style.less'; +import Modal from 'antd/lib/modal/Modal'; +import { clone, cloneDeep, get } from 'lodash'; +import { useEffect } from 'react'; +import { useRequest } from 'ahooks'; +import { createOrUpdateCollection, deleteCollection } from '..'; +import { useCollectionsContext } from '../../constate/Collections'; +import { + DragHandle, + SortableItem, + SortableItemContext, +} from '../../components/Sortable'; +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { createPortal } from 'react-dom'; +import { useClient } from '../../constate'; + +interface SelectOptionProps { + id: any; + title: string; + data?: any; + onRemove?: any; + showRemove?: boolean; +} + +function SelectOption(props: SelectOptionProps) { + const { id, data, onRemove, showRemove } = props; + return ( + +
+ ((props, ref) => { + return ; + })} + /> + + {data.title} + {showRemove && ( + + )} +
+
+ ); +} + +export const DatabaseCollection = observer((props) => { + const field = useField(); + const [visible, setVisible] = useState(false); + const [open, setOpen] = useState(false); + const schema = useFieldSchema(); + const [activeIndex, setActiveIndex] = useState(0); + const form = useForm(); + const [newValue, setNewValue] = useState(''); + const { loading, refresh, collections = [] } = useCollectionsContext(); + const [dragOverlayContent, setDragOverlayContent] = useState(''); + const { collectionMoveToAfter } = useClient(); + + useEffect(() => { + field.setValue(collections); + console.log('onSuccess', collections); + }, [collections]); + + return ( +
+ + + + + { + setDragOverlayContent(event.active?.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + const sourceName = event.active?.data?.current?.name; + const targetName = event.over?.data?.current?.name; + console.log({ sourceName, targetName }); + await collectionMoveToAfter(sourceName, targetName); + await refresh(); + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} + + +
+ } + visible={visible} + onClose={() => { + setVisible(false); + }} + footer={ + + + + + } + // okText={'保存'} + // cancelText={'关闭'} + // onOk={async () => { + // try { + // form.clearErrors(); + // await form.validate(`${field.address.entire}.${activeIndex}.*`); + // delete field.value[activeIndex]['unsaved']; + // await createOrUpdateCollection(field.value[activeIndex]); + // await refresh(); + // message.success('保存成功'); + // } catch (error) {} + // }} + > + + + {/* + {(form) =>
{JSON.stringify(form.values, null, 2)}
} +
*/} +
+ +
+ ); +}); + +export const DatabaseField: any = observer((props) => { + const field = useField(); + useEffect(() => { + if (!field.value) { + field.setValue([]); + } + }, []); + const [activeKey, setActiveKey] = useState(null); + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( +
+ { + setDragOverlayContent(event.active?.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + const fromIndex = event.active?.data?.current?.index; + const toIndex = event.over?.data?.current?.index; + if (isValid(fromIndex) && isValid(toIndex)) { + field.move(fromIndex, toIndex); + } + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} + { + setActiveKey(key); + }} + className={cls({ empty: !field.value?.length })} + accordion + > + {field.value?.map((item, index) => { + if (!item.interface) { + return; + } + const schema = cloneDeep(interfaces.get(item.interface)); + if (!schema) { + console.error('schema invalid'); + return; + } + const path = field.address.concat(index); + const errors = field.form.queryFeedbacks({ + type: 'error', + address: `*(${path},${path}.*)`, + }); + return ( + + + {(item.uiSchema && item.uiSchema.title) || ( + 未命名 + )}{' '} + + {schema.title} + + + {item.name} + + + } + extra={ + item.privilege === 'undelete' + ? [] + : [ + , + { + e.stopPropagation(); + field.remove(index); + }} + />, + ] + } + key={item.key} + forceRender + > + + + ); + })} + + + { + const schema = interfaces.get(info.key); + if (!schema) { + return; + } + const data = { + ...cloneDeep(schema.default), + key: uid(), + name: `f_${uid()}`, + interface: info.key, + }; + if (schema.initialize) { + schema.initialize(data); + } + field.push(data); + setActiveKey(data.key); + console.log('info.key', field.value); + }} + > + {options.map( + (option, groupIndex) => + option.children.length > 0 && ( + + {option.children.map((item) => ( + {item.title} + ))} + + ), + )} + + } + > + + +
+ ); +}); diff --git a/packages/client/src/schemas/database-field/interfaces/attachment.ts b/packages/client/src/schemas/database-field/interfaces/attachment.ts new file mode 100644 index 0000000000000000000000000000000000000000..cc8ef0d1b05eb0d7350b4c69cdec167914656627 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/attachment.ts @@ -0,0 +1,50 @@ +import { FieldOptions } from '.'; +import { defaultProps } from './properties'; +import { uid } from '@formily/shared'; + +export const attachment: FieldOptions = { + name: 'attachment', + type: 'object', + group: 'media', + title: '附件', + isAssociation: true, + default: { + dataType: 'belongsToMany', + target: 'attachments', + // name, + uiSchema: { + type: 'array', + // title, + 'x-component': 'Upload.Attachment', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Upload.DesignableBar', + }, + }, + initialize: (values: any) => { + if (!values.through) { + values.through = `t_${uid()}`; + } + if (!values.foreignKey) { + values.foreignKey = `f_${uid()}`; + } + if (!values.otherKey) { + values.otherKey = `f_${uid()}`; + } + if (!values.sourceKey) { + values.sourceKey = 'id'; + } + if (!values.targetKey) { + values.targetKey = 'id'; + } + }, + properties: { + ...defaultProps, + 'uiSchema.x-component-props.multiple': { + type: 'boolean', + 'x-content': '允许上传多个文件', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + default: true, + }, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/checkbox.ts b/packages/client/src/schemas/database-field/interfaces/checkbox.ts new file mode 100644 index 0000000000000000000000000000000000000000..11205fe08c7831597fe5a28c3d2bfc09970def0a --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/checkbox.ts @@ -0,0 +1,28 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const checkbox: FieldOptions = { + name: 'checkbox', + type: 'object', + group: 'choices', + order: 1, + title: '勾选', + default: { + dataType: 'boolean', + // name, + uiSchema: { + type: 'boolean', + // title, + 'x-component': 'Checkbox', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Checkbox.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, + operations: [ + { label: '是', value: '$isTruly', selected: true, noValue: true }, + { label: '否', value: '$isFalsy', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/checkboxGroup.ts b/packages/client/src/schemas/database-field/interfaces/checkboxGroup.ts new file mode 100644 index 0000000000000000000000000000000000000000..45208b11cab767ca0a28b6a18e9b6f8aa4aeab90 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/checkboxGroup.ts @@ -0,0 +1,28 @@ +import { multipleSelect } from './multipleSelect'; +import { defaultProps, dataSource } from './properties'; +import { FieldOptions } from '.'; + +export const checkboxGroup: FieldOptions = { + name: 'checkboxGroup', + type: 'object', + group: 'choices', + order: 5, + title: '复选框', + default: { + interface: 'checkboxGroup', + dataType: 'json', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Checkbox.Group', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Checkbox.Group.DesignableBar', + }, + }, + properties: { + ...defaultProps, + 'uiSchema.enum': dataSource, + }, + operations: multipleSelect.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/chinaRegion.ts b/packages/client/src/schemas/database-field/interfaces/chinaRegion.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc422182b8aa6e6eec88360f3da497d0b4bb63e4 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/chinaRegion.ts @@ -0,0 +1,81 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; +import { uid } from '@formily/shared'; + +export const chinaRegion: FieldOptions = { + name: 'chinaRegion', + type: 'object', + group: 'choices', + order: 7, + title: '中国行政区划', + isAssociation: true, + default: { + dataType: 'belongsToMany', + target: 'china_regions', + targetKey: 'code', + // name, + uiSchema: { + type: 'array', + // title, + 'x-component': 'Cascader', + 'x-component-props': { + changeOnSelectLast: false, + loadData: '{{ ChinaRegion.loadData() }}', + labelInValue: true, + maxLevel: 3, + fieldNames: { + label: 'name', + value: 'code', + children: 'children', + }, + }, + 'x-reactions': [ + '{{ ChinaRegion.useFieldValue }}', + '{{ useAsyncDataSource(ChinaRegion.loadDataSource()) }}', + ], + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Cascader.DesignableBar', + }, + }, + initialize: (values: any) => { + if (!values.through) { + values.through = `t_${uid()}`; + } + if (!values.foreignKey) { + values.foreignKey = `f_${uid()}`; + } + if (!values.otherKey) { + values.otherKey = `f_${uid()}`; + } + if (!values.sourceKey) { + values.sourceKey = 'id'; + } + if (!values.targetKey) { + values.targetKey = 'id'; + } + }, + properties: { + ...defaultProps, + 'uiSchema.x-component-props.maxLevel': { + type: 'number', + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + title: '可选择的层级', + default: 3, + enum: [ + { value: 1, label: '省' }, + { value: 2, label: '市' }, + { value: 3, label: '区/县' }, + { value: 4, label: '乡镇/街道' }, + { value: 5, label: '村/居委会' }, + ], + }, + 'uiSchema.x-component-props.changeOnSelectLast': { + type: 'boolean', + 'x-component': 'Checkbox', + 'x-content': '必须选到最后一级', + 'x-decorator': 'FormItem', + }, + }, + operations: [{ label: '等于', value: 'code.in' }], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/createdAt.ts b/packages/client/src/schemas/database-field/interfaces/createdAt.ts new file mode 100644 index 0000000000000000000000000000000000000000..bc516c2fb404a72e536e3354307599f5932aa8f9 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/createdAt.ts @@ -0,0 +1,31 @@ +import { datetime } from './datetime'; +import { dateTimeProps, defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const createdAt: FieldOptions = { + name: 'createdAt', + type: 'object', + group: 'systemInfo', + order: 1, + title: '添加时间', + sortable: true, + default: { + dataType: 'date', + field: 'created_at', + // name, + uiSchema: { + type: 'datetime', + title: '添加时间', + 'x-component': 'DatePicker', + 'x-component-props': {}, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'DatePicker.DesignableBar', + }, + }, + properties: { + ...defaultProps, + ...dateTimeProps, + }, + operations: datetime.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/createdBy.ts b/packages/client/src/schemas/database-field/interfaces/createdBy.ts new file mode 100644 index 0000000000000000000000000000000000000000..1350757a12037fe288ba6f19cc4f3dc3c7a2796a --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/createdBy.ts @@ -0,0 +1,35 @@ +import { ISchema } from '@formily/react'; +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const createdBy: FieldOptions = { + name: 'createdBy', + type: 'object', + group: 'systemInfo', + order: 3, + title: '添加人', + isAssociation: true, + default: { + dataType: 'belongsTo', + target: 'users', + foreignKey: 'created_by_id', + // name, + uiSchema: { + type: 'object', + title: '添加人', + 'x-component': 'Select.Drawer', + 'x-component-props': { + fieldNames: { + value: 'id', + label: 'nickname', + }, + }, + 'x-decorator': 'FormItem', + 'x-read-pretty': true, + 'x-designable-bar': 'Select.Drawer.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/datetime.ts b/packages/client/src/schemas/database-field/interfaces/datetime.ts new file mode 100644 index 0000000000000000000000000000000000000000..27056da999781f82b0bb6ef0915ff2bd8c8b8cb6 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/datetime.ts @@ -0,0 +1,40 @@ +import { ISchema } from '@formily/react'; +import { dateTimeProps, defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const datetime: FieldOptions = { + name: 'datetime', + type: 'object', + group: 'datetime', + order: 1, + title: '日期', + sortable: true, + default: { + dataType: 'date', + // name, + uiSchema: { + type: 'datetime', + // title, + 'x-component': 'DatePicker', + 'x-component-props': { + showTime: false, + }, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'DatePicker.DesignableBar', + }, + }, + properties: { + ...defaultProps, + ...dateTimeProps, + }, + operations: [ + { label: '等于', value: '$dateOn', selected: true }, + { label: '不等于', value: '$dateNotOn' }, + { label: '早于', value: '$dateBefore' }, + { label: '晚于', value: '$dateAfter' }, + { label: '不早于', value: '$dateNotBefore' }, + { label: '不晚于', value: '$dateNotAfter' }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/email.ts b/packages/client/src/schemas/database-field/interfaces/email.ts new file mode 100644 index 0000000000000000000000000000000000000000..039e3cb7a22fb8acf6ddc1520c0a6f10b096738e --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/email.ts @@ -0,0 +1,28 @@ +import { defaultProps } from './properties'; +import { string } from './string'; +import { FieldOptions } from '.'; + +export const email: FieldOptions = { + name: 'email', + type: 'object', + group: 'basic', + order: 4, + title: '电子邮箱', + sortable: true, + default: { + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Input', + 'x-decorator': 'FormItem', + 'x-validator': 'email', + 'x-designable-bar': 'Input.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, + operations: string.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/icon.ts b/packages/client/src/schemas/database-field/interfaces/icon.ts new file mode 100644 index 0000000000000000000000000000000000000000..9969e6a9452a8a9975a66bbe2f73014fc85fd576 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/icon.ts @@ -0,0 +1,24 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const icon: FieldOptions = { + name: 'icon', + type: 'object', + group: 'basic', + order: 8, + title: '图标', + default: { + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'IconPicker', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'IconPicker.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/index.ts b/packages/client/src/schemas/database-field/interfaces/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..59032d8c121e0242ab27a12beea9b818a09ef9a5 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/index.ts @@ -0,0 +1,75 @@ +import { cloneDeep, set } from 'lodash'; +import * as types from './types'; +import { uid } from '@formily/shared'; +import { ISchema } from '../..'; + +interface IDefaultSchema { + dataType: string; + uiSchema?: ISchema; + [key: string]: any; +} + +export interface FieldOptions extends ISchema { + [key: string]: any; + default?: IDefaultSchema; +} + +export const interfaces = new Map(); + +const fields = {}; +const groupLabels = {}; + +export function getDefaultFields() { + const defaults = ['createdAt', 'updatedAt', 'createdBy', 'updatedBy']; + return defaults.map((key) => { + return { + interface: key, + key: uid(), + name: uid(), + privilege: 'undelete', + ...cloneDeep(interfaces.get(key)?.default), + }; + }); +} + +export function registerField(group: string, type: string, schema) { + fields[group] = fields[group] || {}; + set(fields, [group, type], schema); + interfaces.set(type, schema); +} + +export function registerGroupLabel(key: string, label: string) { + groupLabels[key] = label; +} + +Object.keys(types).forEach((type) => { + const schema = types[type]; + registerField(schema.group || 'others', type, { order: 0, ...schema }); +}); + +registerGroupLabel('basic', '基本类型'); +registerGroupLabel('choices', '选择类型'); +registerGroupLabel('media', '多媒体类型'); +registerGroupLabel('datetime', '日期和时间'); +registerGroupLabel('relation', '关系类型'); +registerGroupLabel('systemInfo', '系统信息'); +registerGroupLabel('others', '其他类型'); + +export const options = Object.keys(groupLabels).map((groupName) => { + return { + label: groupLabels[groupName], + children: Object.keys(fields[groupName] || {}) + .map((type) => { + return { + name: type, + ...fields[groupName][type], + }; + }) + .sort((a, b) => a.order - b.order), + }; +}); + +export const isAssociation = (field) => { + const options = interfaces.get(field.interface); + return options?.isAssociation; +}; diff --git a/packages/client/src/schemas/database-field/interfaces/linkTo.ts b/packages/client/src/schemas/database-field/interfaces/linkTo.ts new file mode 100644 index 0000000000000000000000000000000000000000..2992c19c921eedd20e2cae04e41d39e3a80fa10c --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/linkTo.ts @@ -0,0 +1,68 @@ +import { defaultProps } from './properties'; +import { uid } from '@formily/shared'; +import { FieldOptions } from '.'; + +export const linkTo: FieldOptions = { + name: 'linkTo', + type: 'object', + group: 'relation', + order: 1, + title: '关联字段', + isAssociation: true, + default: { + dataType: 'belongsToMany', + // name, + uiSchema: { + type: 'array', + // title, + 'x-component': 'Select.Drawer', + 'x-component-props': {}, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Select.Drawer.DesignableBar', + }, + }, + initialize: (values: any) => { + if (values.dataType === 'belongsToMany') { + if (!values.through) { + values.through = `t_${uid()}`; + } + if (!values.foreignKey) { + values.foreignKey = `f_${uid()}`; + } + if (!values.otherKey) { + values.otherKey = `f_${uid()}`; + } + if (!values.sourceKey) { + values.sourceKey = 'id'; + } + if (!values.targetKey) { + values.targetKey = 'id'; + } + } + }, + properties: { + ...defaultProps, + target: { + type: 'string', + title: '要关联的数据表', + required: true, + 'x-reactions': ['{{useAsyncDataSource(loadCollections)}}'], + 'x-decorator': 'FormItem', + 'x-component': 'Select', + }, + // 'uiSchema.x-component-props.fieldNames.label': { + // type: 'string', + // title: '要显示的标题字段', + // required: true, + // 'x-reactions': ['{{useAsyncDataSource(loadCollectionFields)}}'], + // 'x-decorator': 'FormItem', + // 'x-component': 'Select', + // }, + 'uiSchema.x-component-props.multiple': { + type: 'boolean', + 'x-content': '允许关联多条记录', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + }, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/markdown.ts b/packages/client/src/schemas/database-field/interfaces/markdown.ts new file mode 100644 index 0000000000000000000000000000000000000000..c9b7dcf260b825ab27a94f6b688f64c4db6f6b00 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/markdown.ts @@ -0,0 +1,23 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const markdown: FieldOptions = { + name: 'markdown', + type: 'object', + title: 'Markdown', + group: 'media', + default: { + dataType: 'text', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Markdown', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Markdown.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/multipleSelect.ts b/packages/client/src/schemas/database-field/interfaces/multipleSelect.ts new file mode 100644 index 0000000000000000000000000000000000000000..5f67c94c5a8dfcc2b7bcc2eb55baf5ea51b8c810 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/multipleSelect.ts @@ -0,0 +1,46 @@ +import { defaultProps, dataSource } from './properties'; +import { FieldOptions } from '.'; + +export const multipleSelect: FieldOptions = { + name: 'multipleSelect', + type: 'object', + group: 'choices', + order: 3, + title: '下拉选择(多选)', + default: { + dataType: 'json', + // name, + uiSchema: { + type: 'array', + // title, + 'x-component': 'Select', + 'x-component-props': { + mode: 'multiple', + }, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Select.DesignableBar', + enum: [], + }, + }, + properties: { + ...defaultProps, + 'uiSchema.enum': dataSource, + }, + operations: [ + { + label: '等于', + value: '$match', + selected: true, + schema: { 'x-component': 'Select' }, + }, + { + label: '不等于', + value: '$notMatch', + schema: { 'x-component': 'Select' }, + }, + { label: '包含', value: '$anyOf', schema: { 'x-component': 'Select' } }, + { label: '不包含', value: '$noneOf', schema: { 'x-component': 'Select' } }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/number.ts b/packages/client/src/schemas/database-field/interfaces/number.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cf9261d8ffe6b7aa29699551dfed4e6deccb448 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/number.ts @@ -0,0 +1,55 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const number: FieldOptions = { + name: 'number', + type: 'object', + group: 'basic', + order: 5, + title: '数字', + sortable: true, + default: { + dataType: 'float', + // name, + uiSchema: { + type: 'number', + // title, + 'x-component': 'InputNumber', + 'x-component-props': { + stringMode: true, + step: '0', + }, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'InputNumber.DesignableBar', + }, + }, + properties: { + ...defaultProps, + 'uiSchema.x-component-props.step': { + type: 'string', + title: '精度', + 'x-component': 'Select', + 'x-decorator': 'FormItem', + default: '0', + enum: [ + { value: '0', label: '1' }, + { value: '0.1', label: '1.0' }, + { value: '0.01', label: '1.00' }, + { value: '0.001', label: '1.000' }, + { value: '0.0001', label: '1.0000' }, + { value: '0.00001', label: '1.00000' }, + ], + }, + }, + operations: [ + { label: '等于', value: 'eq', selected: true }, + { label: '不等于', value: 'ne' }, + { label: '大于', value: 'gt' }, + { label: '大于等于', value: 'gte' }, + { label: '小于', value: 'lt' }, + { label: '小于等于', value: 'lte' }, + // {label: '介于', value: 'between'}, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/password.ts b/packages/client/src/schemas/database-field/interfaces/password.ts new file mode 100644 index 0000000000000000000000000000000000000000..3366cb46276960e929b99fd09d87b27f1544a6d0 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/password.ts @@ -0,0 +1,24 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const password: FieldOptions = { + name: 'password', + type: 'object', + group: 'basic', + order: 7, + title: '密码', + default: { + dataType: 'password', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Password', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Password.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/percent.ts b/packages/client/src/schemas/database-field/interfaces/percent.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa54d6c01bcbb67a87020378b64434d788f14203 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/percent.ts @@ -0,0 +1,47 @@ +import { number } from './number'; +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const percent: FieldOptions = { + name: 'percent', + type: 'object', + group: 'basic', + order: 6, + title: '百分比', + sortable: true, + default: { + dataType: 'float', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'InputNumber', + 'x-component-props': { + stringMode: true, + step: '0', + addonAfter: '%', + }, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'InputNumber.DesignableBar', + }, + }, + properties: { + ...defaultProps, + 'uiSchema.x-component-props.step': { + type: 'string', + title: '精度', + 'x-component': 'Select', + 'x-decorator': 'FormItem', + default: '0', + enum: [ + { value: '0', label: '1' }, + { value: '0.1', label: '1.0' }, + { value: '0.01', label: '1.00' }, + { value: '0.001', label: '1.000' }, + { value: '0.0001', label: '1.0000' }, + { value: '0.00001', label: '1.00000' }, + ], + }, + }, + operations: number.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/phone.ts b/packages/client/src/schemas/database-field/interfaces/phone.ts new file mode 100644 index 0000000000000000000000000000000000000000..241a9fc20fa48a8347c4f6eccaff6a147a10292c --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/phone.ts @@ -0,0 +1,28 @@ +import { defaultProps } from './properties'; +import { string } from './string'; +import { FieldOptions } from '.'; + +export const phone: FieldOptions = { + name: 'phone', + type: 'object', + group: 'basic', + order: 3, + title: '手机号码', + sortable: true, + default: { + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Input', + 'x-decorator': 'FormItem', + 'x-validator': 'phone', + 'x-designable-bar': 'Input.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, + operations: string.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/properties/index.ts b/packages/client/src/schemas/database-field/interfaces/properties/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6b360f127bb4bba1ffcb8cac16850be597d8ad4 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/properties/index.ts @@ -0,0 +1,203 @@ +import { ISchema } from '@formily/react'; + +export const dataType: ISchema = { + type: 'string', + title: '数据类型', + required: true, + 'x-disabled': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + enum: [ + { label: 'Boolean', value: 'boolean' }, + { label: 'String', value: 'string' }, + { label: 'Text', value: 'text' }, + { label: 'Integer', value: 'integer' }, + { label: 'Float', value: 'float' }, + { label: 'Decimal', value: 'decimal' }, + { label: 'Date', value: 'date' }, + { label: 'DateOnly', value: 'dateonly' }, + { label: 'Time', value: 'time' }, + { label: 'Virtual', value: 'virtual' }, + { label: 'JSON', value: 'json' }, + { label: 'Password', value: 'password' }, + { label: 'HasOne', value: 'hasOne' }, + { label: 'HasMany', value: 'hasMany' }, + { label: 'BelongsTo', value: 'belongsTo' }, + { label: 'BelongsToMany', value: 'belongsToMany' }, + ], +}; + +export const dateTimeProps: { [key: string]: ISchema } = { + 'uiSchema.x-component-props.dateFormat': { + type: 'string', + title: '日期格式', + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + default: 'YYYY-MM-DD', + enum: [ + { + label: '年/月/日', + value: 'YYYY/MM/DD', + }, + { + label: '年-月-日', + value: 'YYYY-MM-DD', + }, + { + label: '日/月/年', + value: 'DD/MM/YYYY', + }, + ], + }, + 'uiSchema.x-component-props.showTime': { + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-content': '显示时间', + 'x-reactions': [ + `{{(field) => { + field.query('..[].timeFormat').take(f => { + f.display = field.value ? 'visible' : 'none'; + }); + }}}`, + ], + }, + 'uiSchema.x-component-props.timeFormat': { + type: 'string', + title: '时间格式', + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + default: 'HH:mm:ss', + enum: [ + { + label: '24小时制', + value: 'HH:mm:ss', + }, + { + label: '12小时制', + value: 'hh:mm:ss a', + }, + ], + }, +}; + +export const dataSource: ISchema = { + type: 'array', + title: '可选项', + 'x-decorator': 'FormItem', + 'x-component': 'ArrayTable', + 'x-component-props': { + pagination: false, + // scroll: { x: '100%' }, + }, + items: { + type: 'object', + properties: { + column1: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { width: 50, title: '', align: 'center' }, + properties: { + sort: { + type: 'void', + 'x-component': 'ArrayTable.SortHandle', + }, + }, + }, + column2: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '选项值' }, + 'x-hidden': true, + properties: { + value: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + column3: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '选项' }, + properties: { + label: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + column4: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { title: '颜色' }, + properties: { + color: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'ColorSelect', + }, + }, + }, + column5: { + type: 'void', + 'x-component': 'ArrayTable.Column', + 'x-component-props': { + title: '', + dataIndex: 'operations', + fixed: 'right', + }, + properties: { + item: { + type: 'void', + 'x-component': 'FormItem', + properties: { + remove: { + type: 'void', + 'x-component': 'ArrayTable.Remove', + }, + }, + }, + }, + }, + }, + }, + properties: { + add: { + type: 'void', + 'x-component': 'ArrayTable.Addition', + 'x-component-props': { + randomValue: true, + }, + title: '添加可选项', + }, + }, +}; + +export const defaultProps = { + 'uiSchema.title': { + type: 'string', + title: '字段名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + name: { + type: 'string', + title: '字段标识', + required: true, + // 'x-disabled': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + description: '随机生成,可修改。支持英文、数字和下划线,必须以英文字母开头', + }, + dataType, + // 'uiSchema.required': { + // type: 'string', + // title: '必填', + // 'x-decorator': 'FormItem', + // 'x-component': 'Checkbox', + // }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/radioGroup.ts b/packages/client/src/schemas/database-field/interfaces/radioGroup.ts new file mode 100644 index 0000000000000000000000000000000000000000..81f9c7dcf8cd4b58b0011a984cad5c213d469f77 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/radioGroup.ts @@ -0,0 +1,27 @@ +import { defaultProps, dataSource } from './properties'; +import { select } from './select'; +import { FieldOptions } from '.'; + +export const radioGroup: FieldOptions = { + name: 'radioGroup', + type: 'object', + group: 'choices', + order: 4, + title: '单选框', + default: { + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Radio.DesignableBar', + }, + }, + properties: { + ...defaultProps, + 'uiSchema.enum': dataSource, + }, + operations: select.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/select.ts b/packages/client/src/schemas/database-field/interfaces/select.ts new file mode 100644 index 0000000000000000000000000000000000000000..811f40ea762578203bcf1141e666c3ad20bf1199 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/select.ts @@ -0,0 +1,53 @@ +import { defaultProps, dataSource } from './properties'; +import { FieldOptions } from '.'; + +export const select: FieldOptions = { + name: 'select', + type: 'object', + group: 'choices', + order: 2, + title: '下拉选择(单选)', + default: { + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Select', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Select.DesignableBar', + enum: [], + }, + }, + properties: { + ...defaultProps, + 'uiSchema.enum': dataSource, + }, + operations: [ + { + label: '等于', + value: 'eq', + selected: true, + schema: { 'x-component': 'Select' }, + }, + { label: '不等于', value: 'ne', schema: { 'x-component': 'Select' } }, + { + label: '包含', + value: 'in', + schema: { + 'x-component': 'Select', + 'x-component-props': { mode: 'tags' }, + }, + }, + { + label: '不包含', + value: 'notIn', + schema: { + 'x-component': 'Select', + 'x-component-props': { mode: 'tags' }, + }, + }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/string.ts b/packages/client/src/schemas/database-field/interfaces/string.ts new file mode 100644 index 0000000000000000000000000000000000000000..0242c40a758a6d9f0229bab4d5fc447b5e6f7d8d --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/string.ts @@ -0,0 +1,34 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const string: FieldOptions = { + name: 'string', + type: 'object', + group: 'basic', + order: 1, + title: '单行文本', + sortable: true, + default: { + interface: 'string', + dataType: 'string', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'Input', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Input.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, + operations: [ + { label: '包含', value: '$includes', selected: true }, + { label: '不包含', value: '$notIncludes' }, + { label: '等于', value: 'eq' }, + { label: '不等于', value: 'ne' }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/subTable.ts b/packages/client/src/schemas/database-field/interfaces/subTable.ts new file mode 100644 index 0000000000000000000000000000000000000000..5d583be7a2decfeb1261134672e0ac10a1136c45 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/subTable.ts @@ -0,0 +1,43 @@ +import { defaultProps } from './properties'; +import { uid } from '@formily/shared'; +import { FieldOptions } from '.'; + +export const subTable: FieldOptions = { + name: 'subTable', + type: 'object', + group: 'relation', + order: 2, + title: '子表格', + isAssociation: true, + disabled: true, + default: { + dataType: 'hasMany', + // name, + uiSchema: { + type: 'array', + // title, + 'x-decorator': 'FormItem', + 'x-component': 'Table', + 'x-component-props': {}, + 'x-designable-bar': 'Table.DesignableBar', + enum: [], + }, + }, + initialize: (values: any) => { + if (!values.target) { + values.target = `t_${uid()}`; + } + if (!values.foreignKey) { + values.foreignKey = `f_${uid()}`; + } + }, + properties: { + ...defaultProps, + children: { + type: 'array', + title: '子表格字段', + 'x-decorator': 'FormItem', + 'x-component': 'DatabaseField', + }, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/textarea.ts b/packages/client/src/schemas/database-field/interfaces/textarea.ts new file mode 100644 index 0000000000000000000000000000000000000000..b50de9560ab1d36b01f7624c30aa4ba368fc8b27 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/textarea.ts @@ -0,0 +1,24 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const textarea: FieldOptions = { + name: 'textarea', + type: 'object', + group: 'basic', + order: 2, + title: '多行文本', + default: { + dataType: 'text', + // name, + uiSchema: { + type: 'string', + // title, + 'x-decorator': 'FormItem', + 'x-component': 'Input.TextArea', + 'x-designable-bar': 'Input.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/time.ts b/packages/client/src/schemas/database-field/interfaces/time.ts new file mode 100644 index 0000000000000000000000000000000000000000..9909d52c4fce3bfe38a5bbe70583845a9c80e3a6 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/time.ts @@ -0,0 +1,52 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const time: FieldOptions = { + name: 'time', + type: 'object', + group: 'datetime', + order: 2, + title: '时间', + sortable: true, + default: { + dataType: 'time', + // name, + uiSchema: { + type: 'string', + // title, + 'x-component': 'TimePicker', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'TimePicker.DesignableBar', + }, + }, + properties: { + ...defaultProps, + 'uiSchema.x-component-props.format': { + type: 'string', + title: '时间格式', + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + default: 'HH:mm:ss', + enum: [ + { + label: '24小时制', + value: 'HH:mm:ss', + }, + { + label: '12小时制', + value: 'hh:mm:ss a', + }, + ], + }, + }, + operations: [ + { label: '等于', value: 'eq', selected: true }, + { label: '不等于', value: 'neq' }, + { label: '大于', value: 'gt' }, + { label: '大于等于', value: 'gte' }, + { label: '小于', value: 'lt' }, + { label: '小于等于', value: 'lte' }, + { label: '非空', value: '$notNull', noValue: true }, + { label: '为空', value: '$null', noValue: true }, + ], +}; diff --git a/packages/client/src/schemas/database-field/interfaces/types.ts b/packages/client/src/schemas/database-field/interfaces/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..8c2d499a6275c19b6cf8f1da82a83ef2265095be --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/types.ts @@ -0,0 +1,24 @@ +export * from './attachment'; +export * from './checkbox'; +export * from './checkboxGroup'; +export * from './chinaRegion'; +export * from './createdAt'; +export * from './createdBy'; +export * from './datetime'; +export * from './email'; +export * from './icon'; +export * from './linkTo'; +export * from './markdown'; +export * from './multipleSelect'; +export * from './number'; +export * from './password'; +export * from './percent'; +export * from './phone'; +export * from './radioGroup'; +export * from './select'; +export * from './string'; +export * from './subTable'; +export * from './textarea'; +export * from './time'; +export * from './updatedAt'; +export * from './updatedBy'; diff --git a/packages/client/src/schemas/database-field/interfaces/updatedAt.ts b/packages/client/src/schemas/database-field/interfaces/updatedAt.ts new file mode 100644 index 0000000000000000000000000000000000000000..419621a0a2cf609ea7e22af2f18be0ea74020343 --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/updatedAt.ts @@ -0,0 +1,31 @@ +import { datetime } from './datetime'; +import { dateTimeProps, defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const updatedAt: FieldOptions = { + name: 'updatedAt', + type: 'object', + group: 'systemInfo', + order: 2, + title: '最后更新时间', + sortable: true, + default: { + dataType: 'date', + field: 'updated_at', + // name, + uiSchema: { + type: 'datetime', + title: '最后更新时间', + 'x-component': 'DatePicker', + 'x-component-props': {}, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'DatePicker.DesignableBar', + }, + }, + properties: { + ...defaultProps, + ...dateTimeProps, + }, + operations: datetime.operations, +}; diff --git a/packages/client/src/schemas/database-field/interfaces/updatedBy.ts b/packages/client/src/schemas/database-field/interfaces/updatedBy.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e0c59bd7ab7faa22c766ec9568ecab4416e7cad --- /dev/null +++ b/packages/client/src/schemas/database-field/interfaces/updatedBy.ts @@ -0,0 +1,34 @@ +import { defaultProps } from './properties'; +import { FieldOptions } from '.'; + +export const updatedBy: FieldOptions = { + name: 'updatedBy', + type: 'object', + group: 'systemInfo', + order: 4, + title: '最后修改人', + isAssociation: true, + default: { + dataType: 'belongsTo', + target: 'users', + foreignKey: 'updated_by_id', + // name, + uiSchema: { + type: 'object', + title: '最后修改人', + 'x-component': 'Select.Drawer', + 'x-component-props': { + fieldNames: { + value: 'id', + label: 'nickname', + }, + }, + 'x-decorator': 'FormItem', + 'x-read-pretty': true, + 'x-designable-bar': 'Select.Drawer.DesignableBar', + }, + }, + properties: { + ...defaultProps, + }, +}; diff --git a/packages/client/src/schemas/database-field/style.less b/packages/client/src/schemas/database-field/style.less new file mode 100644 index 0000000000000000000000000000000000000000..56b8b3c3014596ffe01f7690630f7522ed18089d --- /dev/null +++ b/packages/client/src/schemas/database-field/style.less @@ -0,0 +1,53 @@ +.ant-collapse.empty { + border: 0; +} + +.nb-database-config { + height: 46px; + border-radius: 0px; + background: none; + border: 0; + &:hover { + background: #1890ff; + } + &:active { + background: #1890ff; + } +} + +.ant-dropdown.all-fields { + .ant-dropdown-menu { + max-height: 300px; + overflow: auto; + } +} + +.ant-tag.disabled { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} + +.ant-collapse-header { + position: relative; + &:hover { + .drag-handle { + opacity: 1; + } + } + .drag-handle { + opacity: 0; + margin-right: 6px; + background-color: #fafafa; + position: relative; + z-index: 3; + } + .ant-collapse-arrow { + position: absolute; + top: 18px; + } + .ant-collapse-extra { + position: absolute; + right: 16px; + top: 12px; + } +} diff --git a/packages/client/src/schemas/date-picker/index.md b/packages/client/src/schemas/date-picker/index.md new file mode 100644 index 0000000000000000000000000000000000000000..547a7f6150da2d5e2c807fd32bd18a3e9087ad01 --- /dev/null +++ b/packages/client/src/schemas/date-picker/index.md @@ -0,0 +1,116 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# DatePicker - 日期选择器 + +## Node Tree + +
+
+
+ +## Designable Bar + +- DatePicker.DesignableBar + +## Examples + +### 日期选择器 + +```tsx +/** + * title: 日期选择器 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'icon', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'DatePicker', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'icon', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'DatePicker', + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### 日期时间选择 + +```tsx +/** + * title: 日期时间选择 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'icon', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'DatePicker', + 'x-component-props': { + showTime: true, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'icon', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'DatePicker', + 'x-component-props': { + showTime: true, + }, + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/date-picker/index.tsx b/packages/client/src/schemas/date-picker/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3c1f605223ee2b076dc4869dee12abbca041bbdd --- /dev/null +++ b/packages/client/src/schemas/date-picker/index.tsx @@ -0,0 +1,72 @@ +import moment from 'moment'; +import { + connect, + mapProps, + mapReadPretty, + useField, + useFieldSchema, +} from '@formily/react'; +import { DatePicker as AntdDatePicker } from 'antd'; +import { + DatePickerProps as AntdDatePickerProps, + RangePickerProps, +} from 'antd/lib/date-picker'; +import { Display } from '../display'; +import { formatMomentValue, momentable } from '@formily/antd/esm/__builtins__'; + +type DatePickerProps = Exclude< + PickerProps, + 'value' | 'onChange' +> & { + value: string; + onChange: (value: string | string[]) => void; +}; + +type ComposedDatePicker = React.FC & { + RangePicker?: React.FC; +}; + +const mapDateFormat = function () { + const getDefaultFormat = (props: DatePickerProps) => { + if (props['picker'] === 'month') { + return 'YYYY-MM'; + } else if (props['picker'] === 'quarter') { + return 'YYYY-\\QQ'; + } else if (props['picker'] === 'year') { + return 'YYYY'; + } else if (props['picker'] === 'week') { + return 'YYYY-wo'; + } + return props['showTime'] ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'; + }; + return (props: any) => { + const field = useField(); + const fieldSchema = useFieldSchema(); + const format = props['format'] || getDefaultFormat(props); + const onChange = props.onChange; + return { + ...props, + format: format, + value: momentable(props.value, format === 'YYYY-wo' ? 'YYYY-w' : format), + onChange: (value: moment.Moment | moment.Moment[]) => { + if (onChange) { + onChange(formatMomentValue(value, format)); + } + }, + }; + }; +}; + +export const DatePicker: ComposedDatePicker = connect( + AntdDatePicker, + mapProps(mapDateFormat()), + mapReadPretty(Display.DatePicker), +); + +DatePicker.RangePicker = connect( + AntdDatePicker.RangePicker, + mapProps(mapDateFormat()), + mapReadPretty(Display.DateRangePicker), +); + +export default DatePicker; diff --git a/packages/client/src/schemas/designable-bar/index.md b/packages/client/src/schemas/designable-bar/index.md new file mode 100644 index 0000000000000000000000000000000000000000..dab65d94af77a41bb31024ceb8e9292654eb3fd8 --- /dev/null +++ b/packages/client/src/schemas/designable-bar/index.md @@ -0,0 +1,21 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# DesignableBar - 配置操作栏 + +用于修改节点的参数配置,DesignableBar 是所有配置操作栏的统称,不是固定的,可以根据不同节点定义不同的 `**.DesignableBar`。 + +## Node Tree + +通常 DesignableBar 并不单独占用一个节点,而是节点的 x-designable-bar + +
+
+ + + +数据组件的 DesignableBar 通常与 FormItem 搭配使用,非数据组件的 DesignableBar 通常与 BlockItem 搭配使用,也有少量如 Action、Menu 无需 BlockItem \ No newline at end of file diff --git a/packages/client/src/schemas/designable-bar/style.less b/packages/client/src/schemas/designable-bar/style.less new file mode 100644 index 0000000000000000000000000000000000000000..a72201513cb706195d29fa87b2fb11620dfce35a --- /dev/null +++ b/packages/client/src/schemas/designable-bar/style.less @@ -0,0 +1,110 @@ +@bgcolor: #f18b62; + +.designable-info { + position: absolute; + font-size: 12px; + background: @bgcolor; + color: #fff; + padding: 0 5px; + line-height: 16px; + height: 16px; + border-bottom-right-radius: 2px; + border-radius: 2px; + top: 2px; + left: 2px; +} + +.designable-bar { + z-index: 50 !important; + border-radius: 2px !important; + // border: 2px solid @bgcolor !important; + border: 0 !important; + background: rgba(241, 139, 98, 0.06) !important; + .designable-bar-actions { + padding: 0 !important; + background: none !important; + display: flex !important; + right: 2px !important; + top: 2px !important; + // .ant-space-item { + // margin: 0 !important; + // } + .ant-space { + gap: 2px !important; + } + .anticon { + border-radius: 1px; + width: 16px !important; + height: 16px !important; + vertical-align: top; + line-height: 16px !important; + cursor: pointer; + // font-size: 10px; + // display: inline-flex; + background-color: @bgcolor !important; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + // margin-left: 0 !important; + // margin-right: 2px !important; + &.anticon-drag { + cursor: grab; + } + } + } +} + +.designable-btn-dash { + border-color: @bgcolor !important; + color: @bgcolor !important; +} + +.nb-add-new-menu-item.menu-mode-horizontal.designable { + color: @bgcolor !important; + border: 1px dashed !important; + height: 32px !important; + // &:hover { + // color: #fff !important; + // background: @bgcolor !important; + // } + // &:active { + // color: #fff !important; + // background: @bgcolor !important; + // } +} + +.ant-menu-item-group.nb-menu-add-new { + .menu-mode-horizontal { + margin-left: 8px; + } +} + +.nb-designable-toggle.active { + background: @bgcolor !important; +} + +.ant-card + .designable-bar { + background: none !important; + border: 2px solid rgba(241, 139, 98, 0.3) !important; +} + +.action-bar-align-right, +.action-bar-align-left { + position: relative; + &.isOver { + background-color: transparent !important; + .ant-space { + position: relative; + z-index: 2; + } + &::after { + content: ''; + background-color: rgba(241, 139, 98, 0.1) !important; + position: absolute; + top: -3px; + left: -3px; + right: -3px; + bottom: -3px; + z-index: 1; + } + } +} diff --git a/packages/client/src/schemas/display/index.tsx b/packages/client/src/schemas/display/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3937fbdd00866a3045f88f0f6192fda6d06d86b3 --- /dev/null +++ b/packages/client/src/schemas/display/index.tsx @@ -0,0 +1,385 @@ +import React, { createContext, useContext } from 'react'; +import { isArr, isValid } from '@formily/shared'; +import { observer, useField } from '@formily/react'; +import { InputProps } from 'antd/lib/input'; +import { InputNumberProps } from 'antd/lib/input-number'; +import { SelectProps } from 'antd/lib/select'; +import { TreeSelectProps } from 'antd/lib/tree-select'; +import { CascaderProps } from 'antd/lib/cascader'; +import { + DatePickerProps, + RangePickerProps as DateRangePickerProps, +} from 'antd/lib/date-picker'; +import { TimePickerProps, TimeRangePickerProps } from 'antd/lib/time-picker'; +import { Tag, Space, Popover } from 'antd'; +import cls from 'classnames'; +import { + formatMomentValue, + usePrefixCls, +} from '@formily/antd/esm/__builtins__'; +import { FullscreenOutlined } from '@ant-design/icons'; +import moment from 'moment'; + +const PlaceholderContext = createContext(''); + +const Placeholder = PlaceholderContext.Provider; + +const usePlaceholder = (value?: any) => { + const placeholder = useContext(PlaceholderContext) || ''; + return isValid(value) && value !== '' ? value : placeholder; +}; + +const Input: React.FC = (props) => { + const prefixCls = usePrefixCls('description-input', props); + return ( +
+ {props.addonBefore} + {props.prefix} + {usePlaceholder(props.value)} + {props.suffix} + {props.addonAfter} +
+ ); +}; + +const URL: React.FC = (props) => { + const prefixCls = usePrefixCls('description-url', props); + const content = props.value && ( + + {props.value} + + ); + return ( +
+ {props.addonBefore} + {props.prefix} + {content} + {props.suffix} + {props.addonAfter} +
+ ); +}; + +const InputNumber: React.FC = (props) => { + const prefixCls = usePrefixCls('description-input-number', props); + const value = usePlaceholder(props.value); + return ( +
+ {props.addonBefore} + {props.prefix} + {props.formatter ? props.formatter(value) : value} + {props.suffix} + {props.addonAfter} +
+ ); +}; + +const TextArea: React.FC = (props) => { + const prefixCls = usePrefixCls('description-textarea', props); + const ellipsis = props.ellipsis === true ? {} : props.ellipsis; + const content = props.ellipsis ? ( +
+ +
+ {usePlaceholder(props.text || props.value)} +
+
+
+ ) : ( + usePlaceholder(props.value) + ); + return ( +
+ {props.addonBefore} + {props.prefix} + {content} + {props.suffix} + {props.addonAfter} +
+ ); +}; + +const Select: React.FC> = observer((props) => { + const field = useField(); + const prefixCls = usePrefixCls('description-select', props); + const dataSource: any[] = field?.dataSource?.length + ? field.dataSource + : props?.options?.length + ? props.options + : []; + const placeholder = usePlaceholder(); + const getSelected = () => { + const value = props.value; + if (props.mode === 'multiple' || props.mode === 'tags') { + if (props.labelInValue) { + return isArr(value) ? value : []; + } else { + return isArr(value) + ? value.map((val) => ({ label: val, value: val })) + : []; + } + } else { + if (props.labelInValue) { + return isValid(value) ? [value] : []; + } else { + return isValid(value) ? [{ label: value, value }] : []; + } + } + }; + + const getLabels = () => { + const selected = getSelected(); + if (!selected.length) return {placeholder}; + return selected.map(({ value, label }, key) => { + const text = + dataSource?.find((item) => item.value == value)?.label || label; + return {text || placeholder}; + }); + }; + return ( +
+ {getLabels()} +
+ ); +}); + +const ObjectSelect: React.FC> = observer((props) => { + const field = useField(); + const prefixCls = usePrefixCls('description-select', props); + const dataSource: any[] = field?.dataSource?.length + ? field.dataSource + : props?.options?.length + ? props.options + : []; + const placeholder = usePlaceholder(); + const getSelected = () => { + const value = props.value; + if (props.mode === 'multiple' || props.mode === 'tags') { + if (props.labelInValue) { + return isArr(value) ? value : []; + } else { + return isArr(value) + ? value.map((val) => ({ label: val, value: val })) + : []; + } + } else { + if (props.labelInValue) { + return isValid(value) ? [value] : []; + } else { + return isValid(value) ? [{ label: value, value }] : []; + } + } + }; + + const getLabels = () => { + const selected = getSelected(); + if (!selected.length) return {placeholder}; + return selected.map(({ value, label }, key) => { + const text = + dataSource?.find((item) => item.value == value)?.label || label; + return {text || placeholder}; + }); + }; + return ( +
+ {getLabels()} +
+ ); +}); + +const TreeSelect: React.FC> = observer((props) => { + const field = useField(); + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-tree-select', props); + const dataSource = field?.dataSource?.length + ? field.dataSource + : props?.options?.length + ? props.options + : []; + const getSelected = () => { + const value = props.value; + if (props.multiple) { + if (props.labelInValue) { + return isArr(value) ? value : []; + } else { + return isArr(value) + ? value.map((val) => ({ label: val, value: val })) + : []; + } + } else { + if (props.labelInValue) { + return value ? [value] : []; + } else { + return value ? [{ label: value, value }] : []; + } + } + }; + + const findLabel = (value: any, dataSource: any[]) => { + for (let i = 0; i < dataSource?.length; i++) { + const item = dataSource[i]; + if (item?.value === value) { + return item?.label; + } else { + const childLabel = findLabel(value, item?.children); + if (childLabel) return childLabel; + } + } + }; + + const getLabels = () => { + const selected = getSelected(); + if (!selected?.length) return {placeholder}; + return selected.map(({ value, label }, key) => { + return ( + + {findLabel(value, dataSource) || label || placeholder} + + ); + }); + }; + return ( +
+ {getLabels()} +
+ ); +}); + +const Cascader: React.FC = observer((props) => { + const field = useField(); + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-cascader', props); + const dataSource: any[] = field?.dataSource?.length + ? field.dataSource + : props?.options?.length + ? props.options + : []; + const getSelected = () => { + return isArr(props.value) ? props.value : []; + }; + const findLabel = (value: any, dataSource: any[]) => { + for (let i = 0; i < dataSource?.length; i++) { + const item = dataSource[i]; + if (item?.value === value) { + return item?.label; + } else { + const childLabel = findLabel(value, item?.children); + if (childLabel) return childLabel; + } + } + }; + const getLabels = () => { + const selected = getSelected(); + if (!selected?.length) { + return placeholder; + } + return selected + .map((value) => { + return findLabel(value, dataSource) || placeholder; + }) + .join('/'); + }; + return ( +
+ {getLabels()} +
+ ); +}); + +const DatePicker: React.FC = (props: any) => { + if (!props.value) { + return
; + } + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-date-picker', props); + const getDefaultFormat = () => { + const { dateFormat, showTime, timeFormat } = props; + let format = dateFormat; + if (showTime) { + format += ` ${timeFormat}`; + } + return format || props.format; + }; + const getLabels = () => { + const d = moment(props.value); + const labels = formatMomentValue( + d.isValid() ? d : null, + getDefaultFormat(), + placeholder, + ); + return isArr(labels) ? labels.join('~') : labels; + }; + return
{getLabels()}
; +}; + +const DateRangePicker: React.FC = (props) => { + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-text', props); + const getLabels = () => { + const labels = formatMomentValue(props.value, props.format, placeholder); + return isArr(labels) ? labels.join('~') : labels; + }; + return ( +
+ {getLabels()} +
+ ); +}; + +const TimePicker: React.FC = (props) => { + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-text', props); + const getLabels = () => { + const labels = formatMomentValue(props.value, props.format, placeholder); + return isArr(labels) ? labels.join('~') : labels; + }; + return ( +
+ {getLabels()} +
+ ); +}; + +const TimeRangePicker: React.FC = (props) => { + const placeholder = usePlaceholder(); + const prefixCls = usePrefixCls('description-text', props); + const getLabels = () => { + const labels = formatMomentValue(props.value, props.format, placeholder); + return isArr(labels) ? labels.join('~') : labels; + }; + return ( +
+ {getLabels()} +
+ ); +}; + +export const Display = { + Input, + URL, + TextArea, + Select, + ObjectSelect, + TreeSelect, + Cascader, + DatePicker, + DateRangePicker, + TimePicker, + TimeRangePicker, + Placeholder, + InputNumber, + usePlaceholder, +}; + +export default Display; diff --git a/packages/client/src/schemas/drag-and-drop/index.tsx b/packages/client/src/schemas/drag-and-drop/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ff64ff5b4c5f60b778717e74edbcf8c5cdc9bb1a --- /dev/null +++ b/packages/client/src/schemas/drag-and-drop/index.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { observer, useFieldSchema } from '@formily/react'; +import { DragDropManagerProvider } from './../../components/drag-and-drop'; + +export const DragAndDrop = observer((props) => { + const schema = useFieldSchema(); + console.log('DragAndDrop'); + return ( + +
{props.children}
+
+ ); +}); diff --git a/packages/client/src/schemas/filter/FilterItem.tsx b/packages/client/src/schemas/filter/FilterItem.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ad51c79d694075142acf68c4b827b9794063d013 --- /dev/null +++ b/packages/client/src/schemas/filter/FilterItem.tsx @@ -0,0 +1,246 @@ +import React, { useContext, useMemo, useState } from 'react'; +import { ISchema, SchemaField } from '..'; +import { + createForm, + onFieldChange, + onFieldReact, + onFormValuesChange, +} from '@formily/core'; +import { + FormProvider, + FormConsumer, + useFieldSchema, + Schema, + SchemaOptionsContext, + SchemaKey, + RecursionField, +} from '@formily/react'; +import { Field } from '@formily/core/esm/models/Field'; +import { Form } from '@formily/core/esm/models/Form'; +import { + Input, + FormItem, + FormLayout, + FormButtonGroup, + Submit, + Space, +} from '@formily/antd'; +import { CloseCircleOutlined } from '@ant-design/icons'; +import { get } from 'lodash'; +import { isValid } from '@formily/shared'; +import { useEffect } from 'react'; + +function useFilterColumns(): Map { + const schema = useFieldSchema(); + const columns = schema.reduceProperties((columns, current) => { + if (current['x-component'] === 'Filter.Column') { + const fieldName = Object.keys(current.properties).shift(); + columns.set(fieldName, current); + return columns; + } + return columns; + }, new Map()); + return columns; +} + +export const FilterItem = (props) => { + const { value, initialValues = {}, onRemove, onChange } = props; + const options = useContext(SchemaOptionsContext); + const columns = useFilterColumns(); + + const toValues = (value) => { + if (!value) { + return {}; + } + if (Object.keys(value).length === 0) { + return {}; + } + const fieldName = Object.keys(value).shift(); + const nested = value[fieldName]; + const column = columns.get(fieldName).toJSON(); + const operations = column?.['x-component-props']?.['operations'] || []; + if (!nested) { + return { + column, + operations, + }; + } + if (Object.keys(nested).length === 0) { + return { + column, + operations, + }; + } + const operationValue = Object.keys(nested).shift(); + console.log('toValues', { operationValue }); + const operation = operations.find( + (operation) => operation.value === operationValue, + ); + console.log('toValues', { operation }); + if (!operation) { + return { + operations, + column, + }; + } + if (operation.noValue) { + return { + column, + operations, + operation, + }; + } + return { + column, + operation, + operations, + value: nested[operationValue], + }; + }; + + const values = toValues(value); + + console.log('toValues', values, value); + + const Remove = (props) => { + return ( + onRemove && ( + onRemove()}> + + + ) + ); + }; + + const form = useMemo( + () => + createForm({ + initialValues: values, + effects: (form) => { + onFieldChange('column', (field: Field, form: Form) => { + const column = (field.value || {}) as ISchema; + const operations = + column?.['x-component-props']?.['operations'] || []; + field.query('operation').take((f: Field) => { + f.setDataSource(operations); + f.value = get(operations, [0]); + }); + field.query('value').take((f: Field) => { + f.value = undefined; + f.componentProps.schema = column; + }); + }); + onFieldReact('operation', (field: Field) => { + console.log('operation', field.value); + const operation = field.value || {}; + field.query('value').take((f: Field) => { + f.visible = !operation.noValue; + if (operation.noValue) { + f.value = undefined; + } + f.componentProps.operation = operation; + }); + }); + onFormValuesChange((form) => { + const { column, operation, value } = form.values; + if (!operation?.value) { + return; + } + const fieldName = Object.keys(column.properties).shift(); + if (operation?.noValue) { + onChange({ + [fieldName]: { + [operation.value]: true, + }, + }); + } else { + onChange( + isValid(value) + ? { + [fieldName]: { + [operation.value]: value, + }, + } + : {}, + ); + } + console.log('form.values', form.values); + }); + }, + }), + [], + ); + + const columnEnum: any = [...columns.values()].map((column) => + column.toJSON(), + ); + + return ( + + + + + + + + + + + + {/* + {(form) => { + return ( +
{JSON.stringify(form.values, null, 2)}
+ ) + }} +
*/} +
+ ); +}; + +export default FilterItem; diff --git a/packages/client/src/schemas/filter/index.md b/packages/client/src/schemas/filter/index.md new file mode 100644 index 0000000000000000000000000000000000000000..0645d991ee7cd6f99ad979c7acee07486ebb0287 --- /dev/null +++ b/packages/client/src/schemas/filter/index.md @@ -0,0 +1,95 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Filter - 筛选器 + +## Node Tree + +
+
+  
+    
+  
+  
+    
+  
+
+
+ +## Designable Bar + +- Filter.DesignableBar + +## Examples + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + name: 'filter', + type: 'object', + 'x-component': 'Filter', + default: { + and: [ + { + field1: { + eq: 'aa', + } + }, + { + field1: { + eq: 'bbb', + } + } + ], + }, + properties: { + column1: { + type: 'void', + title: '字段1', + 'x-component': 'Filter.Column', + 'x-component-props': { + operations: [ + { label: '等于', value: 'eq' }, + { label: '不等于', value: 'ne' }, + ], + }, + properties: { + field1: { + type: 'string', + 'x-component': 'Input', + }, + }, + }, + column2: { + type: 'void', + title: '字段2', + 'x-component': 'Filter.Column', + 'x-component-props': { + operations: [ + { label: '大于', value: 'gt' }, + { label: '小于', value: 'lt' }, + { label: '非空', value: 'notNull', noValue: true }, + ], + }, + properties: { + field2: { + type: 'number', + 'x-component': 'InputNumber', + }, + }, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/filter/index.tsx b/packages/client/src/schemas/filter/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4878ad7b12e6a4d9609be00c8896c42e922ddf28 --- /dev/null +++ b/packages/client/src/schemas/filter/index.tsx @@ -0,0 +1,245 @@ +import React, { useEffect } from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + RecursionField, + ISchema, + Schema, + ArrayField, + useField, + FormProvider, +} from '@formily/react'; +import { LoadingOutlined } from '@ant-design/icons'; +import { useDynamicList, useMap } from 'ahooks'; +import { Select } from 'antd'; +import { CloseCircleOutlined } from '@ant-design/icons'; +import { FilterItem } from './FilterItem'; +import cls from 'classnames'; +import './style.less'; +import { cloneDeep } from 'lodash'; +import { uid, isValid } from '@formily/shared'; +import { SchemaField, SchemaRenderer } from '../../components/schema-renderer'; +import { useMemo } from 'react'; +import { createForm, onFormValuesChange } from '@formily/core'; +import deepmerge from 'deepmerge'; + +const toValue = (value) => { + if (!value) { + return { + logical: 'and', + list: [{}], + }; + } + if (value.and) { + return { + logical: 'and', + list: value.and, + }; + } + if (value.or) { + return { + logical: 'and', + list: value.or, + }; + } + return { + logical: 'and', + list: [{}], + }; +}; + +export function FilterGroup(props) { + const { bordered = true, onRemove, onChange } = props; + const value = toValue(props.value); + console.log('list', value); + return ( +
+ {onRemove && ( + onRemove()}> + + + )} +
+ 满足组内{' '} + {' '} + 条件 +
+ { + console.log('list9999', list); + onChange && + onChange({ + [value.logical]: list.filter( + (item) => isValid(item) && Object.keys(item).length, + ), + }); + }} + /> +
+ ); +} + +export function FilterList(props) { + const { initialValue = [] } = props; + + const [map, { set, setAll, remove, reset, get }] = useMap( + initialValue.map((item, index) => { + return [`index-${index}`, item]; + }), + ); + + useEffect(() => { + props.onChange && props.onChange([...map.values()]); + }, [map]); + + return ( +
+
+ {[...map.entries()].map(([index, item]) => { + if (item.and || item.or) { + return ( + set(index, value)} + onRemove={() => remove(index)} + /> + ); + } + return ( + set(index, value)} + onRemove={() => remove(index)} + /> + ); + })} +
+ +
+ ); +} + +export const Filter: any = connect( + (props) => { + // console.log('Filter.props', { props }); + return ( +
+ +
+ ); + }, + mapProps((props, field) => { + return { + ...props, + suffix: ( + + {field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffix + )} + + ), + }; + }), + mapReadPretty((props) => { + return null; + }), +); + +interface DynamicValuePorps { + value?: any; + onChange?: any; + schema?: Schema; + operation?: any; +} + +Filter.DynamicValue = connect((props: DynamicValuePorps) => { + const { onChange, value, operation } = props; + const fieldName = Object.keys(props?.schema?.properties || {}).shift(); + const fieldSchema = Object.values(props?.schema?.properties || {}).shift(); + console.log('Filter.DynamicValue', fieldSchema, { operation }); + const form = useMemo( + () => + createForm({ + initialValues: { + [fieldName || 'value']: value, + }, + // effects() { + // onFormValuesChange((form) => { + // onChange(form.values[fieldName]); + // }); + // }, + }), + [value], + ); + const extra: ISchema = deepmerge( + { + required: false, + 'x-read-pretty': false, + 'x-decorator': 'FormilyFormItem', + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none', + }, + 'x-component-props': { + onChange, + style: { + minWidth: '150px', + }, + }, + }, + operation?.schema || {}, + ); + return ( + + source, + }), + }, + }} + /> + + ); +}); + +export default Filter; diff --git a/packages/client/src/schemas/filter/style.less b/packages/client/src/schemas/filter/style.less new file mode 100644 index 0000000000000000000000000000000000000000..b6543094a75aa85d7f42a587763885d80ac50ed4 --- /dev/null +++ b/packages/client/src/schemas/filter/style.less @@ -0,0 +1,18 @@ +.nb-filter-group { + position: relative; + margin-bottom: 14px; + min-width: 400px; + &-close { + position: absolute; + right: 10px; + } + &.bordered { + border: 1px dashed rgb(222, 222, 222); + padding: 14px; + } +} +.nb-filter-list { + .ant-form-inline { + margin-bottom: 8px; + } +} diff --git a/packages/client/src/schemas/form-item/index.md b/packages/client/src/schemas/form-item/index.md new file mode 100644 index 0000000000000000000000000000000000000000..4ab0154855ee74d8d00842372db0a4d2f6df3f07 --- /dev/null +++ b/packages/client/src/schemas/form-item/index.md @@ -0,0 +1,22 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# FormItem - 表单项 + +## Node Tree + +通常 FormItem 并不单独占用一个节点,而是节点的 x-decorator + +
+
+
+ +FormItem 的作用主要用于处理表单项(控件)的校验、布局等 + +
+
+
diff --git a/packages/client/src/schemas/form-item/index.tsx b/packages/client/src/schemas/form-item/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..22167f60f4763063e2af5c7a2e3297f7e4fb60fe --- /dev/null +++ b/packages/client/src/schemas/form-item/index.tsx @@ -0,0 +1,76 @@ +import React, { useContext, useState } from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + SchemaOptionsContext, + useField, + useFieldSchema, +} from '@formily/react'; +import { FormItem as FormilyFormItem } from '@formily/antd'; +import { Dropdown, Menu, Space } from 'antd'; +import classNames from 'classnames'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +// import './style.less'; +import get from 'lodash/get'; +import { uid } from '@formily/shared'; +import { useDesignable } from '../'; +import { AddNew } from '../add-new'; +import { BlockItem } from '../block-item'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { DragHandle } from '../../components/Sortable'; + +export const FormItem: any = connect((props) => { + return ( + + + + ); +}); + +FormItem.DesignableBar = () => { + const field = useField(); + const { schema, refresh } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + return ( +
+ { + e.stopPropagation(); + }} + className={classNames('designable-bar-actions', { active: visible })} + > + + + + { + setVisible(visible); + }} + overlay={ + + { + const title = uid(); + // schema.title = title; + field.title = title; + setVisible(false); + // refresh(); + }} + > + 修改文案 + + + } + > + + + + +
+ ); +}; diff --git a/packages/client/src/schemas/form-item/style.less b/packages/client/src/schemas/form-item/style.less new file mode 100644 index 0000000000000000000000000000000000000000..1ab14c705def37f0f3d6074f6874a34b1162ee18 --- /dev/null +++ b/packages/client/src/schemas/form-item/style.less @@ -0,0 +1,43 @@ +.designable-form-item { + position: relative; + &:hover { + .designable-bar { + display: block; + } + } + .designable-bar { + z-index: 1; + pointer-events: none; + display: none; + position: absolute; + top: 0; + right: -0; + left: -0; + bottom: -0; + border-radius: 2px; + border: 2px solid #1890ff; + &.active { + display: block; + } + .designable-bar-actions { + pointer-events: auto; + position: absolute; + right: 0; + line-height: 1rem; + color: #fff; + z-index: 10; + padding: 0 3px; + .ant-space { + gap: 1px !important; + } + .anticon { + width: 16px; + height: 16px; + vertical-align: top; + line-height: 16px; + font-size: 10px; + background-color: #1890ff; + } + } + } +} diff --git a/packages/client/src/schemas/form/DesignableBar.tsx b/packages/client/src/schemas/form/DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5cd0db597ebea55fcfae6006dfb5cedf73ef66f0 --- /dev/null +++ b/packages/client/src/schemas/form/DesignableBar.tsx @@ -0,0 +1,102 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { useSchemaPath, SchemaField, useDesignable, removeSchema } from '../'; +import get from 'lodash/get'; +import { Modal, Dropdown, Menu, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { useCollection, useCollectionContext } from '../../constate'; +import { useTable } from '../table'; +import { BlockSchemaContext } from '../../context'; +import { DragHandle } from '../../components/Sortable'; + +export const DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const { props: tableProps } = useTable(); + const blockSchema = useContext(BlockSchemaContext); + const collectionName = blockSchema['x-component-props']?.collectionName; + const { collection } = useCollection({ collectionName }); + return ( +
+ {collection && ( +
+ {collection?.title || collection?.name} +
+ )} + { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + // setVisible(visible); + // }} + overlay={ + + {/* { + field.readPretty = true; + }} + > + 编辑表单配置 + */} + {/* */} + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/form/Field.DesignableBar.tsx b/packages/client/src/schemas/form/Field.DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3ad32eb3a33336400b01d2f08485e59bb086ca60 --- /dev/null +++ b/packages/client/src/schemas/form/Field.DesignableBar.tsx @@ -0,0 +1,259 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Modal, Select, Space, Switch } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { RandomNameContext } from '.'; +import { + useCollectionContext, + useCollectionsContext, + useDisplayedMapContext, +} from '../../constate'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { DragHandle } from '../../components/Sortable'; +import { set } from 'lodash'; + +export const FieldDesignableBar = observer((props) => { + const field = useField(); + const { schema, deepRemove, refresh } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const randomName = useContext(RandomNameContext); + const displayed = useDisplayedMapContext(); + const fieldName = schema['x-component-props']?.['fieldName']; + const { getField } = useCollectionContext(); + const { getFieldsByCollection } = useCollectionsContext(); + + const collectionField = getField(fieldName); + + console.log({ collectionField }); + + const realField = field + .query(field.address.concat(randomName, fieldName)) + .take(); + + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + setVisible(visible); + }} + overlay={ + + { + const values = await FormDialog('自定义字段名称', () => { + return ( + + + + ); + }).open({ + initialValues: { + fieldName: collectionField?.uiSchema?.title, + title: schema['title'], + }, + }); + const title = values.title || null; + field + .query(field.address.concat(randomName, fieldName)) + .take((f) => { + f.title = title || collectionField?.uiSchema?.title; + }); + schema['title'] = title; + await updateSchema({ + key: schema['key'], + title, + }); + }} + > + 自定义字段名称 + + {collectionField?.interface === 'linkTo' && ( + +
+ 标签字段{' '} + + + + + +// Form 用作 decorator 时只用于添加独立的作用域 +
+ + +## Designable Bar + +- Form.DesignableBar + +## Examples + +### 常规表单 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + name: 'form', + 'x-component': 'Form', + 'x-component-props': { + layout: 'horizontal', + }, + properties: { + username: { + type: 'string', + title: '用户名', + required: true, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-component': 'Input', + }, + password: { + type: 'string', + title: '密码', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 栅格布局表单 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; +import { uid } from '@formily/shared'; + +const schema = { + type: 'void', + name: uid(), + 'x-decorator': 'Card', + 'x-component': 'Form', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [`block_${uid()}`]: { + type: 'string', + required: true, + title: '字段1', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [`block_${uid()}`]: { + type: 'string', + required: true, + title: '字段2', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + }, + actions: { + type: 'void', + // 'x-decorator': 'Div', + 'x-component': 'Space', + properties: { + submit: { + type: 'void', + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + }, + title: '提交', + }, + reset: { + type: 'void', + 'x-component': 'Action', + 'x-component-props': {}, + title: '重置', + }, + }, + }, + }, +} + +export default () => { + return ( + + ); +}; +``` + +### 表单设计器 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; +import { uid } from '@formily/shared'; + +const schema = { + type: 'void', + name: uid(), + 'x-decorator': 'BlockItem', + 'x-component': 'Form', + 'x-designable-bar': 'Form.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [`block_${uid()}`]: { + type: 'string', + required: true, + title: '字段1', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-component': 'Input', + }, + }, + }, + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [`block_${uid()}`]: { + type: 'string', + required: true, + title: '字段2', + 'x-decorator': 'FormItem', + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + }, + actions: { + type: 'void', + // 'x-decorator': 'Div', + 'x-component': 'Space', + properties: { + submit: { + type: 'void', + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + }, + title: '提交', + }, + reset: { + type: 'void', + 'x-component': 'Action', + 'x-component-props': { + }, + title: '重置', + }, + }, + }, + }, +} + +export default () => { + return ( + + ); +}; +``` \ No newline at end of file diff --git a/packages/client/src/schemas/form/index.tsx b/packages/client/src/schemas/form/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..deef76c5d3ddab39c88efd76c8590aad6636c711 --- /dev/null +++ b/packages/client/src/schemas/form/index.tsx @@ -0,0 +1,239 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + ISchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, message, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid, merge } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { DesignableBar } from './DesignableBar'; +import { FieldDesignableBar } from './Field.DesignableBar'; +import { createContext } from 'react'; +import { BlockItem } from '../block-item'; +import { + CollectionProvider, + useCollectionContext, + DisplayedMapProvider, + useDisplayedMapContext, +} from '../../constate'; +import { useResource as useGeneralResource } from '../../hooks/useResource'; +import { Resource } from '../../resource'; +import { BaseResult } from '@ahooksjs/use-request/lib/types'; +import { CollectionFieldContext } from '../table'; + +export interface DescriptionsContextProps { + resource?: Resource; + service?: BaseResult; +} + +export const DescriptionsContext = createContext({}); + +const FormMain = (props: any) => { + const { + useResource = useGeneralResource, + showDefaultButtons = false, + ...others + } = props; + const { schema } = useDesignable(); + const form = useMemo(() => { + return createForm({ + readPretty: schema['x-read-pretty'], + }); + }, []); + const { resource, run, service } = useResource({ + onSuccess: (initialValues: any) => { + console.log('onSuccess', { initialValues }); + form.setInitialValues(initialValues); + form.setValues(initialValues); + }, + }); + const path = useSchemaPath(); + const scope = useContext(SchemaExpressionScopeContext); + const options = useContext(SchemaOptionsContext); + const displayed = useDisplayedMapContext(); + const { collection } = useCollectionContext(); + useEffect(() => { + const keys = [...displayed.map.keys()]; + if (keys.length) { + run({ 'fields[appends]': keys }); + console.log(displayed.map, 'displayed.map', collection?.name); + } + }, [displayed.map]); + const s: ISchema = { + type: 'object', + properties: { + [schema.name]: { + ...schema.toJSON(), + 'x-path': path, + // 避免死循环 + 'x-decorator': 'Form.__Decorator', + }, + }, + }; + const content = ( + + {schema['x-decorator'] === 'Form' ? ( + + + + ) : ( + + + + )} + {showDefaultButtons && ( + + + + + )} + + ); + + return schema['x-read-pretty'] ? ( + + {content} + + ) : ( + <>{content} + ); +}; + +export const Form: any = observer((props: any) => { + const { collection } = useCollectionContext(); + return ( + + + + + + ); +}); + +export const RandomNameContext = createContext(null); + +Form.Field = observer((props: any) => { + const { fieldName } = props; + const { schema } = useDesignable(); + const path = getSchemaPath(schema); + const { getField } = useCollectionContext(); + const displayed = useDisplayedMapContext(); + useEffect(() => { + if (fieldName) { + displayed.set(fieldName, schema); + } + }, [fieldName, schema]); + if (!fieldName) { + return null; + } + const collectionField = getField(fieldName); + if (!collectionField) { + return null; + } + const randomName = useContext(RandomNameContext); + const title = schema['title'] || collectionField?.uiSchema?.title; + const required = schema['required'] || collectionField?.uiSchema?.required; + const description = + schema['description'] || collectionField?.uiSchema?.description; + console.log('schema.properties', schema.properties); + + const componentProps = merge( + collectionField?.uiSchema?.['x-component-props'] || {}, + schema?.['x-component-props'] || {}, + { + arrayMerge: (t, s) => s, + }, + ); + return ( + + + + ); +}); + +Form.Field.Item = observer((props) => { + return ( + + {props.children} + + ); +}); + +Form.__Decorator = ({ children }) => children; +Form.DesignableBar = DesignableBar; +Form.Field.DesignableBar = FieldDesignableBar; diff --git a/packages/client/src/schemas/form/style.less b/packages/client/src/schemas/form/style.less new file mode 100644 index 0000000000000000000000000000000000000000..922fcb35488448fc7433b1370b04a9bf7453ce7c --- /dev/null +++ b/packages/client/src/schemas/form/style.less @@ -0,0 +1,45 @@ +.nb-form { + position: relative; + padding: 24px; + margin: -24px; + &.active { + > .designable-bar { + display: block; + } + } + > .designable-bar { + z-index: 1; + pointer-events: none; + display: none; + position: absolute; + top: 0; + right: -0; + left: -0; + bottom: -0; + border-radius: 2px; + border: 2px solid #1890ff; + &.active { + display: block; + } + .designable-bar-actions { + pointer-events: auto; + position: absolute; + right: 0; + line-height: 1rem; + color: #fff; + z-index: 10; + padding: 0 3px; + .ant-space { + gap: 1px !important; + } + .anticon { + width: 16px; + height: 16px; + vertical-align: top; + line-height: 16px; + font-size: 10px; + background-color: #1890ff; + } + } + } +} diff --git a/packages/client/src/schemas/grid/DesignableBar.tsx b/packages/client/src/schemas/grid/DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d3fd1fed760537482e0b310b4a76e5483beb1191 --- /dev/null +++ b/packages/client/src/schemas/grid/DesignableBar.tsx @@ -0,0 +1,90 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { useSchemaPath, SchemaField, useDesignable, removeSchema } from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Modal, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { useCollection, useCollectionContext } from '../../constate'; +import { useTable } from '../table'; +import { DragHandle } from '../../components/Sortable'; + +export const DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const { props: tableProps } = useTable(); + const collectionName = + field.componentProps?.collectionName || tableProps?.collectionName; + const { collection } = useCollection({ collectionName }); + return ( +
+
+ {collection?.title || collection?.name} +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + {/* */} + { + // setVisible(visible); + // }} + overlay={ + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/grid/demos/demo1.tsx b/packages/client/src/schemas/grid/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..035af69a405c43a043fe912a1534d7cb1b312f68 --- /dev/null +++ b/packages/client/src/schemas/grid/demos/demo1.tsx @@ -0,0 +1,190 @@ +import React from 'react'; +import { uid } from '@formily/shared'; +import { + observer, + FormProvider, + useFieldSchema, + RecursionField, + useField, +} from '@formily/react'; +import { ISchema, SchemaRenderer } from '../..'; +import { Grid } from '..'; + +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.CardItem', + }, + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + 'x-component-props': { + width: 30, + }, + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + 'x-component-props': { + width: 70, + }, + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'void', + name: uid(), + 'x-decorator': 'FormItem', + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-component': 'Card', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + properties: { + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + 'x-component-props': { + colsize: [30, 70], + }, + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + [`row_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [`col_${uid()}`]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [uid()]: { + type: 'string', + title: uid(), + 'x-designable-bar': 'FormItem.DesignableBar', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ; +}; diff --git a/packages/client/src/schemas/grid/index.md b/packages/client/src/schemas/grid/index.md new file mode 100644 index 0000000000000000000000000000000000000000..37faf4aacab6183e6ae61f37d0d123efd01a27aa --- /dev/null +++ b/packages/client/src/schemas/grid/index.md @@ -0,0 +1,94 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Grid - 栅格 + +基于行(Row)和列(Col)来定义区块(Block)的外部框架。 + +## 列宽说明 + +最大支持四列,如果要支持越多列,需要处理的比例也越多。 + +### 列宽比例 + +一列:不可更改列宽 + +- 100% + +两列:可以改变列宽,最小列宽 25%,最大列宽 75%,区间节点 50%。改变列宽时,另一列相应增加或减少 + +- 50% | 50% +- 25% | 75% +- 75% | 25% + +三列:可以改变列宽,最小列宽 25%,最大列宽 50%,区间节点 33%。改变列宽时,等比变为非等比,宽度调节器左右两列,变宽的变为 50%,变窄的变为 25%,剩余一列变为 25%;非等比变等比,调整 50% 的列变窄或 25% 的列变宽,此时全部列宽都变为 33.3333% + +- 33.33% | 33.33% | 33.33% +- 25% | 25% | 50% +- 25% | 50% | 25% +- 50% | 25% | 25% + +四列:不可改变列宽,全部 25% + +- 25% | 25% | 25% | 25% + +### 新增列 + +一列变两列,两列宽都为 50% + +- 50% | 50% + +两列变三列,如果是等比,全部列宽变为 33.33%;非等比列,最大列宽变为 50%,其余的列宽变为 25% + +- 33.33% | 33.33% | 33.33% +- 25% | 25% | 50% +- 25% | 50% | 25% +- 50% | 25% | 25% + +三列变四列,全部列宽变为 25% + +- 25% | 25% | 25% | 25% + +### 减少列 + +四列减一列,全部列都变为 33.333% + +- 33.33% | 33.33% | 33.33% + +三列减一列,如果是等比,所有列都变为 50%,其他情况,最宽列变为 50%,其余不变,依旧为 25% + +- 50% | 50% +- 25% | 75% +- 75% | 25% + +两列减一列,剩余列变为 100% + +- 100% + + +## Node Tree + +
+
+  
+    
+      // 添加其他节点
+    
+    
+      // 添加其他节点
+    
+  
+
+
+ +## Designable Bar + +暂无 + +## Examples + + diff --git a/packages/client/src/schemas/grid/index.tsx b/packages/client/src/schemas/grid/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f51826cedfe3428d54cfe157e49cc46a331f4921 --- /dev/null +++ b/packages/client/src/schemas/grid/index.tsx @@ -0,0 +1,384 @@ +import { + DndContext, + DragOverlay, + useDndContext, + closestCorners, + rectIntersection, + closestCenter, + useSensors, + useSensor, + PointerSensor, + MouseSensor, +} from '@dnd-kit/core'; +import { observer, RecursionField } from '@formily/react'; +import React, { useState } from 'react'; +import { useContext } from 'react'; +import { createContext } from 'react'; +import { + findPropertyByPath, + getSchemaPath, + useDesignable, + useSchemaComponent, +} from '../../components/schema-renderer'; +import { Droppable, SortableItem } from '../../components/Sortable'; +import { uid } from '@formily/shared'; +import cls from 'classnames'; +import './style.less'; +import { FormilyISchema, ISchema } from '..'; +import { DesignableBar } from './DesignableBar'; +import { useClient } from '../../constate'; + +const GridRowContext = createContext(null); +const GridColContext = createContext(null); + +export function isGridRowOrCol(schema: ISchema | FormilyISchema) { + if (!schema) { + return; + } + return ['Grid.Row', 'Grid.Col'].includes(schema?.['x-component']); +} + +export const Grid: any = observer((props: any) => { + const { + designable, + root, + schema, + refresh, + deepRemove, + deepRemoveIfEmpty, + remove, + ...methods + } = useDesignable(); + const [dragOverlayContent, setDragOverlayContent] = useState(''); + const [style, setStyle] = useState({}); + const [active, setActive] = useState(false); + const [clientWidths, setClientWidths] = useState([0, 0]); + const { addNewComponent } = props; + const AddNewComponent = useSchemaComponent(addNewComponent); + const { createSchema, removeSchema, updateSchema } = useClient(); + // const sensors = useSensors(useSensor(MouseSensor)); + const rows = Object.values(schema.properties || {}).filter((item) => { + return !item['x-hidden']; + }); + const path = getSchemaPath(schema); + return ( +
+ { + setActive(true); + const el = event?.active?.data?.current?.previewRef + ?.current as HTMLElement; + console.log(event, el); + // setDragOverlayContent(el?.outerHTML); + // setStyle({ width: el?.clientWidth, height: el?.clientHeight }); + const activeType = event?.active?.data?.current?.type; + if (activeType === 'col-resize') { + setDragOverlayContent(''); + const prev = el.previousElementSibling as HTMLDivElement; + const next = el.nextElementSibling as HTMLDivElement; + setClientWidths([prev.clientWidth, next.clientWidth]); + } else { + setDragOverlayContent('拖拽'); + } + }} + onDragCancel={() => { + setActive(false); + }} + onDragMove={(event) => { + const activeType = event?.active?.data?.current?.type; + const el = event?.active?.data?.current?.previewRef + ?.current as HTMLElement; + if (activeType === 'col-resize') { + const prev = el.previousElementSibling as HTMLDivElement; + const next = el.nextElementSibling as HTMLDivElement; + prev.style.width = `calc(${clientWidths[0]}px + ${event.delta.x}px)`; + next.style.width = `calc(${clientWidths[1]}px - ${event.delta.x}px)`; + return; + } + }} + onDragOver={(event) => { + const activeType = event?.active?.data?.current?.type; + console.log({ event }); + if (activeType === 'col-resize') { + return; + } + }} + onDragEnd={async (event) => { + setActive(false); + const activeType = event?.active?.data?.current?.type; + const sourcePath = event?.active?.data?.current?.path; + const targetPath = event?.over?.data?.current?.path; + const method = event?.over?.data?.current?.method; + const type = event?.over?.data?.current?.type; + console.log({ event, sourcePath, targetPath }); + if (activeType === 'col-resize') { + const parentPath = event?.active?.data?.current?.parentPath; + const el = event?.active?.data?.current?.previewRef + ?.current as HTMLElement; + const els = el.parentElement.querySelectorAll( + ':scope > .nb-grid-col', + ); + const size = []; + const gap = el.clientWidth; + els.forEach((el: HTMLDivElement) => { + // const w = (100 * el.clientWidth) / el.parentElement.clientWidth; + const w2 = + (100 * (el.clientWidth + gap + gap / els.length)) / + el.parentElement.clientWidth; + size.push(w2); + // el.style.width = `${w}%`; + }); + const parent = findPropertyByPath(root, parentPath); + parent['x-component-props'] = parent['x-component-props'] || {}; + parent['x-component-props']['colsize'] = size; + await updateSchema({ + key: parent['key'], + 'x-component-props': { + colsize: size, + }, + }); + return; + } + if (!sourcePath || !targetPath) { + return; + } + if (sourcePath === targetPath) { + return; + } + let fn = methods[method]; + if (!fn && type === 'block') { + fn = methods.insertAfter; + } + console.log({ event, sourcePath, targetPath, method, type }); + if (!fn) { + return; + } + const sourceSchema = findPropertyByPath(root, sourcePath); + if (!sourceSchema) { + return; + } + if (!type) { + return; + } + let data; + if (['col-divider', 'col-resize'].includes(type)) { + // if (sourceSchema?.parent?.['x-component'] === 'Grid.Col') { + // // console.log('datadata', sourcePath, targetPath); + // if ( + // sourcePath.join('.').startsWith(targetPath.join('.')) && + // Object.keys(sourceSchema?.parent?.properties).length < 2 + // ) { + // return; + // } + // } + data = { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [sourceSchema.name]: sourceSchema.toJSON(), + }, + }; + } else if (['block', 'col'].includes(type)) { + data = sourceSchema.toJSON(); + } else if (['row-divider', 'row'].includes(type)) { + data = { + type: 'void', + 'x-component': 'Grid.Row', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [sourceSchema.name]: sourceSchema.toJSON(), + }, + }, + }, + }; + } + if (data) { + console.log('datadata', data, type, method); + remove(sourcePath); + const ppath = [...sourcePath]; + ppath.pop(); + const s = fn(data, targetPath); + const removed = deepRemoveIfEmpty(ppath); + const last = removed.pop(); + if (['block', 'col'].includes(type)) { + await updateSchema(s); + } else { + await createSchema(s); + } + if (isGridRowOrCol(last)) { + await removeSchema(last); + } + } + }} + > + +
+ + + {rows.map((property, index) => { + return ( + <> + {index > 0 && ( + + )} + + + ); + })} + + + {designable && AddNewComponent && } +
+ ); +}); + +Grid.Row = observer((props: any) => { + const { designable, schema } = useDesignable(); + const columns = Object.values(schema.properties || {}).filter((item) => { + return !item['x-hidden']; + }); + const columnCount = columns.length; + const path = getSchemaPath(schema); + let size = schema['x-component-props']?.['colsize'] || []; + if (size?.length !== columnCount) { + size = []; + } + return ( + + + + {columns.map((property, index) => { + return ( + <> + {index > 0 && ( + + )} + + + + + ); + })} + + + + ); +}); + +Grid.Col = observer((props: any) => { + const { schema, designable, DesignableBar } = useDesignable(); + // const { width } = props; + const { columnCount } = useContext(GridRowContext); + const { width } = useContext(GridColContext); + return ( + + {/* */} + {props.children} + {/* */} + + ); +}); + +Grid.Col.DesignableBar = DesignableBar; diff --git a/packages/client/src/schemas/grid/style.less b/packages/client/src/schemas/grid/style.less new file mode 100644 index 0000000000000000000000000000000000000000..f53df5f81e0393ac83771f8ca16f4986de45d818 --- /dev/null +++ b/packages/client/src/schemas/grid/style.less @@ -0,0 +1,169 @@ +.nb-grid-col-divider { + width: 24px; +} +.nb-grid-row { + margin: 0px -24px; + display: flex; +} + +// .nb-grid { +// .nb-grid-col-divider { +// &.resizable { +// cursor: col-resize; +// &:hover { +// background: #e6f7ff; +// } +// } +// } +// } + +body:not(.dragging) { + .nb-grid { + .nb-grid-col-divider { + &.resizable { + cursor: col-resize; + &:hover { + background: #e6f7ff; + } + } + } + } +} + +body.dragging { + .designable-bar { + display: none !important; + } +} + +.nb-grid { + position: relative; +} + +body.dragging { + .nb-grid-col-divider { + &.hover { + background: #e6f7ff; + } + } + .nb-grid-row-divider { + // background-color: #ddd; + height: 24px; + width: 100%; + position: absolute; + z-index: 20; + // opacity: 0.5; + transform: translateY(-100%); + &.hover { + background: #e6f7ff; + } + } + .nb-grid-block { + position: relative; + &.hover { + &::after { + background: #e6f7ff; + content: ''; + display: block; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 12px; + z-index: 30; + } + &.top-half { + &::after { + top: 0; + bottom: auto; + } + } + } + } +} + +.nb-grid-block.dragging { + > div > .designable-bar { + display: block !important; + } +} + +.drag-container { + .nb-grid-block.dragging .designable-bar { + display: none !important; + } +} + +.anticon-drag { + cursor: grab; +} + +.nb-block-item { + position: relative; + &.isDragging { + opacity: 0.3; + } + &.isOver::after { + content: ''; + position: absolute; + bottom: -24px; + height: 20px; + width: 100%; + background: rgba(241, 139, 98, 0.1) !important; + } +} + +.nb-grid-row, +.nb-grid-col { + position: relative; + &.isOver::after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + height: 20px; + width: 100%; + background: rgba(241, 139, 98, 0.1) !important; + } +} + +.nb-grid-row-divider.isOver, +.nb-grid-col-divider.isOver { + background: rgba(241, 139, 98, 0.1) !important; +} +.nb-grid-drag-overlay { + opacity: 0.6; + .designable-bar { + background: rgba(241, 139, 98, 0.1) !important; + } + pointer-events: none; + * { + pointer-events: none; + } +} + +.nb-grid-row-divider { + // background-color: #ddd; + height: 24px; + width: 100%; + top: auto; + margin-top: -24px; + position: absolute; + z-index: 20; + display: none; + // opacity: 0.5; + // background: #e6f7ff; +} +.nb-grid.active { + .nb-grid-row-divider { + display: block; + } +} +.nb-grid-col-divider { + &.resizable { + cursor: col-resize; + &:hover { + background: rgba(241, 139, 98, 0.1) !important; + } + } +} diff --git a/packages/client/src/schemas/icon-picker/index.md b/packages/client/src/schemas/icon-picker/index.md new file mode 100644 index 0000000000000000000000000000000000000000..d2430d15c89373dabaa636806d7d6b8d6198da58 --- /dev/null +++ b/packages/client/src/schemas/icon-picker/index.md @@ -0,0 +1,65 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# IconPicker - 图标选择器 + +## Node Tree + +
+
+
+ +## Designable Bar + +- IconPicker.DesignableBar + +## Examples + +```tsx +/** + * title: 图标 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'icon', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'icon', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + } +}; + +export default () => { + return ( +
+ +
+ ); +}; +``` diff --git a/packages/client/src/schemas/icon-picker/index.tsx b/packages/client/src/schemas/icon-picker/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a1126b50e62365cb2af07bdf16d55f4bd0db5ae5 --- /dev/null +++ b/packages/client/src/schemas/icon-picker/index.tsx @@ -0,0 +1,83 @@ +import React, { useState } from 'react'; +import { connect, mapProps, mapReadPretty } from '@formily/react'; +import { Input, Popover, Button } from 'antd'; +import { LoadingOutlined, CloseOutlined } from '@ant-design/icons'; +import { + icons, + hasIcon, + IconPicker as Icon, +} from '../../components/icon-picker'; +import { isValid } from '@formily/shared'; + +function IconField(props: any) { + const { value, onChange } = props; + const [visible, setVisible] = useState(false); + return ( +
+ + { + setVisible(val); + }} + content={ +
+ {[...icons.keys()].map((key) => ( + { + onChange(key); + setVisible(false); + }} + > + + + ))} +
+ } + title="图标" + trigger="click" + > + +
+ {value && ( + + )} +
+
+ ); +} + +export const IconPicker = connect( + IconField, + mapProps((props, field) => { + return { + ...props, + suffix: ( + + {field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffix + )} + + ), + }; + }), + mapReadPretty((props) => { + if (!isValid(props.value)) { + return
; + } + return ; + }), +); + +export default IconPicker; diff --git a/packages/client/src/schemas/index.tsx b/packages/client/src/schemas/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4fe42846f307af4cf4ce0b7cf5c682ff99df0b42 --- /dev/null +++ b/packages/client/src/schemas/index.tsx @@ -0,0 +1,122 @@ +import React from 'react'; +import { + ISchema as IFormilySchema, + observer, + Schema, + useField, +} from '@formily/react'; +import { extend } from 'umi-request'; + +import './designable-bar/style.less'; + +export type FormilyISchema = IFormilySchema; + +export interface ISchema extends IFormilySchema { + [key: string]: any; + properties?: { + [key: string]: ISchema | IFormilySchema; + }; +} + +export * from '../components/schema-renderer'; + +export function useDefaultAction() { + return { + async run() {}, + }; +} + +export const request = extend({ + prefix: process.env.API_URL, + timeout: 30000, +}); + +request.use(async (ctx, next) => { + const { headers } = ctx.req.options as any; + const token = localStorage.getItem('NOCOBASE_TOKEN'); + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + await next(); +}); + +console.log('process.env.API_URL', process.env.API_URL); + +export async function createOrUpdateCollection(data: any) { + return await request('collections:createOrUpdate', { + method: 'post', + data, + }); +} + +export async function createCollectionField(collectionName: string, data: any) { + return await request(`collections/${collectionName}/fields:create`, { + method: 'post', + data, + }); +} + +export async function deleteCollection(name) { + await request('collections:destroy', { + method: 'post', + params: { + filter: { + name, + }, + }, + }); +} + +export async function createSchema(schema: ISchema) { + if (!schema) { + return; + } + if (!schema['key']) { + return; + } + return await request('ui_schemas:create', { + method: 'post', + data: schema.toJSON(), + }); +} + +export async function collectionMoveToAfter(source, target) { + if (source && target) { + return request(`collections:sort/${source}`, { + method: 'post', + data: { + field: 'sort', + target: { + name: target, + }, + }, + }); + } +} + +export async function updateSchema(schema: ISchema) { + if (!schema) { + return; + } + if (!schema['key']) { + return; + } + return await request(`ui_schemas:update/${schema.key}`, { + method: 'post', + data: Schema.isSchemaInstance(schema) ? schema.toJSON() : schema, + }); +} + +export async function removeSchema(schema: ISchema) { + if (!schema['key']) { + return; + } + await request('ui_schemas:destroy', { + method: 'post', + params: { + filter: { + key: schema['key'], + }, + }, + }); +} diff --git a/packages/client/src/schemas/input-number/index.md b/packages/client/src/schemas/input-number/index.md new file mode 100644 index 0000000000000000000000000000000000000000..27619b2535e5c65bc20dbf3c159f0633d3eeb68b --- /dev/null +++ b/packages/client/src/schemas/input-number/index.md @@ -0,0 +1,197 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# InputNumber - 数字框 + +## Node Tree + +
+
+
+ +## Designable Bar + +- InputNumber.DesignableBar + +## Examples + +### 数字框 + +```tsx +/** + * title: 数字框 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'number', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'number', + type: 'number', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 百分比 + +```tsx +/** + * title: 百分比 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'number', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + placeholder: 'please enter', + addonAfter: '%', + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'number', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + placeholder: 'please enter', + addonAfter: '%', + }, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 精度 + +```tsx +/** + * title: 精度 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'number', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + placeholder: 'please enter', + stringMode: true, + step: '0.001', + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'number', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + placeholder: 'please enter', + stringMode: true, + step: '0.001', + }, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### addonBefore 和 addonAfter 支持 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'number', + title: `数字`, + 'x-component': 'InputNumber', + 'x-component-props': { + placeholder: 'please enter', + addonBefore: '前缀', + addonAfter: '后缀', + }, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/input-number/index.tsx b/packages/client/src/schemas/input-number/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2db915554266a5e3abf6a4c2b1bbc5b78baf43d8 --- /dev/null +++ b/packages/client/src/schemas/input-number/index.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { connect, mapReadPretty } from '@formily/react'; +import { InputNumber as AntdNumber, Input, Button } from 'antd'; +import { Display } from '../display'; +import getMiniDecimal, { toFixed } from 'rc-input-number/lib/utils/MiniDecimal'; +import { getNumberPrecision } from 'rc-input-number/lib/utils/numberUtil'; +import { isValid } from '@formily/shared'; +import cls from 'classnames'; +import './style.less'; + +export const InputNumber: any = connect( + (props) => { + const { addonBefore, addonAfter, ...others } = props; + const content = ; + if (!addonBefore && !addonAfter) { + return content; + } + return ( +
+ {addonBefore && ( +
{addonBefore}
+ )} + {content} + {addonAfter && ( +
{addonAfter}
+ )} +
+ ); + }, + mapReadPretty((props: any) => { + const { step, value, addonBefore, addonAfter } = props; + if (!isValid(props.value)) { + return
; + } + const precision = Math.max( + getNumberPrecision(String(value)), + getNumberPrecision(step), + ); + return ( +
+ {addonBefore} + {toFixed(String(value), '.', precision)} + {addonAfter} +
+ ); + }), +); + +InputNumber.Percent = connect( + AntdNumber, + mapReadPretty((props: any) => { + const { step, value } = props; + if (!isValid(props.value)) { + return
; + } + return toFixed( + String(value), + '.', + Math.max(getNumberPrecision(String(value)), getNumberPrecision(step)), + ); + }), +); + +export default InputNumber; diff --git a/packages/client/src/schemas/input-number/style.less b/packages/client/src/schemas/input-number/style.less new file mode 100644 index 0000000000000000000000000000000000000000..658e000e1980a194134abf6ce840e4036caa10db --- /dev/null +++ b/packages/client/src/schemas/input-number/style.less @@ -0,0 +1,27 @@ +.nb-input-number { + display: table; + width: 100%; + line-height: 32px; + .ant-input-number { + width: 100%; + } + .ant-input-number, + .ant-input-group-addon { + display: table-cell; + } + .ant-input-group-addon { + vertical-align: middle; + } + &.has-addon-before { + .ant-input-number { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + &.has-addon-after { + .ant-input-number { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } +} diff --git a/packages/client/src/schemas/input/DesignableBar.tsx b/packages/client/src/schemas/input/DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..376b45f7165bfcf6acfe1eb66fc0d9a60edf0f8a --- /dev/null +++ b/packages/client/src/schemas/input/DesignableBar.tsx @@ -0,0 +1,56 @@ +import React, { useState } from 'react'; +import classNames from 'classnames'; +import { useField, observer, RecursionField, Schema } from '@formily/react'; +import { Dropdown, Menu, Switch } from 'antd'; +import { + MenuOutlined, + ArrowUpOutlined, + ArrowDownOutlined, + DeleteOutlined, +} from '@ant-design/icons'; + +export const DesignableBar = (props) => { + const [active, setActive] = useState(false); + const field = useField(); + return ( + <> + { + setActive(false); + }} + icon={} + > + 在上方插入区块 + + { + setActive(false); + }} + icon={} + > + 在下方插入区块 + + + {}}> + { + // field.query(key).take((target: Formily.Core.Models.Field) => { + // target.required = checked; + // }); + }} + checkedChildren="必填" + unCheckedChildren="非必填" + /> + + + { + setActive(false); + }} + icon={} + > + 删除区块 + + + ); +}; diff --git a/packages/client/src/schemas/input/index.md b/packages/client/src/schemas/input/index.md new file mode 100644 index 0000000000000000000000000000000000000000..852230a701d5f1af6c97ceea0e8414d06c290d24 --- /dev/null +++ b/packages/client/src/schemas/input/index.md @@ -0,0 +1,268 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Input - 输入框 + +输入框是非常常用的控件,参数可以组合成许多字段,如单行文本、多行文本、手机号、邮箱、网址等。 + +## Node Tree + +
+
+
+
+ +## Designable Bar + +- Input.DesignableBar +- Input.TextArea.DesignableBar + +## Examples + +### 单行文本 + +```tsx +/** + * title: 单行文本 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, +} + +export default () => { + return ( + + ); +}; +``` + +### 多行文本 + +```tsx +/** + * title: 多行文本 + * desc: 用于多行输入,使用 `Input.TextArea` 组件,`ellipsis=true` 时超出隐藏 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'string', + type: 'string', + title: `编辑模式`, + name: 'name1', + 'x-decorator': 'FormItem', + 'x-component': 'Input.TextArea', + 'x-reactions': { + target: '*(read1,read2)', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read1: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input.TextArea', + }, + read2: { + interface: 'string', + type: 'string', + title: `阅读模式(超出隐藏)`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input.TextArea', + 'x-component-props': { + ellipsis: true, + }, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 电子邮箱 + +```tsx +/** + * title: 电子邮箱 + * desc: 加上邮箱验证 `x-validator=email` + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'string', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-validator': 'email', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-validator': 'email', + }, + }, +} + +export default () => { + return ( + + ); +}; +``` + +### 手机号 + +```tsx +/** + * title: 手机号 + * desc: 加上手机号验证 `x-validator=phone` + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'string', + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-validator': 'phone', + 'x-reactions': { + target: 'name2', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-validator': 'phone', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 网址 + +```tsx +/** + * title: 网址 + * desc: 加上 URL 验证 `x-validator=url` + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Input.URL', + 'x-validator': 'url', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Input.URL', + 'x-validator': 'url', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/input/index.tsx b/packages/client/src/schemas/input/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..01ca5104711ddb88b493cf3d195fa9100e9c72c2 --- /dev/null +++ b/packages/client/src/schemas/input/index.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + useField, + useFieldSchema, +} from '@formily/react'; +import { Input as AntdInput } from 'antd'; +import { InputProps, TextAreaProps } from 'antd/lib/input'; +import { Display } from '../display'; +import { DesignableBar } from './DesignableBar'; +import { Dropdown, Menu, Space } from 'antd'; +import { LoadingOutlined, MenuOutlined, DragOutlined } from '@ant-design/icons'; +import { getSchemaPath, useDesignable } from '../../components/schema-renderer'; +import { useContext, useState } from 'react'; +import AddNew from '../add-new'; +import cls from 'classnames'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { uid } from '@formily/shared'; +import { removeSchema, updateSchema } from '..'; +import { isGridRowOrCol } from '../grid'; +import { DragHandle } from '../../components/Sortable'; + +type ComposedInput = React.FC & { + TextArea?: React.FC; + URL?: React.FC; + DesignableBar?: React.FC; +}; + +export const Input: ComposedInput = connect( + AntdInput, + mapProps((props, field) => { + return { + ...props, + suffix: ( + + {field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffix + )} + + ), + }; + }), + mapReadPretty(Display.Input), +); + +Input.TextArea = connect(AntdInput.TextArea, mapReadPretty(Display.TextArea)); +Input.URL = connect(AntdInput, mapReadPretty(Display.URL)); + +export default Input; diff --git a/packages/client/src/schemas/kanban/CardDesignableBar.tsx b/packages/client/src/schemas/kanban/CardDesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..47b916f262efad294604a86920dc8ed36eeb8a94 --- /dev/null +++ b/packages/client/src/schemas/kanban/CardDesignableBar.tsx @@ -0,0 +1,130 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { useSchemaPath, SchemaField, useDesignable, ISchema } from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { + useCollection, + useCollectionContext, + useDisplayedMapContext, + useClient, +} from '../../constate'; +import { useTable } from '../table'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { useKanban } from '.'; +import { isAssociation } from '../database-field/interfaces'; + +export const CardDesignableBar = observer((props) => { + const field = useField(); + const { schema, appendChild, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { collection, fields } = useCollectionContext(); + const displayed = useDisplayedMapContext(); + console.log('useDisplayedMapContext', schema); + const { service } = useKanban(); + const { createSchema, removeSchema } = useClient(); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + { + setVisible(visible); + }} + overlay={ + + + {fields?.map((field) => ( + { + if (!checked) { + const s: any = displayed.get(field.name); + const p = getSchemaPath(s); + const removed = deepRemove(p); + if (!removed) { + console.log('getSchemaPath', p, removed); + return; + } + const last = removed.pop(); + displayed.remove(field.name); + await removeSchema(last); + if (isAssociation(field)) { + const appends = service.params[0]?.appends || []; + const index = appends.indexOf(field.name); + if (index > -1) { + appends.splice(index, 1); + } + await service.run({ + ...service.params[0], + appends, + }); + } + return; + } + let data: ISchema = { + key: uid(), + name: uid(), + type: 'void', + 'x-decorator': 'Form.Field.Item', + 'x-decorator-props': { + draggable: false, + }, + 'x-designable-bar': 'Kanban.FieldDesignableBar', + 'x-component': 'Form.Field', + 'x-component-props': { + fieldName: field.name, + }, + }; + const s = appendChild(data); + await createSchema(s); + if (isAssociation(field)) { + const appends = service.params[0]?.appends || []; + appends.push(field.name); + await service.run({ ...service.params[0], appends }); + } + }} + /> + ))} + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/kanban/DesignableBar.tsx b/packages/client/src/schemas/kanban/DesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0a3ec0ec0bb68327e3ad8bfe90d9ba0ebd822003 --- /dev/null +++ b/packages/client/src/schemas/kanban/DesignableBar.tsx @@ -0,0 +1,143 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Modal, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { useCollection, useCollectionContext } from '../../constate'; +import { useTable } from '../table'; +import { DragHandle } from '../../components/Sortable'; +import { fieldsToFilterColumns } from '../calendar'; + +export const DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const { props: tableProps } = useTable(); + const collectionName = + field.componentProps?.collectionName || tableProps?.collectionName; + const { collection, fields } = useCollection({ collectionName }); + return ( +
+
+ {collection?.title || collection?.name} +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + // setVisible(visible); + // }} + overlay={ + + {/* { + field.readPretty = true; + }} + > + 编辑表单配置 + */} + { + const { defaultFilter } = await FormDialog( + '设置数据范围', + () => { + return ( + + + + ); + }, + ).open({ + initialValues: { + defaultFilter: + field?.componentProps?.defaultFilter || {}, + }, + }); + schema['x-component-props']['defaultFilter'] = + defaultFilter; + field.componentProps.defaultFilter = defaultFilter; + await updateSchema(schema); + }} + > + 设置数据范围 + + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/kanban/FieldDesignableBar.tsx b/packages/client/src/schemas/kanban/FieldDesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9d3f50b023b85411f25a339df8d24fcaecc9d908 --- /dev/null +++ b/packages/client/src/schemas/kanban/FieldDesignableBar.tsx @@ -0,0 +1,156 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Modal, Space, Switch } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { RandomNameContext } from '../form'; +import { useCollectionContext, useDisplayedMapContext } from '../../constate'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { DragHandle } from '../../components/Sortable'; + +export const FieldDesignableBar = observer((props) => { + const field = useField(); + const { schema, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + const randomName = useContext(RandomNameContext); + const displayed = useDisplayedMapContext(); + const fieldName = schema['x-component-props']?.['fieldName']; + const { getField } = useCollectionContext(); + + const collectionField = getField(fieldName); + + console.log({ collectionField }); + + const realField = field + .query(field.address.concat(randomName, fieldName)) + .take(); + + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + {/* + */} + { + // setVisible(visible); + // }} + overlay={ + + { + const values = await FormDialog('自定义字段名称', () => { + return ( + + + + ); + }).open({ + initialValues: { + fieldName: collectionField?.uiSchema?.title, + title: schema['title'], + }, + }); + const title = values.title || null; + field + .query(field.address.concat(randomName, fieldName)) + .take((f) => { + f.title = title || collectionField?.uiSchema?.title; + }); + schema['title'] = title; + await updateSchema({ + key: schema['key'], + title, + }); + }} + > + 自定义字段名称 + + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + const fieldName = + schema['x-component-props']?.['fieldName']; + const last = removed.pop(); + displayed.remove(fieldName); + await removeSchema(last); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/kanban/demos/demo1.tsx b/packages/client/src/schemas/kanban/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..741e40051ef62c400854bcb63d830ef8568b09b7 --- /dev/null +++ b/packages/client/src/schemas/kanban/demos/demo1.tsx @@ -0,0 +1,218 @@ +import React from 'react'; +import { ISchema, SchemaRenderer } from '../../'; +import { Kanban } from '..'; +import { uid } from '@formily/shared'; + +const schema: ISchema = { + type: 'array', + name: 'kanban1', + 'x-component': 'Kanban', + 'x-component-props': { + groupField: { + name: 'type', + enum: [ + { + label: 'A', + value: 'A', + color: 'magenta', + }, + { + label: 'B', + value: 'B', + color: 'green', + }, + { + label: 'C', + value: 'C', + color: 'blue', + }, + { + label: 'D', + value: 'D', + color: 'purple', + }, + ], + }, + }, + default: [ + { + id: '1', + type: 'A', + title: 'A1', + content: ( +

+ Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum + dolorum theophrastus.{' '} +

+ ), + }, + { + id: '2', + type: 'A', + title: 'A2', + content: ( +

+ Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum + dolorum theophrastus.{' '} +

+ ), + }, + { + id: '3', + type: 'A', + title: 'A3', + }, + { + id: '4', + type: 'B', + title: 'B4', + content: ( +

+ Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum + dolorum theophrastus. Vim ea utamur appetere molestiae, ad harum + alienum indoctum ius. No quo laoreet laboramus comprehensam, eos paulo + integre vivendo eu, an nam alia facilisi consetetur. Pro exerci iisque + et, no amet magna iracundia vim. Vis erant consectetuer te, mei + menandri liberavisse at, no latine consulatu deseruisse eos. Mel an + novum nostrud scripserit, velit virtute delicata eam ad, eum ne etiam + omnesque. +

+ ), + }, + { + id: '5', + type: 'B', + title: 'B5', + content: ( +

+ Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum + dolorum theophrastus. Vim ea utamur appetere molestiae, ad harum + alienum indoctum ius. No quo laoreet laboramus comprehensam, eos paulo + integre vivendo eu, an nam alia facilisi consetetur. Pro exerci iisque + et, no amet magna iracundia vim. Vis erant consectetuer te, mei + menandri liberavisse at, no latine consulatu deseruisse eos. Mel an + novum nostrud scripserit, velit virtute delicata eam ad, eum ne etiam + omnesque. +

+ ), + }, + { + id: '6', + type: 'B', + title: 'B6', + }, + { + id: '7', + type: 'C', + title: 'C7', + content: ( +

+ Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum + dolorum theophrastus.{' '} +

+ ), + }, + { + id: '8', + type: 'C', + title: 'C8', + }, + { + id: '9', + type: 'C', + title: 'C9', + }, + ], + properties: { + create: { + type: 'void', + title: '添加卡片', + // 'x-designable-bar': 'Kanban.AddCardDesignableBar', + 'x-component': 'Kanban.Card.AddNew', + // 'x-decorator': 'AddNew.Displayed', + 'x-component-props': { + type: 'text', + icon: 'PlusOutlined', + }, + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Kanban.useCreateResource }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Kanban.useCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + card1: { + type: 'void', + name: uid(), + 'x-decorator': 'Form', + 'x-component': 'Kanban.Card', + 'x-designable-bar': 'Kanban.Card.DesignableBar', + 'x-read-pretty': true, + 'x-decorator-props': { + useResource: '{{ Kanban.useSingleResource }}', + }, + properties: { + // [uid()]: { + // type: 'void', + // 'x-decorator': 'BlockItem', + // 'x-decorator-props': { + // draggable: false, + // }, + // 'x-component': 'Grid', + // 'x-designable-bar': 'Kanban.Card.DesignableBar', + // // 'x-component-props': { + // // addNewComponent: 'AddNew.FormItem', + // // }, + // }, + }, + }, + view1: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-component': 'Kanban.Card.View', + 'x-component-props': { + useOkAction: '{{ Kanban.useUpdateAction }}', + }, + 'x-decorator-props': { + useResource: '{{ Kanban.useSingleResource }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, +}; + +export default () => { + return ( + + ); +}; diff --git a/packages/client/src/schemas/kanban/index.md b/packages/client/src/schemas/kanban/index.md new file mode 100644 index 0000000000000000000000000000000000000000..b62a4f54aaa9d8be1908bdbfdb99d404e57308be --- /dev/null +++ b/packages/client/src/schemas/kanban/index.md @@ -0,0 +1,28 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Kanban - 看板 + +## Node Tree + +
+
+  
+    // 看板卡片
+    
+      
+    
+  
+  
+    // 查看卡片详情
+  
+
+
+ +## Examples + + diff --git a/packages/client/src/schemas/kanban/index.tsx b/packages/client/src/schemas/kanban/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d0ab89863f7681e4190a70d10deb261b39f22721 --- /dev/null +++ b/packages/client/src/schemas/kanban/index.tsx @@ -0,0 +1,582 @@ +import { + DndContext, + DragOverlay, + PointerSensor, + useDroppable, + useSensor, + useSensors, + rectIntersection, + closestCenter, + closestCorners, +} from '@dnd-kit/core'; +import { + SortableContext, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { ArrayField } from '@formily/core'; +import { + observer, + RecursionField, + Schema, + useField, + useForm, +} from '@formily/react'; +import { Card, Spin, Tag } from 'antd'; +import { groupBy, omit } from 'lodash'; +import React, { createContext, useContext, useEffect, useRef } from 'react'; +import { useState } from 'react'; +import { CSS } from '@dnd-kit/utilities'; +import cls from 'classnames'; +import './style.less'; +import { + CollectionProvider, + useCollectionContext, + useResourceRequest, +} from '../../constate'; +import { Resource } from '../../resource'; +import { useRequest } from 'ahooks'; +import { Action } from '../action'; +import { CardDesignableBar } from './CardDesignableBar'; +import { VisibleContext } from '../../context'; +import { DesignableBar } from './DesignableBar'; +import { useDesignable } from '../../components/schema-renderer'; +import { Form } from '../form'; +import { FieldDesignableBar } from './FieldDesignableBar'; + +function Droppable(props) { + const { id, data, ...others } = props; + const { setNodeRef } = useDroppable({ + id, + data, + }); + + return
; +} + +function SortableItem(props) { + const { id, data, className, ...others } = props; + const nodeRef = useRef(); + const { + isDragging, + attributes, + listeners, + setNodeRef, + transform, + transition, + } = useSortable({ + id, + data: { ...data, nodeRef }, + }); + + const style = { + ...props.style, + transform: CSS.Transform.toString(transform), + transition, + }; + + return ( +
{ + setNodeRef(el); + nodeRef.current = el; + }} + style={style} + className={cls(className, { isDragging })} + {...attributes} + {...listeners} + > + {props.children} +
+ ); +} + +interface KanbanContextProps { + props?: any; + service?: any; + resource?: Resource; + [key: string]: any; +} + +interface KanbanCardContextProps { + record?: any; + [key: string]: any; +} + +interface KanbanColumnContextProps { + [key: string]: any; +} + +export const KanbanContext = createContext(null); +export const KanbanColumnContext = + createContext(null); +export const KanbanCardContext = createContext(null); + +export const useKanban = () => { + return useContext(KanbanContext); +}; + +const KanbanColumn = (props) => { + const option = useContext(KanbanColumnContext); + const { field, schemas } = useKanban(); + const { items } = props; + return ( +
+ + {items?.map((item) => { + const index = field.value?.findIndex((val) => val.id === item.id); + return ( + + + {/* {item.id} */} + + + + ); + })} + +
+ ); +}; + +const InternalKanban = observer((props: any) => { + const { getField } = useCollectionContext(); + const collectionField = getField(props.groupField?.name); + const groupField = { + ...collectionField?.uiSchema, + ...props.groupField, + }; + const field = useField(); + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 10, + }, + }), + ); + const groups = groupBy(field.value, groupField.name); + const { collectionName } = props; + const resource = useResourceRequest(collectionName); + const service = useRequest( + (params) => { + if (!collectionName) { + return Promise.resolve([]); + } + return resource.list({ + ...params, + perPage: -1, + sort: 'sort', + }); + }, + { + formatResult: (data) => data?.data, + onSuccess(data) { + field.setValue(data); + }, + manual: true, + // refreshDeps: [props.fieldNames], + }, + ); + useEffect(() => { + service.run({ + appends: fieldFields(schemas.get('Kanban.Card')), + defaultFilter: props?.defaultFilter, + }); + }, [props.defaultFilter]); + const { schema } = useDesignable(); + const [schemas, setSchemas] = useState(() => { + const schemas = new Map(); + schema.reduceProperties((map, current) => { + if (current['x-component'] === 'Kanban.Card') { + map.set('Kanban.Card', current); + } + if (current['x-component'] === 'Kanban.Card.AddNew') { + map.set('Kanban.Card.AddNew', current); + } + if (current['x-component'] === 'Kanban.Card.View') { + map.set('Kanban.Card.View', current); + } + return map; + }, schemas); + return schemas; + }); + const addNewCardSchema = schemas.get('Kanban.Card.AddNew'); + const [dragOverlayContent, setDragOverlayContent] = useState(''); + const [lastId, setLastId] = useState(null); + console.log('field.value', schemas); + return ( + + { + const el = event?.active?.data?.current?.nodeRef + ?.current as HTMLElement; + setDragOverlayContent(el?.outerHTML); + }} + onDragMove={({ active, over }) => { + const overId = over?.id; + const activeId = active?.id; + if (!overId || !activeId) { + return; + } + if (overId === activeId) { + return; + } + const overType = over?.data?.current?.type; + const activeItem = field.value.find((item) => item.id === activeId); + if (overType === 'column') { + if (overId === activeItem?.[groupField.name]) { + return; + } + const len = groups?.[overId]?.length; + if (len > 0) { + const last = groups?.[overId]?.[len - 1]; + setLastId(last.id); + const activeIndex = field.value.findIndex( + (item) => item.id === activeId, + ); + const overIndex = field.value.findIndex( + (item) => item.id === last.id, + ); + console.log({ overId, last, overIndex, activeIndex }); + field.move(activeIndex, overIndex); + } + activeItem[groupField.name] = overId; + } else { + const overColumnId = over?.data?.current?.columnId; + const activeColumnId = active?.data?.current?.columnId; + if (!overColumnId || !activeColumnId) { + return; + } + if (overColumnId !== activeColumnId) { + activeItem[groupField.name] = overColumnId; + const activeIndex = field.value.findIndex( + (item) => item.id === activeId, + ); + const overIndex = field.value.findIndex( + (item) => item.id === overId, + ); + console.log({ overId, overIndex, activeIndex }); + field.move(activeIndex, overIndex); + } + } + }} + onDragEnd={async ({ active, over }) => { + console.log('onDragEnd', { lastId, active, over }); + const overId = over?.id; + const activeId = active?.id; + if (!overId || !activeId) { + return; + } + if (overId === activeId) { + const overColumnId = over?.data?.current?.columnId; + await resource.save( + { + [groupField.name]: overColumnId, + }, + { + resourceKey: activeId, + }, + ); + await resource.sort({ + resourceKey: activeId, + field: 'sort', + target: lastId + ? { + id: lastId, + } + : {}, + }); + setLastId(null); + return; + } + const overType = over?.data?.current?.type; + if (overType !== 'column') { + const overColumnId = over?.data?.current?.columnId; + const activeColumnId = active?.data?.current?.columnId; + if (!overColumnId || !activeColumnId) { + return; + } + if (overColumnId !== activeColumnId) { + return; + } + const activeIndex = field.value.findIndex( + (item) => item.id === activeId, + ); + const overIndex = field.value.findIndex( + (item) => item.id === overId, + ); + field.move(activeIndex, overIndex); + await resource.save( + { + [groupField.name]: overColumnId, + }, + { + resourceKey: activeId, + }, + ); + await resource.sort({ + resourceKey: activeId, + field: 'sort', + target: { + id: overId, + }, + }); + } else { + await resource.save( + { + [groupField.name]: overId, + }, + { + resourceKey: activeId, + }, + ); + await resource.sort({ + resourceKey: activeId, + field: 'sort', + target: lastId + ? { + id: lastId, + } + : {}, + }); + setLastId(null); + } + }} + > + +
+ + +
+
+ {groupField?.enum?.map((option) => { + const items = field.value?.filter( + (item) => item?.[groupField.name] === option.value, + ); + return ( + + +
+ {option.label} +
+ + +
+
+ ); + })} +
+
+
+ + + ); +}); + +export const Kanban: any = observer((props: any) => { + return ( + + + + ); +}); + +Kanban.useCreateResource = ({ onSuccess }) => { + const { props } = useKanban(); + const column = useContext(KanbanColumnContext); + const { collection } = useCollectionContext(); + const resource = useResourceRequest({ + resourceName: collection?.name || props.collectionName, + }); + const groupField = props.groupField; + const service = useRequest( + (params?: any) => { + return Promise.resolve({ + [groupField.name]: column.value, + }); + }, + { + onSuccess, + }, + ); + return { resource, service, initialValues: service.data, ...service }; +}; + +Kanban.useCreateAction = () => { + const { service, resource, props } = useKanban(); + const column = useContext(KanbanColumnContext); + const groupField = props.groupField; + const form = useForm(); + const [, setVisible] = useContext(VisibleContext); + return { + async run() { + await resource.create({ + ...form.values, + [groupField.name]: column.value, + }); + setVisible(false); + await form.reset(); + return service.refresh(); + }, + }; +}; + +Kanban.useUpdateAction = () => { + const { service, resource, props } = useKanban(); + const ctx = useContext(KanbanCardContext); + const form = useForm(); + const [, setVisible] = useContext(VisibleContext); + return { + async run() { + await resource.save(omit(form.values, ['sort']), { + resourceKey: ctx.record.id, + }); + setVisible(false); + await service.refresh(); + }, + }; +}; + +Kanban.useRowResource = ({ onSuccess }) => { + const { props } = useKanban(); + const { collection } = useCollectionContext(); + const ctx = useContext(KanbanCardContext); + const resource = useResourceRequest({ + resourceName: collection?.name || props.collectionName, + resourceKey: ctx?.record?.id, + }); + const service = useRequest( + (params?: any) => { + return Promise.resolve(ctx.record); + }, + { + // formatResult: (result) => result?.data, + onSuccess, + refreshDeps: [ctx?.record], + // manual, + }, + ); + return { resource, service, initialValues: service.data, ...service }; +}; + +const fieldFields = (schema: Schema) => { + const names = []; + schema.reduceProperties((buf, current) => { + if (current['x-component'] === 'Form.Field') { + const fieldName = current['x-component-props']?.['fieldName']; + if (fieldName) { + buf.push(fieldName); + } + } else { + const fieldNames = fieldFields(current); + buf.push(...fieldNames); + } + return buf; + }, names); + return names; +}; + +Kanban.useSingleResource = ({ onSuccess }) => { + const { props } = useKanban(); + const { collection } = useCollectionContext(); + const ctx = useContext(KanbanCardContext); + const { schema } = useDesignable(); + const [visible] = useContext(VisibleContext); + + const resource = useResourceRequest({ + resourceName: collection?.name || props.collectionName, + resourceKey: ctx?.record?.id, + }); + const service = useRequest( + (params?: any) => { + console.log('useSingleResource', params); + return resource.get({ ...params, appends: fieldFields(schema) }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + // refreshDeps: [ctx?.record], + // defaultParams: [ + // { + // defaultAppends: fieldFields(schema), + // }, + // ], + manual: true, + // manual, + }, + ); + useEffect(() => { + if (visible) { + service.run(); + } + }, [visible]); + return { resource, service, initialValues: service.data, ...service }; +}; + +Kanban.Card = observer((props) => { + const [visible, setVisible] = useState(false); + const { index, schemas } = useContext(KanbanCardContext); + const { DesignableBar } = useDesignable(); + const { children, ...others } = props; + return ( + + { + setVisible(true); + }} + hoverable + bordered={false} + {...others} + > + {children} + + + + + ); +}); + +Kanban.Card.View = Action.Drawer; +Kanban.Card.AddNew = Action; +Kanban.DesignableBar = DesignableBar; +Kanban.Card.DesignableBar = CardDesignableBar; +Kanban.FieldDesignableBar = FieldDesignableBar; diff --git a/packages/client/src/schemas/kanban/style.less b/packages/client/src/schemas/kanban/style.less new file mode 100644 index 0000000000000000000000000000000000000000..f00e3504bda38da468eb9664d55f7b2faac8bab6 --- /dev/null +++ b/packages/client/src/schemas/kanban/style.less @@ -0,0 +1,142 @@ +.nb-kanban-board { + display: flex; + margin: 0; + overflow: auto; +} +.nb-kanban-container { + display: flex; + min-height: 60vh; +} + +.nb-kanban-column { + position: relative; + width: 300px; + background: #f9f9f9; + margin-right: 12px; + padding: 12px 0; + .nb-kanban-list { + height: 60vh; + overflow-x: hidden; + overflow-y: auto; + padding: 0 12px; + margin-bottom: 12px; + } +} + +.nb-kanban-item { + margin-bottom: 12px; + &.isDragging { + opacity: 0.2; + } + + .ant-formily-item-control-content-component { + min-height: 0 !important; + } + .ant-space { + display: flex !important; + } + + .ant-formily-item-label { + min-height: 0 !important; + } + + .ant-description-input { + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.nb-kanban-drag-overlay { + .isDragging { + opacity: 1 !important; + box-shadow: 0 1px 2px -2px rgb(0 0 0 / 16%), 0 3px 6px 0 rgb(0 0 0 / 12%), + 0 5px 12px 4px rgb(0 0 0 / 9%); + } + .designable-bar { + display: none !important; + } +} + +.nb-kanban-item { + position: relative; + // padding: 0; + + .nb-block-item { + &:last-child { + .ant-formily-item { + margin-bottom: 0 !important; + } + } + } + .nb-grid-block, + .ant-formily-item { + margin-bottom: 12px !important; + } + + .ant-formily-layout { + &:hover { + > .designable-bar { + display: block; + } + } + > .designable-bar { + pointer-events: none; + display: none; + position: absolute; + top: -1px; + right: -1px; + left: -1px; + bottom: -1px; + border-radius: 2px; + background: none !important; + border: 2px solid rgba(241, 139, 98, 0.3) !important; + &.active { + display: block; + } + .designable-bar-actions { + pointer-events: all; + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + font-size: 10px; + } + } + } + } +} + +.nb-kanban-column-header { + margin-bottom: 12px; + line-height: 32px; + padding: 0 12px; +} + +.nb-kanban-item { + .ant-formily-item { + align-items: center; + } + .nb-upload { + .ant-upload-list-item-actions { + display: none; + } + .ant-upload-list-picture-card-container { + margin: 0 3px 3px 0; + height: 32px; + width: 32px; + } + .ant-upload-list-picture-card .ant-upload-list-item-name { + display: none; + } + .ant-upload-list-picture .ant-upload-list-item, + .ant-upload-list-picture-card .ant-upload-list-item { + padding: 1px; + } + } +} diff --git a/packages/client/src/schemas/markdown/index.md b/packages/client/src/schemas/markdown/index.md new file mode 100644 index 0000000000000000000000000000000000000000..dbe10f8af54c4db816422bd83aeac0b714280499 --- /dev/null +++ b/packages/client/src/schemas/markdown/index.md @@ -0,0 +1,128 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Markdown 编辑器 + +## Node Tree + +
+
+
+ +## Designable Bar + +- Markdown.DesignableBar + +## Examples + +### Markdown 编辑器 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + name: 'name1', + 'x-decorator': 'FormItem', + 'x-component': 'Markdown', + 'x-reactions': { + target: '*(read1,read2)', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read1: { + interface: 'string', + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Markdown', + }, + read2: { + interface: 'string', + type: 'string', + title: `阅读模式(超出隐藏)`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Markdown', + 'x-component-props': { + ellipsis: true, + }, + }, + }, +}; + +export default () => { + return ( + + ); +}; +``` + +### Markdown.DesignableBar + + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema1 = { + type: 'object', + properties: { + markdown1: { + type: 'string', + title: `简易Markdown`, + default: '这是一段示例文案', + 'x-read-pretty': true, + 'x-decorator': 'CardItem', + 'x-component': 'Markdown', + 'x-designable-bar': 'Markdown.DesignableBar', + 'x-component-props': { + savedInSchema: true, + // ellipsis: true, + }, + }, + }, +}; + +const schema2 = { + type: 'object', + properties: { + markdown1: { + type: 'string', + title: `简易Markdown`, + default: '这是一段示例文案', + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Markdown', + 'x-designable-bar': 'Markdown.DesignableBar', + 'x-component-props': { + }, + }, + }, +}; + +export default () => { + return ( +
+

区块项

+ +

表单项

+ +
+ ); +}; +``` \ No newline at end of file diff --git a/packages/client/src/schemas/markdown/index.tsx b/packages/client/src/schemas/markdown/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..96592901520baa1b11020e06cde5ca8555608348 --- /dev/null +++ b/packages/client/src/schemas/markdown/index.tsx @@ -0,0 +1,183 @@ +import React from 'react'; +import { + connect, + mapProps, + observer, + useField, + useFieldSchema, + mapReadPretty, +} from '@formily/react'; +import { Button, Dropdown, Input as AntdInput, Menu, Modal, Space } from 'antd'; +import { InputProps, TextAreaProps } from 'antd/lib/input'; +import { Display } from '../display'; +import { LoadingOutlined, MenuOutlined, DragOutlined } from '@ant-design/icons'; +import micromark from 'micromark'; +import { useDesignable } from '../../components/schema-renderer'; +import { useContext, useState } from 'react'; +import AddNew from '../add-new'; +import cls from 'classnames'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { uid } from '@formily/shared'; +import { removeSchema, updateSchema } from '..'; +import { isGridRowOrCol } from '../grid'; +import './style.less'; +import { DragHandle } from '../../components/Sortable'; + +export const Markdown: any = connect( + AntdInput.TextArea, + mapProps((props: any, field) => { + return { + ...props, + suffix: ( + + {field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffix + )} + + ), + }; + }), + mapReadPretty((props) => { + let text = props.value; + let value = ( +
+ ); + return ; + }), +); + +function MarkdownTextArea(props: any) { + const [value, setValue] = useState(props.defaultValue); + return ( +
+ { + setValue(e.target.value); + }} + /> + + + + +
+ ); +} + +Markdown.Void = observer((props: any) => { + const { schema } = useDesignable(); + const field = useField(); + const text = schema['default']; + let value = ( +
+ ); + return field?.pattern !== 'readPretty' ? ( + { + field.readPretty = true; + }} + onSubmit={async (value) => { + field.readPretty = true; + schema['default'] = value; + await updateSchema({ + key: schema['key'], + default: value, + }); + }} + /> + ) : ( + + ); +}); + +Markdown.Void.DesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + if (!designable) { + return null; + } + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + // setVisible(visible); + // }} + overlay={ + + { + field.readPretty = false; + setVisible(false); + }} + > + 编辑内容 + + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + const last = removed.pop(); + console.log({ last }); + await removeSchema(last); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); + +export default Markdown; diff --git a/packages/client/src/schemas/markdown/style.less b/packages/client/src/schemas/markdown/style.less new file mode 100644 index 0000000000000000000000000000000000000000..9913de019b211d20a1c32d8b597969ccc1a00e53 --- /dev/null +++ b/packages/client/src/schemas/markdown/style.less @@ -0,0 +1,3 @@ +.nb-markdown > *:last-child { + margin-bottom: 0; +} diff --git a/packages/client/src/schemas/menu/defaultSchemas.ts b/packages/client/src/schemas/menu/defaultSchemas.ts new file mode 100644 index 0000000000000000000000000000000000000000..07c7329c9f1943001a708ec23fbe9b7e7d68fc8c --- /dev/null +++ b/packages/client/src/schemas/menu/defaultSchemas.ts @@ -0,0 +1,60 @@ +import { uid } from '@formily/shared'; +import { ISchema } from '..'; + +export function generateDefaultSchema(component) { + const defaultSchemas: { [key: string]: ISchema } = { + MixMenu: { + type: 'void', + 'x-component': 'Menu', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component-props': { + sideMenuRef: '{{ sideMenuRef }}', + mode: 'mix', + theme: 'dark', + // onSelect: '{{ onSelect }}', + }, + }, + 'Menu.Item': { + type: 'void', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + 'Menu.Link': { + type: 'void', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Link', + properties: { + [uid()]: { + type: 'void', + async: true, + 'x-component': 'Page', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.CardItem', + }, + }, + }, + }, + }, + }, + 'Menu.URL': { + type: 'void', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.URL', + }, + 'Menu.SubMenu': { + type: 'void', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + }, + 'Menu.Action': { + type: 'void', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Action', + }, + }; + return defaultSchemas[component]; +} diff --git a/packages/client/src/schemas/menu/demos/demo1.tsx b/packages/client/src/schemas/menu/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3ccfe77c63c48c2b03258b1cc11a1cec331b5400 --- /dev/null +++ b/packages/client/src/schemas/menu/demos/demo1.tsx @@ -0,0 +1,97 @@ +/** + * title: 横向菜单 + */ +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { uid } from '@formily/shared'; +import { ISchema } from '@formily/react'; + +const schema: ISchema = { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Menu', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component-props': { + mode: 'horizontal', + theme: 'dark', + }, + properties: { + [uid()]: { + type: 'void', + title: `菜单1`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `链接`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Link', + 'x-component-props': { + to: '/abc/def', + }, + }, + [uid()]: { + type: 'void', + title: `菜单2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: '菜单组3', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单5`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单8`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `子菜单9`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '菜单组4', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单6`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `子菜单7`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ; +}; diff --git a/packages/client/src/schemas/menu/demos/demo2.tsx b/packages/client/src/schemas/menu/demos/demo2.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9345ba90073e6ef441c6f18e5c831d904cf729f5 --- /dev/null +++ b/packages/client/src/schemas/menu/demos/demo2.tsx @@ -0,0 +1,90 @@ +/** + * title: 横向菜单 + */ +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; + +const schema = { + type: 'object', + properties: { + menu1: { + type: 'void', + 'x-component': 'Menu', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component-props': { + mode: 'inline', + // theme: 'dark', + }, + properties: { + item1: { + type: 'void', + title: `菜单1`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + item2: { + type: 'void', + title: `菜单2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + item3: { + type: 'void', + title: '菜单组3', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + item5: { + type: 'void', + title: `子菜单5`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + item8: { + type: 'void', + title: `子菜单8`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + item9: { + type: 'void', + title: `子菜单9`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + item4: { + type: 'void', + title: '菜单组4', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + item6: { + type: 'void', + title: `子菜单6`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + item7: { + type: 'void', + title: `子菜单7`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ( +
+ +
+ ); +}; diff --git a/packages/client/src/schemas/menu/demos/demo3.tsx b/packages/client/src/schemas/menu/demos/demo3.tsx new file mode 100644 index 0000000000000000000000000000000000000000..135f30bfd2c43e13f3320bd5fd5ddf23033cf677 --- /dev/null +++ b/packages/client/src/schemas/menu/demos/demo3.tsx @@ -0,0 +1,68 @@ +/** + * title: 横向菜单 + */ +import React from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { ISchema } from '@formily/react'; + +const schema: ISchema = { + type: 'object', + properties: { + menu1: { + type: 'void', + 'x-component': 'Menu', + 'x-component-props': { + mode: 'horizontal', + // theme: 'dark', + }, + properties: { + item1: { + type: 'void', + title: `菜单1`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal1: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + 'x-component': 'Input', + }, + }, + }, + }, + }, + item2: { + type: 'void', + title: `菜单2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Action', + properties: { + modal2: { + type: 'void', + title: '对话框标题', + 'x-component': 'Action.Modal', + properties: { + input: { + type: 'string', + 'x-component': 'Input', + }, + }, + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ( +
+ +
+ ); +}; diff --git a/packages/client/src/schemas/menu/demos/demo4.tsx b/packages/client/src/schemas/menu/demos/demo4.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b95399de965623d08c25fa091cc226dc3ef6869f --- /dev/null +++ b/packages/client/src/schemas/menu/demos/demo4.tsx @@ -0,0 +1,96 @@ +import React, { useRef } from 'react'; +import { SchemaRenderer } from '@nocobase/client'; +import { Layout } from 'antd'; +import { uid } from '@formily/shared'; + +const schema = { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Menu', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component-props': { + sideMenuRef: '{{ sideMenuRef }}', + mode: 'mix', + theme: 'dark', + }, + properties: { + [uid()]: { + type: 'void', + title: `菜单1`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `菜单2`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: '菜单组3', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单5`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单8`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `子菜单9`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '菜单组4', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.SubMenu', + properties: { + [uid()]: { + type: 'void', + title: `子菜单6`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + [uid()]: { + type: 'void', + title: `子菜单7`, + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component': 'Menu.Item', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + const sideMenuRef = useRef(); + return ( + + + + + + + + + ); +}; diff --git a/packages/client/src/schemas/menu/index.md b/packages/client/src/schemas/menu/index.md new file mode 100644 index 0000000000000000000000000000000000000000..8565113bd0aa2e0294789ec22ace6997e4ea726d --- /dev/null +++ b/packages/client/src/schemas/menu/index.md @@ -0,0 +1,62 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Menu - 菜单 + +需要 antd v4.16+ 支持,在此之前的 Menu.Item 不支持 Fragment 包裹。 + +## Node Tree + +
+
+  // 菜单分组
+  
+    
+  
+  // 子菜单
+  
+    
+  
+  // 菜单项
+  
+  // 分割线
+  
+
+  // 其他一些基于 Menu.Item 的延伸
+
+  // 外链
+  
+  // 内链
+  
+  // 操作,用法与 Action 相同
+  
+  // 新增菜单项
+  
+
+
+ +## Designable Bar + +- Menu.DesignableBar + +## Examples + +### 横向菜单 + + + +### 竖向菜单 + + + +### 混合菜单 + + + +### Menu.Action + + diff --git a/packages/client/src/schemas/menu/index.tsx b/packages/client/src/schemas/menu/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..25de656766b53e29d46b6a662fcff7e9087c085c --- /dev/null +++ b/packages/client/src/schemas/menu/index.tsx @@ -0,0 +1,1061 @@ +import React, { + Children, + createContext, + useContext, + useEffect, + useRef, + useState, + forwardRef, +} from 'react'; +import { + connect, + observer, + mapProps, + mapReadPretty, + useField, + useFieldSchema, + RecursionField, + Schema, + SchemaOptionsContext, + FormProvider, + useForm, +} from '@formily/react'; +import { + Menu as AntdMenu, + MenuProps, + MenuItemProps, + SubMenuProps, + DividerProps, + Dropdown, + Modal, + Button, + Space, +} from 'antd'; +import { uid } from '@formily/shared'; +import cls from 'classnames'; +import { + SchemaField, + SchemaRenderer, + useDesignable, +} from '../../components/schema-renderer'; +import { + MenuOutlined, + PlusOutlined, + GroupOutlined, + LinkOutlined, + DeleteOutlined, + EditOutlined, + ArrowUpOutlined, + ArrowDownOutlined, + ArrowRightOutlined, + DragOutlined, + LockOutlined, +} from '@ant-design/icons'; +import { IconPicker } from '../../components/icon-picker'; +import { useDefaultAction } from '..'; +import { useMount } from 'ahooks'; +import './style.less'; +import { findPropertyByPath, getSchemaPath, useSchemaPath } from '../../'; +import { generateDefaultSchema } from './defaultSchemas'; +import _, { cloneDeep, get, isNull } from 'lodash'; +import { FormDialog, FormItem, FormLayout, Input } from '@formily/antd'; +import deepmerge from 'deepmerge'; +import { onFieldChange } from '@formily/core'; +import { VisibleContext } from '../../context'; +import { + DragHandle, + SortableItem, + SortableItemContext, +} from '../../components/Sortable'; +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { createPortal } from 'react-dom'; +import { Resource } from '../../resource'; +import { useClient } from '../../constate'; + +export interface MenuContextProps { + schema?: Schema; + onRemove?: any; +} + +export const MenuModeContext = createContext(null); +export const MenuContext = createContext(null); + +const SideMenu = (props: any) => { + const { selectedKey, defaultSelectedKeys, onSelect, path } = props; + const { schema } = useDesignable(); + const [selectedKeys, setSelectedKeys] = useState(defaultSelectedKeys); + useEffect(() => { + setSelectedKeys(defaultSelectedKeys); + }, [defaultSelectedKeys]); + if (!selectedKey) { + return null; + } + const child = schema.properties && schema.properties[selectedKey]; + if (!child || child['x-component'] !== 'Menu.SubMenu') { + return null; + } + + return ( + + { + setSelectedKeys(openKeys); + }} + openKeys={selectedKeys} + selectedKeys={selectedKeys} + > + + + + + + + ); +}; + +export const MenuSelectedKeysContext = createContext([]); + +export const Menu: any = observer((props: any) => { + const { + mode, + onSelect, + sideMenuRef, + defaultSelectedKeys: keys, + getSelectedKeys, + onRemove, + ...others + } = props; + const defaultSelectedKeys = useContext(MenuSelectedKeysContext); + const { root, schema, insertAfter, remove } = useDesignable(); + const moveToAfter = (path1, path2) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter(data.toJSON(), path2); + }; + const fieldSchema = useFieldSchema(); + console.log('Menu.schema', schema, fieldSchema); + const [selectedKey, setSelectedKey] = useState( + defaultSelectedKeys[0] || null, + ); + const ref = useRef(); + const path = useSchemaPath(); + const child = schema.properties && schema.properties[selectedKey]; + const isSubMenu = child && child['x-component'] === 'Menu.SubMenu'; + const { updateSchema } = useClient(); + + useMount(() => { + if (mode !== 'mix') { + return; + } + const sideMenuElement = sideMenuRef && (sideMenuRef.current as HTMLElement); + if (!sideMenuElement) { + return; + } + if (sideMenuElement && ref.current) { + sideMenuElement.querySelector(':scope > div').appendChild(ref.current); + } + sideMenuElement.style.display = isSubMenu ? 'block' : 'none'; + }); + + useEffect(() => { + const sideMenuElement = sideMenuRef && (sideMenuRef.current as HTMLElement); + if (!sideMenuElement) { + return; + } + sideMenuElement.style.display = isSubMenu ? 'block' : 'none'; + }, [selectedKey]); + + const [dragOverlayContent, setDragOverlayContent] = useState(''); + // console.log('defaultSelectedKeys', defaultSelectedKeys, getSelectedKeys); + return ( + + { + console.log({ event }); + setDragOverlayContent(event.active.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + console.log({ event }); + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const data = moveToAfter(path1, path2); + await updateSchema(data); + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} + + { + if (mode === 'mix') { + setSelectedKey(info.key); + } + const selectedSchema = schema.properties[info.key]; + console.log({ selectedSchema }); + onSelect && onSelect({ ...info, schema: selectedSchema }); + }} + > + + + {/* */} + + + + {mode === 'mix' && ( +
+ { + const keyPath = [selectedKey, ...[...info.keyPath].reverse()]; + const selectedSchema = findPropertyByPath(schema, keyPath); + console.log('keyPath', keyPath, selectedSchema); + onSelect && + onSelect({ ...info, keyPath, schema: selectedSchema }); + }} + defaultSelectedKeys={defaultSelectedKeys || []} + selectedKey={selectedKey} + sideMenuRef={sideMenuRef} + /> +
+ )} +
+
+
+ ); +}); + +Menu.Divider = observer(AntdMenu.Divider); + +Menu.Item = observer((props: any) => { + const { icon } = props; + const { schema, DesignableBar } = useDesignable(); + return ( + + + {icon && ( + + + + )} + {schema.title} + + + + ); +}); + +Menu.Link = observer((props: any) => { + const { icon } = props; + const { schema, DesignableBar } = useDesignable(); + return ( + + + {icon && ( + + + + )} + {schema.title} + + + {/* {schema.title} */} + + + ); +}); + +Menu.URL = observer((props: any) => { + const { icon } = props; + const { schema, DesignableBar } = useDesignable(); + return ( + { + window.open(props.href); + }} + > + + {icon && ( + + + + )} + {schema.title} + + + + + ); +}); + +Menu.Action = observer((props: any) => { + const { icon, useAction = useDefaultAction, ...others } = props; + const { schema, DesignableBar } = useDesignable(); + const field = useField(); + const [visible, setVisible] = useState(false); + const { run } = useAction(); + return ( + + } + onClick={async () => { + await run(); + setVisible(true); + }} + > + + {schema.title} + + + + {props.children} + {/* */} + + ); +}); + +Menu.SubMenu = observer((props: any) => { + const { icon } = props; + const { schema, DesignableBar } = useDesignable(); + const mode = useContext(MenuModeContext); + return mode === 'mix' ? ( + + ) : ( + } + title={ + + {icon && ( + + + + )} + {schema.title} + + + // <> + // {schema.title} + // + } + eventKey={schema.name} + key={schema.name} + > + + + ); +}); + +Menu.AddNew = observer((props: any) => { + const { designable, appendChild } = useDesignable(props.path); + const { createSchema, removeSchema, updateSchema } = useClient(); + if (!designable) { + return null; + } + const schemas = { + 'Menu.Link': { + icon: , + title: '添加页面', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.SubMenu': { + icon: , + title: '添加分组', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.URL': { + icon: , + title: '添加链接', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + 'x-component-props.href': { + type: 'string', + title: '链接', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }; + + return ( + { + console.log({ info }); + const values = await FormDialog(schemas[info.key].title, () => { + return ( + + + + ); + }).open(); + const defaults = generateDefaultSchema(info.key); + const data = appendChild(deepmerge(defaults, values)); + await createSchema(data); + }} + > + }> + 分组 + + }> + 页面 + + }> + 链接 + + + } + > + {props.children} + + } + /> + ); +}); + +Menu.DesignableBar = (props) => { + const schemas = { + 'Menu.Action': { + icon: , + title: '页面', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.Item': { + icon: , + title: '页面', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.Link': { + icon: , + title: '页面', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.SubMenu': { + icon: , + title: '分组', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + }, + }, + }, + 'Menu.URL': { + icon: , + title: '链接', + schema: { + type: 'object', + properties: { + title: { + type: 'string', + title: '名称', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + 'x-component-props.icon': { + type: 'string', + title: '图标', + 'x-decorator': 'FormItem', + 'x-component': 'IconPicker', + }, + 'x-component-props.href': { + type: 'string', + title: '链接', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, + }, + }, + }; + + const field = useField(); + const [visible, setVisible] = useState(false); + const { + designable, + schema, + remove, + refresh, + insertAfter, + insertBefore, + appendChild, + } = useDesignable(); + const formConfig = schemas[schema['x-component']]; + const isSubMenu = schema['x-component'] === 'Menu.SubMenu'; + const ctx = useContext(MenuContext); + const mode = useContext(MenuModeContext); + const { createSchema, removeSchema, updateSchema } = useClient(); + + return ( +
+
{ + e.stopPropagation(); + e.preventDefault(); + }} + className={'designable-bar-actions'} + > + + + { + if (['update', 'move', 'delete'].includes(info.key)) { + return; + } + const methodLabels = { + insertBefore: '之前', + insertAfter: '之后', + appendChild: '里', + }; + const keys = info.key.split('.'); + const method = keys.shift(); + const type = keys.join('.'); + const config = schemas[type]; + if (!config) { + return; + } + const values = await FormDialog( + `在「${schema.title}」${methodLabels[method]}插入${config.title}`, + () => { + return ( + + + + ); + }, + ).open(); + const methods = { + insertAfter, + insertBefore, + appendChild, + }; + const defaults = generateDefaultSchema(type); + const data = methods[method](deepmerge(defaults, values)); + await createSchema(data); + }} + > + { + const initialValues = {}; + Object.keys(formConfig.schema.properties).forEach( + (name) => { + _.set(initialValues, name, get(schema, name)); + }, + ); + const values = await FormDialog(`编辑菜单项`, () => { + return ( + + + + ); + }).open({ + initialValues, + }); + if (values.title) { + schema.title = values.title; + } + const icon = + _.get(values, 'x-component-props.icon') || null; + schema['x-component-props'] = + schema['x-component-props'] || {}; + schema['x-component-props']['icon'] = icon; + field.componentProps['icon'] = icon; + refresh(); + await updateSchema(schema); + }} + > + 编辑菜单项 + + { + let menuSchema: Schema; + let parent = schema.parent; + while (parent) { + if (parent['x-component'] === 'Menu') { + menuSchema = parent; + break; + } + parent = parent.parent; + } + + console.log({ menuSchema }); + + const toTreeData = (s: Schema) => { + const items = []; + Object.keys(s.properties || {}).forEach((name) => { + const current = s.properties[name]; + if ( + !(current['x-component'] as string).startsWith( + 'Menu.', + ) + ) { + return; + } + // if (current.name === schema.name) { + // return; + // } + items.push({ + key: current['key'] || current.name, + label: current.title, + title: current.title, + value: getSchemaPath(current).join('.'), + children: toTreeData(current), + }); + }); + return items; + }; + + const dataSource = toTreeData(menuSchema); + + const values = await FormDialog( + `将「${schema.title}」移动到`, + () => { + return ( + + + + ); + }, + ).open({ + effects(form) { + onFieldChange('path', (field) => { + const target = findPropertyByPath( + schema.root, + // @ts-ignore + field.value, + ); + console.log({ field }); + field.query('method').take((f) => { + // @ts-ignore + // f.value = 'insertAfter'; + // @ts-ignore + f.dataSource = + target['x-component'] === 'Menu.SubMenu' + ? [ + { label: '之后', value: 'insertAfter' }, + { label: '之前', value: 'insertBefore' }, + { label: '组里', value: 'appendChild' }, + ] + : [ + { label: '之后', value: 'insertAfter' }, + { label: '之前', value: 'insertBefore' }, + ]; + }); + }); + }, + }); + const methods = { + insertAfter, + insertBefore, + appendChild, + }; + const data = schema.toJSON(); + remove(); + const source = methods[values.method](data, values.path); + await updateSchema(source); + }} + > + 移动到 + + + } + title={`向${mode == 'inline' ? '上' : '左'}插入`} + > + } + > + 分组 + + } + > + 页面 + + } + > + 链接 + + + } + title={`向${mode == 'inline' ? '下' : '右'}插入`} + > + } + > + 分组 + + } + > + 页面 + + } + > + 链接 + + + {isSubMenu && ( + } + title={'向里插入'} + > + } + > + 分组 + + } + > + 页面 + + } + > + 链接 + + + )} + {/* + } + onClick={async () => { + const loadRoles = async () => { + const resource = Resource.make('roles'); + const data = await resource.list(); + console.log('loadRoles', data); + return data?.data.map((item) => ({ + label: item.title, + value: item.name, + })); + }; + const resource = Resource.make({ + associatedName: 'ui_schemas', + associatedKey: schema['key'], + resourceName: 'roles', + }); + const uiSchemasRoles = await resource.list(); + console.log({ uiSchemasRoles }); + const values = await FormDialog(`设置权限`, () => { + return ( + + + + ); + }).open({ + initialValues: { + roles: uiSchemasRoles?.data?.map((role) => role.name), + }, + }); + await Resource.make({ + resourceName: 'ui_schemas', + resourceKey: schema['key'], + }).save(values); + }} + > + 设置权限 + */} + + { + Modal.confirm({ + title: `删除${formConfig.title}`, + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const target = remove(); + await removeSchema(target); + ctx.onRemove && ctx.onRemove(target); + }, + }); + }} + > + 删除 + + + } + > + + + +
+
+ ); +}; + +export default Menu; diff --git a/packages/client/src/schemas/menu/style.less b/packages/client/src/schemas/menu/style.less new file mode 100644 index 0000000000000000000000000000000000000000..6c56085ae822bb67ebff6a75edc66801369fc049 --- /dev/null +++ b/packages/client/src/schemas/menu/style.less @@ -0,0 +1,166 @@ +.ant-layout-header { + height: 46px; + line-height: 46px; + padding: 0; +} + +.ant-menu-horizontal { + width: 100%; + .ant-menu-item:active, + .ant-menu-submenu-title:active { + background-color: inherit !important; + } +} + +.ant-menu-item-active .designable-bar { + display: inline-block; +} + +.ant-menu-item-active:hover .designable-bar, +.ant-menu-item-active.ant-menu-item-selected .designable-bar { + display: inline-block; +} + +.ant-menu-submenu-active > .ant-menu-submenu-title .designable-bar, +.ant-menu-item-active .designable-bar { + display: inline-block; +} + +// .ant-menu-sub.ant-menu-inline .ant-menu-submenu-active > .ant-menu-submenu-title .designable-action, +// .ant-menu-sub.ant-menu-inline .ant-menu-item-active .designable-action { +// background-color: #fafafa; +// } + +// .ant-menu-light .ant-menu-item-selected .designable-action { +// background-color: #e6f7ff !important; +// } + +.ant-menu { + .designable-bar { + display: none; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + border: 2px solid #1890ff; + pointer-events: none; + &.active { + display: block; + } + .designable-bar-actions { + pointer-events: auto; + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + font-size: 12px; + z-index: 10; + .anticon { + font-size: 10px; + } + } + } +} + +.ant-menu-submenu-horizontal > .ant-menu-submenu-title { + .designable-bar { + position: absolute; + left: -20px; + right: -20px; + border: 2px solid #1890ff; + } +} + +.ant-menu-title-content { + .ant-btn { + background: none; + border: 0; + border-radius: 0; + color: inherit; + padding: 0 20px; + height: 100%; + margin: 0 -20px; + } +} + +.nb-menu-add-new { + .ant-menu-item-group-title { + line-height: 46px; + padding: 0; + cursor: pointer; + .nb-add-new-icon { + height: 46px; + line-height: 46px; + width: 46px; + } + } +} + +.nb-add-new-menu-item.menu-mode-horizontal { + height: 46px; + border-radius: 0px; + background: none; + border: 0; + &:hover { + background: #1890ff; + } + &:active { + background: #1890ff; + } +} + +.nb-add-new-menu-item.menu-mode-inline { + margin: 0 14px; +} + +.ant-menu-horizontal { + .ant-menu-submenu, + .ant-menu-item { + .droppable.isDragging::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 100%; + background-color: #f18b62; + opacity: 0.5; + } + .droppable:not(.isDragging).isOver::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 2px; + background-color: #f18b62; + } + } +} + +.ant-menu-inline { + .ant-menu-submenu, + .ant-menu-item { + .droppable.isDragging::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 100%; + background-color: #f18b62; + opacity: 0.3; + } + .droppable:not(.isDragging).isOver::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + height: 2px; + width: 100%; + background-color: #f18b62; + } + } +} diff --git a/packages/client/src/schemas/page/index.tsx b/packages/client/src/schemas/page/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..51170463c3c1930313c06431a2da23d0f829a6dd --- /dev/null +++ b/packages/client/src/schemas/page/index.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { PageHeader as AntdPageHeader } from 'antd'; +import { observer } from '@formily/react'; +import { usePageTitleContext } from '../../constate/PageTitle'; +import { Helmet } from 'react-helmet'; + +export const Page = observer((props) => { + const { children, ...others } = props; + const { documentTitle, pageTitle } = usePageTitleContext(); + return ( + <> + + {documentTitle} + + +
{children}
+ + ); +}); diff --git a/packages/client/src/schemas/password/PasswordStrength.tsx b/packages/client/src/schemas/password/PasswordStrength.tsx new file mode 100755 index 0000000000000000000000000000000000000000..343bae7baffdc00e6d0855f1c47a0563f44fa32d --- /dev/null +++ b/packages/client/src/schemas/password/PasswordStrength.tsx @@ -0,0 +1,164 @@ +import React, { Fragment } from 'react'; +import { isFn } from '@formily/shared'; + +type ReactRenderPropsChildren = + | React.ReactNode + | ((props: T) => React.ReactElement); + +interface IPasswordStrengthProps { + value?: React.ReactText; + children?: ReactRenderPropsChildren; +} + +const isNum = function (c) { + return c >= 48 && c <= 57; +}; +const isLower = function (c) { + return c >= 97 && c <= 122; +}; +const isUpper = function (c) { + return c >= 65 && c <= 90; +}; +const isSymbol = function (c) { + return !(isLower(c) || isUpper(c) || isNum(c)); +}; +const isLetter = function (c) { + return isLower(c) || isUpper(c); +}; + +const getStrength = (val) => { + if (!val) return 0; + let num = 0; + let lower = 0; + let upper = 0; + let symbol = 0; + let MNS = 0; + let rep = 0; + let repC = 0; + let consecutive = 0; + let sequential = 0; + const len = () => num + lower + upper + symbol; + const callme = () => { + let re = num > 0 ? 1 : 0; + re += lower > 0 ? 1 : 0; + re += upper > 0 ? 1 : 0; + re += symbol > 0 ? 1 : 0; + if (re > 2 && len() >= 8) { + return re + 1; + } else { + return 0; + } + }; + for (let i = 0; i < val.length; i++) { + const c = val.charCodeAt(i); + if (isNum(c)) { + num++; + if (i !== 0 && i !== val.length - 1) { + MNS++; + } + if (i > 0 && isNum(val.charCodeAt(i - 1))) { + consecutive++; + } + } else if (isLower(c)) { + lower++; + if (i > 0 && isLower(val.charCodeAt(i - 1))) { + consecutive++; + } + } else if (isUpper(c)) { + upper++; + if (i > 0 && isUpper(val.charCodeAt(i - 1))) { + consecutive++; + } + } else { + symbol++; + if (i !== 0 && i !== val.length - 1) { + MNS++; + } + } + let exists = false; + for (let j = 0; j < val.length; j++) { + if (val[i] === val[j] && i !== j) { + exists = true; + repC += Math.abs(val.length / (j - i)); + } + } + if (exists) { + rep++; + const unique = val.length - rep; + repC = unique ? Math.ceil(repC / unique) : Math.ceil(repC); + } + if (i > 1) { + const last1 = val.charCodeAt(i - 1); + const last2 = val.charCodeAt(i - 2); + if (isLetter(c)) { + if (isLetter(last1) && isLetter(last2)) { + const v = val.toLowerCase(); + const vi = v.charCodeAt(i); + const vi1 = v.charCodeAt(i - 1); + const vi2 = v.charCodeAt(i - 2); + if (vi - vi1 === vi1 - vi2 && Math.abs(vi - vi1) === 1) { + sequential++; + } + } + } else if (isNum(c)) { + if (isNum(last1) && isNum(last2)) { + if (c - last1 === last1 - last2 && Math.abs(c - last1) === 1) { + sequential++; + } + } + } else { + if (isSymbol(last1) && isSymbol(last2)) { + if (c - last1 === last1 - last2 && Math.abs(c - last1) === 1) { + sequential++; + } + } + } + } + } + let sum = 0; + const length = len(); + sum += 4 * length; + if (lower > 0) { + sum += 2 * (length - lower); + } + if (upper > 0) { + sum += 2 * (length - upper); + } + if (num !== length) { + sum += 4 * num; + } + sum += 6 * symbol; + sum += 2 * MNS; + sum += 2 * callme(); + if (length === lower + upper) { + sum -= length; + } + if (length === num) { + sum -= num; + } + sum -= repC; + sum -= 2 * consecutive; + sum -= 3 * sequential; + sum = sum < 0 ? 0 : sum; + sum = sum > 100 ? 100 : sum; + + if (sum >= 80) { + return 100; + } else if (sum >= 60) { + return 80; + } else if (sum >= 40) { + return 60; + } else if (sum >= 20) { + return 40; + } else { + return 20; + } +}; + +export const PasswordStrength: React.FC = (props) => { + if (isFn(props.children)) { + return props.children(getStrength(String(props.value))); + } else { + return {props.children}; + } +}; diff --git a/packages/client/src/schemas/password/index.md b/packages/client/src/schemas/password/index.md new file mode 100644 index 0000000000000000000000000000000000000000..f002dd296a842d601eda8c98657cfc037c321285 --- /dev/null +++ b/packages/client/src/schemas/password/index.md @@ -0,0 +1,61 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Password - 密码 + +## Node Tree + +
+// 单选框
+
+
+ +## Designable Bar + +- Password.DesignableBar + +## Examples + +### 密码框 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` \ No newline at end of file diff --git a/packages/client/src/schemas/password/index.tsx b/packages/client/src/schemas/password/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..95773bc7c9682ef94f68e14b7574beaef9600b36 --- /dev/null +++ b/packages/client/src/schemas/password/index.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import { connect, mapReadPretty } from '@formily/react'; +import { Input } from 'antd'; +import { PasswordProps } from 'antd/lib/input'; +import { PasswordStrength } from './PasswordStrength'; +import { isValid } from '@formily/shared'; + +export interface IPasswordProps extends PasswordProps { + checkStrength: boolean; +} + +export const Password = connect( + (props: IPasswordProps) => { + const { value, className, checkStrength, ...others } = props; + const blockStyle: React.CSSProperties = { + position: 'absolute', + zIndex: 1, + height: 8, + top: 0, + background: '#fff', + width: 1, + transform: 'translate(-50%, 0)', + }; + return ( + + + {checkStrength && ( + + {(score) => { + return ( +
+
+
+
+
+
+
+ ); + }} + + )} + + ); + }, + mapReadPretty((props) => { + if (!isValid(props.value)) { + return
; + } + return
********
; + }), +); + +export default Password; diff --git a/packages/client/src/schemas/radio/index.md b/packages/client/src/schemas/radio/index.md new file mode 100644 index 0000000000000000000000000000000000000000..34c6973a023f0a596e132db07556a3e0127e97f6 --- /dev/null +++ b/packages/client/src/schemas/radio/index.md @@ -0,0 +1,81 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Radio - 单选框 + +## Node Tree + +
+// 单选框
+
+// 单选框分组
+
+
+ +## Designable Bar + +- Radio.DesignableBar + +## Examples + +### 单选框 + +```tsx +/** + * title: 单选框 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const options = [ + { + label: '选项1', + value: 1, + color: 'red', + }, + { + label: '选项2', + value: 2, + color: 'blue', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Radio.Group', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + enum: options, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Radio.Group', + }, + } +}; + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/radio/index.tsx b/packages/client/src/schemas/radio/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..54533d0eab6971c4506d98b26ec9c48446711700 --- /dev/null +++ b/packages/client/src/schemas/radio/index.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { + connect, + mapProps, + mapReadPretty, + SchemaOptionsContext, + useField, +} from '@formily/react'; +import { Radio as AntdRadio, Tag } from 'antd'; +import { RadioProps, RadioGroupProps } from 'antd/lib/radio'; +import { isValid } from '@formily/shared'; + +type ComposedRadio = React.FC & { + Group?: React.FC; + __ANT_RADIO?: boolean; +}; + +export const Radio: ComposedRadio = connect( + AntdRadio, + mapProps({ + value: 'checked', + onInput: 'onChange', + }), +); + +Radio.__ANT_RADIO = true; + +Radio.Group = connect( + AntdRadio.Group, + mapProps({ + dataSource: 'options', + }), + mapReadPretty((props) => { + if (!isValid(props.value)) { + return
; + } + const { options = [], value } = props; + const field = useField(); + const dataSource = field.dataSource || []; + console.log({ dataSource }); + return ( +
+ {dataSource + .filter((option) => option.value === value) + .map((option, key) => ( + + {option.label} + + ))} +
+ ); + }), +); + +export default Radio; diff --git a/packages/client/src/schemas/select/demos/demo1.tsx b/packages/client/src/schemas/select/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d54575fd3182cd958982ea6afd575a375a9a4f87 --- /dev/null +++ b/packages/client/src/schemas/select/demos/demo1.tsx @@ -0,0 +1,203 @@ +import React from 'react'; +import { ISchema, SchemaRenderer } from '../../'; +import { useSelect, useOptionTagValues } from '../'; +import { uid } from '@formily/shared'; +import { CollectionsProvider } from '@nocobase/client/src/constate'; + +console.log({ useSelect }); + +const dataSource = [ + { + id: 1, + title: '标题1', + }, + { + id: 2, + title: '标题2', + }, + { + id: 3, + title: '标题3', + }, +] as any[]; + +function useValues() { + return { + table: dataSource, + }; +} + +const schema: ISchema = { + type: 'object', + properties: { + input: { + interface: 'select', + type: 'string', + title: `编辑模式`, + enum: dataSource, + default: [ + { + id: 1, + title: '标题1', + }, + { + id: 2, + title: '标题2', + }, + ], + 'x-decorator': 'FormItem', + 'x-component': 'Select.Drawer', + 'x-component-props': { + placeholder: 'please enter', + mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + properties: { + options: { + type: 'void', + 'x-decorator': 'Form', + 'x-component': 'Select.Options.Drawer', + title: '关联数据', + properties: { + table: { + type: 'array', + 'x-designable-bar': 'Table.DesignableBar', + 'x-decorator': 'BlockItem', + 'x-decorator-props': { + draggable: false, + }, + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'id', + collectionName: 'users', + // dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + 'x-designable-bar': 'Table.ActionBar.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-designable-bar': 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + read: { + interface: 'select', + type: 'string', + title: `阅读模式`, + enum: dataSource, + default: [ + { + id: 1, + title: '标题1', + }, + { + id: 2, + title: '标题2', + }, + ], + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Drawer', + 'x-component-props': { + placeholder: 'please enter', + mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + properties: { + option: { + type: 'void', + 'x-component': 'Select.OptionTag', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + // paddingTop: 0, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + ); +}; diff --git a/packages/client/src/schemas/select/index.less b/packages/client/src/schemas/select/index.less new file mode 100644 index 0000000000000000000000000000000000000000..742382a192152d8cec7786fb646ab5a759814f67 --- /dev/null +++ b/packages/client/src/schemas/select/index.less @@ -0,0 +1,3 @@ +.option-tag ~ .option-tag::before { + content: " , "; +} diff --git a/packages/client/src/schemas/select/index.md b/packages/client/src/schemas/select/index.md new file mode 100644 index 0000000000000000000000000000000000000000..4c56b1a04a412287ba13683889f863b7d0548fd5 --- /dev/null +++ b/packages/client/src/schemas/select/index.md @@ -0,0 +1,424 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Select - 选择器 + +## Node Tree + +
+// 常规选择器
+
+ +
+ + + // 选中项详情 + +
+ // 添加其他节点 +
+
+ + + +## Designable Bar + +- Select.DesignableBar +- Select.Drawer.DesignableBar +- Select.Options.DesignableBar +- Select.OptionTag.DesignableBar + +## Examples + +### 单选 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const options = [ + { + label: '选项1', + value: 1, + color: 'red', + }, + { + label: '选项2', + value: 2, + color: 'blue', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'number', + title: `编辑模式`, + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'number', + title: `阅读模式`, + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-read-pretty': true, + }, + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 多选 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const options = [ + { + label: '选项1', + value: 1, + color: 'red', + }, + { + label: '选项2', + value: 2, + color: 'blue', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'string', + type: 'string', + title: `编辑模式`, + name: 'name1', + enum: options, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + mode: 'tags', + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'string', + type: 'string', + title: `阅读模式`, + enum: options, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + mode: 'tags', + }, + }, + } +} + +export default () => { + return ( + + ); +}; +``` + +### 分组 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const dataSource = [ + { + label: 'Manager', + children: [ + {value: 'jack', label: 'Jack'}, + ], + }, + { + label: 'Engineer', + children: [ + {value: 'lucy', label: 'Lucy'}, + ], + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + interface: 'select', + type: 'number', + title: `编辑模式`, + enum: dataSource, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + placeholder: 'please enter', + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + interface: 'select', + type: 'number', + title: `阅读模式`, + required: true, + enum: dataSource, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + placeholder: 'please enter', + }, + } + } +}; + +export default () => { + return ( + + ); +}; +``` + +## Select.Object + +选项值为 Object 类型 + +### 单选 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const dataSource = [ + { + id: 1, + title: '标题1', + }, + { + id: 2, + title: '标题2', + }, + { + id: 3, + title: '标题3', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'object', + title: `编辑模式`, + enum: dataSource, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-component-props': { + placeholder: 'please enter', + // mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'object', + title: `阅读模式`, + enum: dataSource, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-component-props': { + placeholder: 'please enter', + // mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + } + } +}; + +export default () => { + return ( + + ); +}; +``` + +### 多选 + +```tsx +import React from 'react'; +import { SchemaRenderer } from '../'; + +const dataSource = [ + { + id: 1, + title: '标题1', + }, + { + id: 2, + title: '标题2', + }, + { + id: 3, + title: '标题3', + }, +]; + +const schema = { + type: 'object', + properties: { + input: { + type: 'array', + title: `编辑模式`, + enum: dataSource, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-component-props': { + placeholder: 'please enter', + mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'array', + title: `阅读模式`, + enum: dataSource, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Select.Object', + 'x-component-props': { + placeholder: 'please enter', + mode: 'tags', + fieldNames: { + label: 'title', + value: 'id', + }, + }, + } + } +}; + +export default () => { + return ( + + ); +}; +``` + +## Select.Drawer + + + +## Schema API + +### Select + +type 支持 string、number、object 和 array,array 元素可以是 string、number 或 object。如: + +```ts +{ + properties: { + select: { + type: 'string', // 也可以是 number、object、array + 'x-component': 'Select', + } + } +} +``` + +可以配置 dataSource(enum)的 fieldNames,如: + +```ts +{ + properties: { + select: { + type: 'string', // 也可以是 number、object、array + 'x-component': 'Select', + 'x-component-props': { + fieldNames: { + label: 'label', // 标签文案 + value: 'value', + color: 'color', // 标签颜色 + children: 'children', // 选项分组时,选项字段对应的 key + }, + }, + }, + } +} +``` + +### Select.Drawer + +type 支持 object 和 array,Select.Drawer 的可选项是以抽屉方式展开,提供了 Select.Options 和 Select.OptionTag 用于配置可选项界面和选中项详情界面。 diff --git a/packages/client/src/schemas/select/index.tsx b/packages/client/src/schemas/select/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..067f3a48fd94bdf0f7b3faab2e65f71bf9423a50 --- /dev/null +++ b/packages/client/src/schemas/select/index.tsx @@ -0,0 +1,555 @@ +import React, { useEffect } from 'react'; +import { + connect, + mapReadPretty, + mapProps, + useField, + observer, + RecursionField, + useFieldSchema, + Schema, +} from '@formily/react'; +import { Drawer, Select as AntdSelect, Tag } from 'antd'; +import { PreviewText } from '@formily/antd'; +import { LoadingOutlined } from '@ant-design/icons'; +import { SelectProps } from 'antd/lib/select'; +import { isArr, isValid, toArr } from '@formily/shared'; +import { useState } from 'react'; +import { useDesignable } from '../'; +import { createContext } from 'react'; +import { useContext } from 'react'; +import { get, isEmpty } from 'lodash'; +import { Field, isArrayField, isField } from '@formily/core'; +import { Action } from '../action'; +import { BlockSchemaContext, VisibleContext } from '../../context'; +import { SchemaRenderer } from '../../components/schema-renderer'; +import { uid } from '@formily/shared'; +import { CollectionFieldContext } from '../table'; +import { + CollectionProvider, + useCollectionContext, + useResourceRequest, +} from '../../constate'; +import { Resource } from '../../resource'; +import { useRequest } from 'ahooks'; +import constate from 'constate'; + +import './index.less'; + +export const Select: any = connect( + (props) => { + const { options = [], ...others } = props; + return ( + + {options.map((option: any, key: any) => { + if (option.children) { + return ( + + {option.children.map((child: any, childKey: any) => ( + + {child.label} + + ))} + + ); + } else { + return ( + + {option.label} + + ); + } + })} + + ); + }, + mapProps( + { + dataSource: 'options', + loading: true, + }, + (props, field) => { + return { + ...props, + suffixIcon: + field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffixIcon + ), + }; + }, + ), + mapReadPretty((props) => { + // console.log('mapReadPretty', props.value) + // return
; + if (!isValid(props.value)) { + return
; + } + const field = useField(); + if (isArrayField(field) && field?.value?.length === 0) { + return
; + } + const dataSource = field.dataSource || []; + console.log('field.value', field.value, dataSource); + const values = toArr(field.value); + const findOptions = (options: any[]) => { + let current = []; + for (const option of options) { + if (values.includes(option.value)) { + current.push(option); + } + if (option.children) { + const children = findOptions(option.children); + current.push(...children); + } + } + return current; + }; + const options = findOptions(dataSource); + return ( +
+ {options.map((option, key) => ( + + {option.label} + + ))} +
+ ); + }), +); + +Select.Object = connect( + (props) => { + const field = useField(); + const { + value, + onChange, + fieldNames = { + label: 'label', + value: 'value', + }, + ...others + } = props; + const options = field?.['dataSource'] || props.options || []; + let optionValue = undefined; + if (isArr(value)) { + optionValue = value.map((val) => { + return { + label: val[fieldNames.label], + value: val[fieldNames.value], + }; + }); + } else if (value) { + optionValue = { + label: value[fieldNames.label], + value: value[fieldNames.value], + }; + } + return ( + { + if (!isValid(selectValue)) { + onChange(null); + return; + } + if (isArr(selectValue)) { + const selectValues = selectValue.map((s) => s.value); + const values = {}; + if (isArr(value)) { + value.forEach((option) => { + const val = option[fieldNames.value]; + if (selectValues.includes(val)) { + values[val] = option; + } + }); + } + options.forEach((option) => { + const val = option[fieldNames.value]; + if (selectValues.includes(val)) { + values[val] = option; + } + }); + console.log({ selectValue, values }); + onChange(Object.values(values)); + } else { + // 这里不能用 undefined,需要用 null + onChange( + options.find( + (option) => option[fieldNames.value] === selectValue.value, + ), + ); + } + }} + options={options.map((option) => { + return { + label: option[fieldNames.label], + value: option[fieldNames.value], + }; + })} + /> + ); + }, + mapProps( + { + dataSource: 'options', + loading: true, + }, + (props, field) => { + return { + ...props, + options: field?.['dataSource'], + suffixIcon: + field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffixIcon + ), + }; + }, + ), + mapReadPretty( + observer((props: any) => { + const { + value, + fieldNames = { label: 'label', color: 'color' }, + ...others + } = props; + if (!value) { + return null; + } + if (isEmpty(value)) { + return null; + } + const values = toArr(value); + return ( +
+ {values.map((val) => + fieldNames.color ? ( + {val[fieldNames.label]} + ) : ( + {val[fieldNames.label]} + ), + )} +
+ ); + }), + ), +); + +const OptionTagContext = createContext(null); + +const SelectedRowsContext = createContext(null); + +Select.useOkAction = () => { + const { props } = useContext(SelectContext); + const { selectedRows } = useContext(SelectedRowsContext); + return { + async run() { + props.onChange(selectedRows); + console.log('selectedRows', selectedRows); + }, + }; +}; + +Select.useRowSelection = () => { + const { props } = useContext(SelectContext); + return { + type: props.multiple ? 'checkbox' : 'radio', + }; +}; + +Select.useSelect = () => { + const { setSelectedRows } = useContext(SelectedRowsContext); + return (keys, rows) => { + setSelectedRows(rows); + console.log('Select.onSelect', keys, rows); + }; +}; + +export const useSelectedRowKeys = () => { + const { selectedRows } = useContext(SelectedRowsContext); + const [selectedRowKeys, setSelectedRowKeys] = useState( + selectedRows.map((row) => row.id), + ); + useEffect(() => { + setSelectedRowKeys(selectedRows.map((row) => row.id)); + }, [selectedRows]); + console.log('useSelectedRowKeys', selectedRows); + return { selectedRowKeys, setSelectedRowKeys }; +}; + +Select.useSelectedRowKeys = useSelectedRowKeys; + +const SelectContext = createContext(null); + +Select.Drawer = connect( + (props) => { + const field = useField(); + const { + onChange, + // fieldNames = { + // label: 'id', + // value: 'id', + // }, + ...others + } = props; + let value = props.value; + const [visible, setVisible] = useState(false); + const { schema } = useDesignable(); + const fieldNames = { + label: 'id', + value: 'id', + ...(get(schema['x-component-props'], 'fieldNames') || {}), + }; + const options = field?.['dataSource'] || props.options || []; + if (props.multiple) { + Object.assign(others, { + mode: 'multiple', + }); + } + let optionValue = undefined; + if (props.multiple) { + value = toArr(value); + } + if (isArr(value)) { + optionValue = value.map((val) => { + return { + label: val[fieldNames.label], + value: val[fieldNames.value], + }; + }); + } else if (value) { + optionValue = { + label: value[fieldNames.label], + value: value[fieldNames.value], + }; + } + const [selectedRows, setSelectedRows] = useState(toArr(field.value)); + console.log('useSelectedRowKeys.toArr', toArr(field.value)); + useEffect(() => { + setSelectedRows(toArr(field.value)); + }, [field.value]); + const onFieldChange = (selectValue) => { + if (!isValid(selectValue)) { + onChange(null); + return; + } + if (isArr(selectValue)) { + const values = {}; + if (isArr(value)) { + value.forEach((option) => { + const val = option[fieldNames.value]; + if (selectValue.includes(val)) { + values[val] = option; + } + }); + } + options.forEach((option) => { + const val = option[fieldNames.value]; + if (selectValue.includes(val)) { + values[val] = option; + } + }); + onChange(Object.values(values)); + } else { + // 这里不能用 undefined,需要用 null + onChange( + options.find((option) => option[fieldNames.value] === selectValue), + ); + } + // setSelectedRows(toArr(field.value)); + }; + // const selectedKeys = toArr(optionValue).map((item) => item.value); + console.log({ optionValue, value }); + const collectionField = useContext(CollectionFieldContext); + return ( + + + { + setVisible(true); + }} + onChange={(selectValue: any) => { + if (!selectValue) { + onChange(null); + return; + } + if (isArr(selectValue)) { + const selectValues = selectValue.map((s) => s.value); + onFieldChange(selectValues); + } else { + onFieldChange(selectValue.value); + } + }} + > + + + { + return s['x-component'] === 'Select.Options.Drawer'; + }} + /> + + + + + ); + }, + mapProps( + { + dataSource: 'options', + loading: true, + }, + (props, field) => { + return { + ...props, + options: field?.['dataSource'], + suffixIcon: + field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffixIcon + ), + }; + }, + ), + mapReadPretty( + observer((props: any) => { + const collectionField = useContext(CollectionFieldContext); + const field = useField(); + const { ...others } = props; + const value = field.value || field.initialValue; + const { schema } = useDesignable(); + const fieldNames = { + label: 'id', + value: 'id', + ...(get(schema['x-component-props'], 'fieldNames') || {}), + }; + console.log({ fieldNames, field, value }); + if (!value) { + return null; + } + const values = toArr(value); + const s = schema.reduceProperties((buf, current) => { + if (current['x-component'] === 'Select.OptionTag') { + return current; + } + return buf; + }, null); + return ( +
+ + + {values.map((data, index) => { + return ( + + {s ? ( + + ) : ( + data[fieldNames.label] + )} + + ); + })} + + +
+ ); + }), + ), +); + +Select.Drawer.useResource = ({ onSuccess }) => { + const { collection } = useCollectionContext(); + const ctx = useContext(OptionTagContext); + const resource = useResourceRequest({ + resourceName: collection?.name, + resourceKey: ctx.data.id, + }); + console.log('OptionTagContext', ctx.data.id); + const { schema } = useDesignable(); + const fieldFields = (schema: Schema) => { + const names = []; + schema.reduceProperties((buf, current) => { + if (current['x-component'] === 'Form.Field') { + const fieldName = current['x-component-props']?.['fieldName']; + if (fieldName) { + buf.push(fieldName); + } + } else { + const fieldNames = fieldFields(current); + buf.push(...fieldNames); + } + return buf; + }, names); + return names; + }; + const [visible] = useContext(VisibleContext); + const service = useRequest( + (params?: any) => { + console.log('Table.useResource', params); + return resource.get({ ...params, appends: fieldFields(schema) }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + manual: true, + }, + ); + useEffect(() => { + if (visible) { + service.run(); + } + }, [visible]); + return { resource, service, initialValues: service.data, ...service }; +}; + +Select.Options = observer((props) => { + return <>{props.children}; +}); + +Select.Options.Drawer = Action.Drawer; + +export function useSelect() { + const { onChange } = useContext(SelectContext); + return { + async run() { + onChange && onChange([]); + }, + }; +} + +export function useOptionTagValues() { + const { data } = useContext(OptionTagContext); + return data; +} + +Select.OptionTag = observer((props) => { + const [visible, setVisible] = useState(false); + const { data, fieldNames } = useContext(OptionTagContext); + return ( + + setVisible(true)}> + {data[fieldNames.label]} + + {props.children} + + ); +}); + +export default Select; diff --git a/packages/client/src/schemas/table/SimpleDesignableBar.tsx b/packages/client/src/schemas/table/SimpleDesignableBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d1db54bff0ec4c98867ae721d5d94b1a27940528 --- /dev/null +++ b/packages/client/src/schemas/table/SimpleDesignableBar.tsx @@ -0,0 +1,233 @@ +import React, { useContext, useMemo, useRef, useState } from 'react'; +import { createForm } from '@formily/core'; +import { + SchemaOptionsContext, + Schema, + useFieldSchema, + observer, + SchemaExpressionScopeContext, + FormProvider, + ISchema, + useField, + useForm, + RecursionField, +} from '@formily/react'; +import { + useSchemaPath, + SchemaField, + useDesignable, + removeSchema, + updateSchema, +} from '../'; +import get from 'lodash/get'; +import { Button, Dropdown, Menu, Modal, Select, Space } from 'antd'; +import { MenuOutlined, DragOutlined } from '@ant-design/icons'; +import cls from 'classnames'; +import { FormDialog, FormLayout } from '@formily/antd'; +import './style.less'; +import AddNew from '../add-new'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import { isGridRowOrCol } from '../grid'; +import constate from 'constate'; +import { useEffect } from 'react'; +import { uid } from '@formily/shared'; +import { getSchemaPath } from '../../components/schema-renderer'; +import { set } from 'lodash'; +import { DragHandle } from '../../components/Sortable'; + +export const SimpleDesignableBar = observer((props) => { + const field = useField(); + const { designable, schema, refresh, deepRemove } = useDesignable(); + const [visible, setVisible] = useState(false); + const { dragRef } = useContext(DraggableBlockContext); + if (!designable) { + return null; + } + const defaultPageSize = + field?.componentProps?.pagination?.defaultPageSize || 10; + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + + { + setVisible(visible); + }} + overlay={ + + { + const { defaultFilter } = await FormDialog( + '设置数据范围', + () => { + return ( + + + + ); + }, + ).open({ + initialValues: { + defaultFilter: + field?.componentProps?.defaultFilter || {}, + }, + }); + schema['x-component-props']['defaultFilter'] = + defaultFilter; + field.componentProps.defaultFilter = defaultFilter; + await updateSchema(schema); + setVisible(false); + }} + > + 设置数据范围 + + + 每页默认显示{' '} + {' '} + 条 + + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + setVisible(false); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}); diff --git a/packages/client/src/schemas/table/Sortable.tsx b/packages/client/src/schemas/table/Sortable.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4728a60d8b07414bcd748da20ca6b0e8029cdd72 --- /dev/null +++ b/packages/client/src/schemas/table/Sortable.tsx @@ -0,0 +1,278 @@ +import React, { forwardRef, useState } from 'react'; +import { + SortableContext, + useSortable, + horizontalListSortingStrategy, + verticalListSortingStrategy, + sortableKeyboardCoordinates, +} from '@dnd-kit/sortable'; +import { CSS } from '@dnd-kit/utilities'; +import { Table } from 'antd'; +import { createContext } from 'react'; +import { useContext } from 'react'; +import { range } from 'lodash'; +import parse from 'html-react-parser'; +import cls from 'classnames'; +import { MenuOutlined } from '@ant-design/icons'; + +import { + DndContext, + DragOverlay, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, + useDroppable, + useDraggable, +} from '@dnd-kit/core'; +import { createPortal } from 'react-dom'; +import { useRef } from 'react'; +import { SortableItem } from '../../components/Sortable'; +import { + findPropertyByPath, + getSchemaPath, + useDesignable, +} from '../../components/schema-renderer'; +import { updateSchema } from '..'; +import { Schema } from '@formily/react'; +import { isColumn, isColumnComponent } from '.'; + +export const RowDraggableContext = createContext({}); +export const ColDraggableContext = createContext(null); +export const CellContext = createContext(null); + +export function SortableColumn(props) { + const { className } = props; + const { isOver, setNodeRef: setDroppableNodeRef } = useDroppable({ + id: `droppable-${props['id']}`, + }); + + const { + isDragging, + attributes, + listeners, + setNodeRef: setDraggableNodeRef, + transform, + } = useDraggable({ + id: `draggable-${props['id']}`, + }); + + return ( +
+ + {props.children} + + {/* + Drag + */} +
+ ); +} + +export function SortableBodyRow(props: any) { + const { + className, + style: prevStyle, + ['data-row-key']: dataRowKey, + ...others + } = props; + const { + isDragging, + attributes, + listeners, + setNodeRef, + setDraggableNodeRef, + overIndex, + transform, + transition, + } = useSortable({ id: dataRowKey }); + + const style = { + ...prevStyle, + transform: CSS.Transform.toString(transform), + transition, + }; + + return ( + + + { + return `td${child.key}`; + })} + > + {React.Children.map(props.children, (child, index) => ( + + {child} + + ))} + + + + ); +} + +export function SortableHeaderRow(props) { + const { root, remove, insertAfter } = useDesignable(); + const moveToAfter = (path1, path2) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter(data.toJSON(), path2); + }; + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + + { + const previewRef = event.active.data?.current?.previewRef as { + current: HTMLElement; + }; + if (previewRef?.current) { + setDragOverlayContent(previewRef.current.textContent || ''); + } + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const data = moveToAfter(path1, path2); + await updateSchema(data); + }} + > + {createPortal( + + {dragOverlayContent} + , + document.body, + )} + {React.Children.map(props.children, (child, index) => ( + {child} + ))} + + + ); +} + +export function SortableHeaderCell(props) { + const id = useContext(CellContext); + if (['RC_TABLE_KEY', 'addnew', 'operation'].includes(id)) { + return ; + } + const { schema } = useDesignable(); + const columns: Schema[] = schema.reduceProperties((columns, current) => { + if (!isColumn(current)) { + return [...columns]; + } + if (current.name === id) { + return [...columns, current]; + } + return [...columns]; + }, []); + const column = columns.shift(); + if (!column) { + return ; + } + return ( + ((props, ref) => ( + + ))} + /> + ); +} + +export function SortableBodyCell(props) { + const id = useContext(CellContext); + const { + isDragging, + attributes, + listeners, + setNodeRef, + setDraggableNodeRef, + setDroppableNodeRef, + transform, + transition, + } = useSortable({ id: id }); + const style = { + ...props.style, + transform: CSS.Transform.toString(transform), + transition, + }; + return ( + +
+ + Drag + +
+ {props.children} + + ); +} + +export function SortableRowHandle(props) { + const { className, ...others } = props; + const { setDraggableNodeRef, attributes, listeners } = + useContext(RowDraggableContext); + return setDraggableNodeRef ? ( + + ) : null; +} diff --git a/packages/client/src/schemas/table/demos/demo3.tsx b/packages/client/src/schemas/table/demos/demo3.tsx new file mode 100644 index 0000000000000000000000000000000000000000..50a639eb4533aa0335e5f5c802ea889d40c31c63 --- /dev/null +++ b/packages/client/src/schemas/table/demos/demo3.tsx @@ -0,0 +1,231 @@ +import React from 'react'; +import { range } from 'lodash'; +import { ISchema } from '@formily/react'; +import { SchemaRenderer } from '../..'; +import { uid } from '@formily/shared'; +import { + CollectionsProvider, + DesignableSwitchProvider, +} from '@nocobase/client/src/constate'; + +const schema = { + name: 'table1', + type: 'array', + 'x-designable-bar': 'Table.DesignableBar', + 'x-decorator': 'CardItem', + 'x-component': 'Table', + default: [], + 'x-component-props': { + collectionName: 'users', + rowKey: 'id', + dragSort: true, + showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + 'x-designable-bar': 'Table.ActionBar.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-designable-bar': 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + [uid()]: { + type: 'void', + name: 'action1', + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-component': 'Action', + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-component-props': { + icon: 'DeleteOutlined', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + [uid()]: { + type: 'void', + name: 'action1', + title: '添加', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'Action', + 'x-component-props': { + icon: 'PlusOutlined', + type: 'primary', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '操作', + 'x-component': 'Table.Column', + 'x-component-props': {}, + 'x-designable-bar': 'Table.Operation.DesignableBar', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Group', + 'x-component-props': { + type: 'link', + }, + properties: { + [uid()]: { + type: 'void', + name: 'action1', + title: '查看', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + // paddingTop: 0, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + [uid()]: { + type: 'void', + title: '编辑', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'update', + properties: { + [uid()]: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Table.useResource }}', + useValues: '{{ Table.useTableRowRecord }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + // [uid()]: { + // type: 'void', + // title: '删除', + // 'x-component': 'Action', + // 'x-designable-bar': 'Table.Action.DesignableBar', + // 'x-action-type': 'destroy', + // 'x-component-props': { + // type: 'link', + // useAction: '{{ Table.useTableDestroyAction }}', + // }, + // }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ( +
+ + + + + +
+ ); +}; diff --git a/packages/client/src/schemas/table/index.md b/packages/client/src/schemas/table/index.md new file mode 100644 index 0000000000000000000000000000000000000000..ad7aa517c1a65d5b7b451cd2ca747b132c1f4c3e --- /dev/null +++ b/packages/client/src/schemas/table/index.md @@ -0,0 +1,70 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Table - 表格 + +## Node Tree + +
+
+  // 顶部操作栏
+  
+    
+      
+        
+ // 此处省略 Filter 节点细节 + + + +
+
+ +
+ // 底部操作栏 + + + + // 表格列 + + + + + + + + + + +
+
+ +## Designable Bar + +- Table.DesignableBar +- Table.Column.DesignableBar + +## Examples + + + +## API + +表格的几个重要参数 + +- collection 当前表格的数据表配置信息(主要是字段) +- resource 当前资源,用于处理 create、update、list、destroy +- service 当前表格的 resource.list 实例 +- field 当前表格的 ArrayField 对象 +- schema 当前表格的 json schema +- props 当前表格的参数 diff --git a/packages/client/src/schemas/table/index.tsx b/packages/client/src/schemas/table/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..323c1147e7b45345bd83ff6834ab90bcc9337447 --- /dev/null +++ b/packages/client/src/schemas/table/index.tsx @@ -0,0 +1,2617 @@ +import { + FormProvider, + observer, + RecursionField, + Schema, + useField, + useForm, +} from '@formily/react'; +import { Modal, Pagination, Popover, Table as AntdTable } from 'antd'; +import { cloneDeep, cloneDeepWith, findIndex, forIn, range, set } from 'lodash'; +import React, { Fragment, useEffect, useState } from 'react'; +import { useContext } from 'react'; +import { createContext } from 'react'; +import { useDesignable, createCollectionField, ISchema } from '..'; +import { uid, merge } from '@formily/shared'; +import useRequest from '@ahooksjs/use-request'; +import { BaseResult } from '@ahooksjs/use-request/lib/types'; +import cls from 'classnames'; +import { MenuOutlined, DragOutlined, FilterOutlined } from '@ant-design/icons'; +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { + SortableContext, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { Select, Dropdown, Menu, Switch, Button, Space } from 'antd'; +import { PlusOutlined, SettingOutlined } from '@ant-design/icons'; +import './style.less'; +import { + findPropertyByPath, + getSchemaPath, + SchemaField, + SchemaRenderer, +} from '../../components/schema-renderer'; +import { + interfaces, + isAssociation, + options, +} from '../database-field/interfaces'; +import { DraggableBlockContext } from '../../components/drag-and-drop'; +import AddNew from '../add-new'; +import { isGridRowOrCol } from '../grid'; +import { ListOptions, Resource } from '../../resource'; +import { + CollectionProvider, + DisplayedMapProvider, + useCollection, + useCollectionContext, + useCollectionsContext, + useDisplayedMapContext, + useClient, + useResourceRequest, +} from '../../constate'; +import { useResource as useGeneralResource } from '../../hooks/useResource'; +import SwitchMenuItem from '../../components/SwitchMenuItem'; +import { useMemo } from 'react'; +import { createForm } from '@formily/core'; +import { + ColDraggableContext, + SortableBodyCell, + SortableBodyRow, + SortableColumn, + SortableHeaderCell, + SortableHeaderRow, + SortableRowHandle, +} from './Sortable'; +import { DragHandle, Droppable, SortableItem } from '../../components/Sortable'; +import { isValid } from '@formily/shared'; +import { FormButtonGroup, FormDialog, FormLayout, Submit } from '@formily/antd'; +import flatten from 'flat'; +import IconPicker from '../../components/icon-picker'; +import { DescriptionsContext } from '../form'; +import { VisibleContext } from '../../context'; +import { SimpleDesignableBar } from './SimpleDesignableBar'; + +export interface ITableContext { + props: any; + field: Formily.Core.Models.ArrayField; + schema: Schema; + service: BaseResult; + selectedRowKeys?: any; + setSelectedRowKeys?: any; + pagination?: any; + setPagination?: any; + refresh?: any; + resource?: Resource; +} + +export interface ITableRowContext { + index: number; + record: any; +} + +const TableContext = createContext({} as any); +export const TableRowContext = createContext(null); +export const CollectionFieldContext = createContext(null); + +export const useTable = () => { + return useContext(TableContext); +}; + +const useTableRow = () => { + return useContext(TableRowContext); +}; + +function useTableFilterAction() { + const { + field, + service, + refresh, + props: { refreshRequestOnChange }, + } = useTable(); + const form = useForm(); + return { + async run() { + console.log('useTableFilterAction', form.values); + if (refreshRequestOnChange) { + return service.run({ + ...service.params[0], + // filter, + }); + } + }, + }; +} + +function useTableCreateAction() { + const { + field, + service, + resource, + refresh, + props: { refreshRequestOnChange }, + } = useTable(); + const form = useForm(); + return { + async run() { + console.log('refreshRequestOnChange', refreshRequestOnChange); + if (refreshRequestOnChange) { + await resource.create(form.values); + await form.reset(); + return service.refresh(); + } + field.unshift(form.values); + }, + }; +} + +const useTableUpdateAction = () => { + const { + resource, + field, + service, + refresh, + props: { refreshRequestOnChange, rowKey }, + } = useTable(); + const ctx = useContext(TableRowContext); + const form = useForm(); + const { service: formService } = useContext(DescriptionsContext); + + return { + async run() { + if (refreshRequestOnChange) { + await resource.save(form.values, { + resourceKey: ctx.record[rowKey], + }); + if (formService) { + await formService.refresh(); + } + await service.refresh(); + return; + } + field.value[ctx.index] = form.values; + // refresh(); + }, + }; +}; + +const useTableDestroyAction = () => { + const { + resource, + field, + service, + selectedRowKeys, + setSelectedRowKeys, + refresh, + props: { refreshRequestOnChange, rowKey }, + } = useTable(); + const ctx = useContext(TableRowContext); + const [, setVisible] = useContext(VisibleContext); + return { + async run() { + if (refreshRequestOnChange) { + const rowKeys = selectedRowKeys || []; + if (ctx) { + rowKeys.push(ctx.record[rowKey]); + } + await resource.destroy({ + [`${rowKey}.in`]: rowKeys, + }); + setSelectedRowKeys([]); + setVisible && setVisible(false); + return service.refresh(); + } + if (ctx) { + console.log('ctx.index', ctx.index); + field.remove(ctx.index); + refresh(); + } + const rowKeys = [...selectedRowKeys]; + while (rowKeys.length) { + const key = rowKeys.shift(); + const index = findIndex(field.value, (item) => item[rowKey] === key); + field.remove(index); + } + setSelectedRowKeys([]); + refresh(); + return; + }, + }; +}; + +const useTableExportAction = () => { + const { + resource, + field, + service, + selectedRowKeys, + setSelectedRowKeys, + refresh, + schema, + props: { refreshRequestOnChange, rowKey }, + } = useTable(); + const ctx = useContext(TableRowContext); + + const actionField = useField(); + const fieldNames = actionField.componentProps.fieldNames || []; + const { getField } = useCollectionContext(); + + const columns = fieldNames + .map((name) => { + const f = getField(name); + return { + title: f?.uiSchema.title, + name, + sort: f?.sort, + }; + }) + .sort((a, b) => a.sort - b.sort); + + return { + async run() { + const rowKeys = selectedRowKeys || []; + const { filter = {}, ...others } = service.params[0]; + if (rowKeys.length) { + filter[`${rowKey}.in`] = rowKeys; + } + await resource.export({ + ...others, + columns, + perPage: -1, + page: 1, + filter, + }); + }, + }; +}; + +const useTableRowRecord = () => { + const ctx = useContext(TableRowContext); + return ctx.record; +}; + +const useTableIndex = () => { + const { pagination, props } = useTable(); + const ctx = useContext(TableRowContext); + const { pageSize, page = 1 } = pagination; + console.log({ pageSize, page }, ctx.index); + return ctx.index + (page - 1) * pageSize; + if (pagination && !props.clientSidePagination) { + const { pageSize, page = 1 } = pagination; + return ctx.index + (page - 1) * pageSize; + } + return ctx.index; +}; + +const useTableActionBars = () => { + const { + field, + schema, + props: { rowKey }, + } = useTable(); + + const bars = schema.reduceProperties((bars, current) => { + if (current['x-component'] === 'Table.ActionBar') { + return [...bars, current]; + } + return [...bars]; + }, []); + + return bars; +}; + +export function isOperationColumn(schema: Schema) { + return ['Table.Operation'].includes(schema['x-component']); +} + +export function isColumn(schema: Schema) { + return ['Table.Column'].includes(schema['x-component']); +} + +export function isColumnComponent(component: string) { + return ['Table.Operation', 'Table.Column'].includes(component); +} + +const useCollectionFields = (schema: Schema) => { + const columns = schema.reduceProperties((columns, current) => { + if (isColumn(current)) { + if (current['x-hidden']) { + return columns; + } + if (current['x-display'] && current['x-display'] !== 'visible') { + return columns; + } + return [...columns, current]; + } + return [...columns]; + }, []); + + return columns + .map((column) => { + const columnProps = column['x-component-props'] || {}; + return columnProps.fieldName; + }) + .filter(Boolean); +}; + +const useTableColumns = () => { + const { + field, + schema, + props: { rowKey }, + } = useTable(); + const { designable } = useDesignable(); + + const { getField } = useCollectionContext(); + + const columnSchemas = schema.reduceProperties((columns, current) => { + if (isColumn(current)) { + if (current['x-hidden']) { + return columns; + } + if (current['x-display'] && current['x-display'] !== 'visible') { + return columns; + } + return [...columns, current]; + } + return [...columns]; + }, []); + + const columns: any[] = [].concat( + columnSchemas.map((column: Schema) => { + const columnProps = column['x-component-props'] || {}; + const collectionField = getField(columnProps.fieldName); + return { + title: ( + + + + ), + dataIndex: column.name, + ...columnProps, + render: (_: any, record: any) => { + const index = findIndex( + field.value, + (item) => item[rowKey] === record[rowKey], + ); + return ( + + + + + + ); + }, + }; + }), + ); + + if ( + designable && + schema['x-designable-bar'] && + schema['x-designable-bar'] !== 'Table.SimpleDesignableBar' + ) { + columns.push({ + title: , + dataIndex: 'addnew', + }); + } + return columns; +}; + +function AddColumn() { + const [visible, setVisible] = useState(false); + const { appendChild, remove } = useDesignable(); + const { loadCollections } = useCollectionsContext(); + const { collection, fields, refresh } = useCollectionContext(); + const displayed = useDisplayedMapContext(); + const { service } = useTable(); + const { createSchema, removeSchema, updateSchema } = useClient(); + + return ( + + + {fields.map((field) => ( + { + if (checked) { + console.log( + 'SwitchMenuItem.field.name', + field.dataType, + service.params[0], + ); + const columnSchema: ISchema = { + type: 'void', + 'x-component': 'Table.Column', + 'x-component-props': { + fieldName: field.name, + }, + 'x-designable-bar': 'Table.Column.DesignableBar', + }; + if (field.interface === 'linkTo') { + columnSchema.properties = { + options: { + type: 'void', + 'x-decorator': 'Form', + 'x-component': 'Select.Options.Drawer', + 'x-component-props': { + useOkAction: '{{ Select.useOkAction }}', + }, + title: '关联数据', + properties: { + table: { + type: 'array', + 'x-designable-bar': 'Table.DesignableBar', + 'x-decorator': 'BlockItem', + 'x-decorator-props': { + draggable: false, + }, + 'x-component': 'Table', + default: [], + 'x-component-props': { + rowKey: 'id', + useRowSelection: '{{ Select.useRowSelection }}', + useSelectedRowKeys: + '{{ Select.useSelectedRowKeys }}', + onSelect: '{{ Select.useSelect() }}', + collectionName: field.target, + // dragSort: true, + // showIndex: true, + refreshRequestOnChange: true, + pagination: { + pageSize: 10, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Table.ActionBar', + 'x-designable-bar': + 'Table.ActionBar.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '筛选', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-align': 'left', + 'x-component': 'Table.Filter', + 'x-designable-bar': + 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + }, + }, + }, + }, + }, + }, + option: { + type: 'void', + 'x-component': 'Select.OptionTag', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': + 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }; + } + const data = appendChild(columnSchema); + await createSchema(data); + if (isAssociation(field)) { + const defaultAppends = + service.params[0]?.defaultAppends || []; + defaultAppends.push(field.name); + await service.run({ + ...service.params[0], + defaultAppends, + }); + } + } else { + const s: any = displayed.get(field.name); + const p = getSchemaPath(s); + const removed = remove(p); + await removeSchema(removed); + displayed.remove(field.name); + if (isAssociation(field)) { + const defaultAppends = + service.params[0]?.defaultAppends || []; + const index = defaultAppends.indexOf(field.name); + if (index > -1) { + defaultAppends.splice(index, 1); + } + await service.run({ + ...service.params[0], + defaultAppends, + }); + } + } + // service.refresh(); + }} + /> + ))} + + + + {options.map((option) => ( + + {option.children.map((item) => ( + { + setVisible(false); + const values = await FormDialog(`添加字段`, () => { + return ( + + + + ); + }).open({ + initialValues: { + interface: item.name, + ...item.default, + key: uid(), + name: `f_${uid()}`, + }, + }); + await createCollectionField(collection?.name, values); + const data = appendChild({ + type: 'void', + 'x-component': 'Table.Column', + 'x-component-props': { + fieldName: values.name, + }, + 'x-designable-bar': 'Table.Column.DesignableBar', + }); + await createSchema(data); + await refresh(); + }} + > + {item.title} + + ))} + + ))} + + + } + > + + + ); +} + +const useDefaultRowSelection = () => { + return { + type: 'checkbox', + }; +}; + +const useDataSource = () => { + const { + pagination, + field, + props: { clientSidePagination, dataRequest }, + } = useTable(); + let dataSource = field.value; + // if (pagination && (clientSidePagination || !dataRequest)) { + // const { page = 1, pageSize } = pagination; + // const startIndex = (page - 1) * pageSize; + // const endIndex = startIndex + pageSize - 1; + // dataSource = field.value?.slice(startIndex, endIndex + 1); + // } + return dataSource; +}; + +const TableMain = () => { + const { + resource, + selectedRowKeys, + setSelectedRowKeys, + service, + field, + props: { + rowKey, + dragSort, + showIndex, + onSelect, + useRowSelection = useDefaultRowSelection, + }, + refresh, + } = useTable(); + const columns = useTableColumns(); + const dataSource = useDataSource(); + const actionBars = useTableActionBars(); + const [html, setHtml] = useState(''); + const { type } = useRowSelection(); + return ( +
+ { + const fromId = event.active?.id as any; + const toId = event.over?.id as any; + if (isValid(fromId) && isValid(toId)) { + const fromIndex = findIndex( + field.value, + (item) => item[rowKey] === fromId, + ); + const toIndex = findIndex( + field.value, + (item) => item[rowKey] === toId, + ); + console.log({ fromId, toId, fromIndex, toIndex }); + field.move(fromIndex, toIndex); + refresh(); + await resource.sort({ + resourceKey: fromId, + target: { + [rowKey]: toId, + }, + }); + await service.refresh(); + } + }} + > + {actionBars.map((actionBar) => ( + + ))} + + {}} + loading={service?.loading} + rowKey={rowKey} + dataSource={dataSource} + columns={columns} + // components={{ + // body: { + // row: DragableBodyRow, + // }, + // }} + components={{ + header: { + row: SortableHeaderRow, + cell: SortableHeaderCell, + }, + body: { + // wrapper: (props) => { + // return ( + // + // + //
+ // + // {props.children} + // + // ); + // }, + row: SortableBodyRow, + // cell: SortableBodyCell, + }, + }} + rowSelection={{ + type: type || 'checkbox', + selectedRowKeys, + onChange: (rowKeys, rows) => { + setSelectedRowKeys(rowKeys); + onSelect && onSelect(rowKeys, rows); + }, + renderCell: (checked, record, _, originNode) => { + const index = findIndex( + field.value, + (item) => item[rowKey] === record[rowKey], + ); + return ( + +
+ {dragSort && } + {showIndex && } + {originNode} +
+
+ ); + }, + }} + /> + + + +
+ ); +}; + +const usePagination = () => { + const field = useField(); + const paginationProps = field.componentProps.pagination; + + let pagination = paginationProps; + + // const [pagination, setPagination] = useState(() => { + // if (!paginationProps) { + // return false; + // } + // const { defaultPageSize = 10, ...others } = paginationProps; + // return { page: 1, pageSize: defaultPageSize, ...others }; + // }); + + // useEffect(() => { + // if (!paginationProps) { + // return setPagination(false); + // } + // const { defaultPageSize = 10, ...others } = paginationProps; + // setPagination({ page: 1, pageSize: defaultPageSize, ...others }); + // }, [paginationProps]); + + return [ + pagination, + (params) => { + const defaults = field.componentProps.pagination; + field.componentProps.pagination = { ...defaults, ...params }; + }, + ]; +}; + +const useDefaultSelectedRowKeys = () => { + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + return { selectedRowKeys, setSelectedRowKeys }; +}; + +const TableProvider = (props: any) => { + const { + rowKey = 'id', + dataRequest, + useResource = useGeneralResource, + defaultSelectedRowKeys, + useSelectedRowKeys = useDefaultSelectedRowKeys, + ...others + } = props; + const { schema } = useDesignable(); + const field = useField(); + const [pagination, setPagination] = usePagination(); + const { selectedRowKeys, setSelectedRowKeys } = useSelectedRowKeys(); + console.log('props.useSelectedRowKeys', selectedRowKeys); + const [, refresh] = useState(uid()); + const { resource } = useResource(); + const { sortableField } = useCollectionContext(); + const dragSort = props.dragSort; + const collectionFields = useCollectionFields(schema); + // console.log({ collectionFields, pagination }); + const getDefaultParams = () => { + const defaultParams = { ...pagination }; + if (dragSort) { + defaultParams['sort'] = [sortableField || 'sort']; + } else { + defaultParams['sort'] = (props.defaultSort || []).join(','); + } + defaultParams['defaultAppends'] = [ + ...(props.defaultAppends || []), + ...collectionFields, + ]; + if (props.defaultFilter) { + defaultParams['defaultFilter'] = props.defaultFilter; + } + console.log({ defaultParams }); + return defaultParams; + }; + const service = useRequest( + (params?: any) => { + if (!resource) { + return Promise.resolve({ + list: field.value, + total: field?.value?.length, + }); + } + return resource.list(params).then((res) => { + return { + list: res?.data || [], + total: res?.meta?.count || res?.data?.length, + }; + }); + }, + { + onSuccess(data: any) { + field.setValue(data?.list || []); + }, + manual: true, + // defaultParams: [getDefaultParams()], + }, + ); + useEffect(() => { + service.run(getDefaultParams()); + }, [ + pagination.pageSize, + pagination.page, + props.dragSort, + props.defaultSort, + props.defaultFilter, + ]); + return ( + { + const { page = 1, pageSize } = pagination; + const total = props.clientSidePagination + ? field?.value?.length + : service?.data?.total; + const maxPage = Math.ceil(total / pageSize); + if (page > maxPage) { + setPagination({ page: maxPage }); + } else { + refresh(uid()); + } + }, + selectedRowKeys, + setSelectedRowKeys, + pagination, + setPagination, + service, + field, + schema, + props: { ...others, rowKey, dataRequest }, + }} + > + + + ); +}; + +export const Table: any = observer((props: any) => { + const [visible, setVisible] = useState(false); + return ( + + + + + + ); +}); + +const useTotal = () => { + const { + field, + service, + props: { clientSidePagination }, + } = useTable(); + return clientSidePagination ? field?.value?.length : service?.data?.total; +}; + +Table.Pagination = observer(() => { + const { service, pagination, setPagination, props } = useTable(); + if (!pagination || Object.keys(pagination).length === 0) { + return null; + } + const { clientSidePagination } = props; + const total = useTotal(); + const { page = 1 } = pagination; + return ( +
+ { + const page = pagination.pageSize !== pageSize ? 1 : current; + setPagination({ + page, + pageSize, + }); + // if (clientSidePagination) { + // return; + // } + // service.run({ + // ...service.params[0], + // page, + // pageSize, + // }); + }} + /> +
+ ); +}); + +function generateActionSchema(type) { + const actions: { [key: string]: ISchema } = { + filter: { + key: uid(), + name: uid(), + type: 'void', + title: '筛选', + 'x-align': 'left', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'filter', + }, + 'x-component': 'Table.Filter', + 'x-designable-bar': 'Table.Filter.DesignableBar', + 'x-component-props': { + fieldNames: [], + }, + }, + export: { + key: uid(), + type: 'void', + name: uid(), + title: '导出', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'export', + }, + 'x-action-type': 'export', + 'x-component': 'Action', + 'x-designable-bar': 'Table.ExportActionDesignableBar', + 'x-component-props': { + fieldNames: [], + icon: 'ExportOutlined', + useAction: '{{ Table.useTableExportAction }}', + }, + }, + create: { + key: uid(), + type: 'void', + name: uid(), + title: '添加', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'create', + }, + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + icon: 'PlusOutlined', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + properties: { + modal: { + type: 'void', + title: '添加数据', + 'x-decorator': 'Form', + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableCreateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + destroy: { + key: uid(), + type: 'void', + name: uid(), + title: '删除', + 'x-align': 'right', + 'x-decorator': 'AddNew.Displayed', + 'x-decorator-props': { + displayName: 'destroy', + }, + 'x-action-type': 'destroy', + 'x-component': 'Action', + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-component-props': { + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + useAction: '{{ Table.useTableDestroyAction }}', + }, + }, + view: {}, + update: {}, + }; + return actions[type]; +} + +function generateMenuActionSchema(type) { + const actions: { [key: string]: ISchema } = { + view: { + key: uid(), + name: uid(), + type: 'void', + title: '查看', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'view', + properties: { + [uid()]: { + type: 'void', + title: '查看数据', + 'x-component': 'Action.Drawer', + 'x-component-props': { + bodyStyle: { + background: '#f0f2f5', + // paddingTop: 0, + }, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + properties: { + [uid()]: { + type: 'void', + title: '详情', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component': 'Tabs.TabPane', + 'x-component-props': {}, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + update: { + key: uid(), + name: uid(), + type: 'void', + title: '编辑', + 'x-component': 'Action', + 'x-component-props': { + type: 'link', + }, + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'update', + properties: { + [uid()]: { + type: 'void', + title: '编辑数据', + 'x-decorator': 'Form', + 'x-decorator-props': { + useResource: '{{ Table.useResource }}', + useValues: '{{ Table.useTableRowRecord }}', + }, + 'x-component': 'Action.Drawer', + 'x-component-props': { + useOkAction: '{{ Table.useTableUpdateAction }}', + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.FormItem', + }, + }, + }, + }, + }, + }, + destroy: { + key: uid(), + name: uid(), + type: 'void', + title: '删除', + 'x-component': 'Action', + 'x-designable-bar': 'Table.Action.DesignableBar', + 'x-action-type': 'destroy', + 'x-component-props': { + useAction: '{{ Table.useTableDestroyAction }}', + type: 'link', + confirm: { + title: '删除数据', + content: '删除后无法恢复,确定要删除吗?', + }, + }, + }, + }; + return actions[type]; +} + +function AddActionButton() { + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { appendChild, remove } = useDesignable(); + const { schema, designable } = useDesignable(); + const { createSchema, removeSchema, updateSchema } = useClient(); + + if (!designable || !schema['x-designable-bar']) { + return null; + } + return ( + + + {[ + { title: '筛选', name: 'filter' }, + { title: '导出', name: 'export' }, + { title: '添加', name: 'create' }, + { title: '删除', name: 'destroy' }, + ].map((item) => ( + { + if (!checked) { + const s = displayed.get(item.name) as Schema; + const path = getSchemaPath(s); + displayed.remove(item.name); + const removed = remove(path); + await removeSchema(removed); + } else { + const s = generateActionSchema(item.name); + const data = appendChild(s); + await createSchema(data); + } + }} + /> + ))} + + + + 函数操作 + 弹窗表单 + 复杂弹窗 + + + } + > + + + ); +} + +function Actions(props: any) { + const { align = 'left' } = props; + const { schema, designable } = useDesignable(); + return ( + + + {schema.mapProperties((s) => { + const currentAlign = s['x-align'] || 'left'; + if (currentAlign !== align) { + return null; + } + return ( + + + + ); + })} + + + ); +} + +Table.ActionBar = observer((props: any) => { + const { align = 'top' } = props; + // const { schema, designable } = useDesignable(); + const { root, schema, insertAfter, remove, appendChild } = useDesignable(); + const moveToAfter = (path1, path2, extra = {}) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter( + { + ...data.toJSON(), + ...extra, + }, + path2, + ); + }; + const { createSchema, removeSchema, updateSchema } = useClient(); + + const [dragOverlayContent, setDragOverlayContent] = useState(''); + return ( + { + setDragOverlayContent(event.active.data?.current?.title || ''); + // const previewRef = event.active.data?.current?.previewRef; + // if (previewRef) { + // setDragOverlayContent(previewRef?.current?.innerHTML); + // } else { + // setDragOverlayContent(''); + // } + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const align = event.over?.data?.current?.align; + const draggable = event.over?.data?.current?.draggable; + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + if (!draggable) { + console.log('alignalignalignalign', align); + const p = findPropertyByPath(root, path1); + if (!p) { + return; + } + remove(path1); + const data = appendChild( + { + ...p.toJSON(), + 'x-align': align, + }, + path2, + ); + await updateSchema(data); + } else { + const data = moveToAfter(path1, path2, { + 'x-align': align, + }); + await updateSchema(data); + } + }} + > + + {dragOverlayContent} + {/*
*/} +
+ +
+
+ +
+
+ +
+ +
+
+
+ ); +}); + +const fieldsToFilterColumns = (fields: any[], options: any = {}) => { + const { fieldNames = [] } = options; + const properties = {}; + fields.forEach((field, index) => { + if (fieldNames?.length && !fieldNames.includes(field.name)) { + return; + } + const fieldOption = interfaces.get(field.interface); + if (!fieldOption?.operations) { + return; + } + properties[`column${index}`] = { + type: 'void', + title: field?.uiSchema?.title, + 'x-component': 'Filter.Column', + 'x-component-props': { + operations: fieldOption.operations, + }, + properties: { + [field.name]: { + ...field.uiSchema, + 'x-decorator': 'FormilyFormItem', + title: null, + }, + }, + }; + }); + return properties; +}; + +const fieldsToSortColumns = (fields: any[]) => { + const dataSource = []; + + fields.forEach((field) => { + const fieldOption = interfaces.get(field.interface); + if (!fieldOption?.sortable) { + return; + } + dataSource.push({ + value: field.name, + label: field?.uiSchema?.title, + }); + }); + + return dataSource; +}; + +Table.Filter = observer((props: any) => { + const { service } = useTable(); + const { fieldNames = [] } = props; + const { schema, DesignableBar } = useDesignable(); + const form = useMemo(() => createForm(), []); + const { fields = [] } = useCollectionContext(); + const [visible, setVisible] = useState(false); + const obj = flatten(form.values.filter || {}); + console.log('flatten', obj, Object.values(obj)); + const count = Object.values(obj).filter((i) => + Array.isArray(i) ? i.length : i, + ).length; + const icon = props.icon || 'FilterOutlined'; + const properties = fieldsToFilterColumns(fields, { fieldNames }); + schema.mapProperties((p) => { + properties[p.name] = p; + }); + return ( + + + + + { + const { filter } = form.values; + console.log('Table.Filter', form.values); + setVisible(false); + return service.run({ + ...service.params[0], + filter, + }); + }} + > + 提交 + + + +
+ } + > + + + ); +}); + +Table.Filter.DesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { fields } = useCollectionContext(); + const field = useField(); + const { createSchema, removeSchema, updateSchema } = useClient(); + let fieldNames = field.componentProps.fieldNames || []; + if (fieldNames.length === 0) { + fieldNames = fields.map((field) => field.name); + } + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + + {fields + .filter((collectionField) => { + const option = interfaces.get(collectionField.interface); + return option?.operations?.length; + }) + .map((collectionField) => ( + { + if (checked) { + fieldNames.push(collectionField.name); + } else { + const index = fieldNames.indexOf( + collectionField.name, + ); + if (index > -1) { + fieldNames.splice(index, 1); + } + } + console.log({ fieldNames, field }); + schema['x-component-props']['fieldNames'] = + fieldNames; + field.componentProps.fieldNames = fieldNames; + updateSchema(schema); + }} + /> + ))} + + + { + setVisible(false); + const values = await FormDialog('编辑按钮', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + schema['title'] = values.title; + schema['x-component-props']['icon'] = values.icon; + field.componentProps.icon = values.icon; + field.title = values.title; + updateSchema(schema); + refresh(); + }} + > + 编辑按钮 + + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; + +Table.ExportActionDesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { fields } = useCollectionContext(); + const field = useField(); + const { createSchema, removeSchema, updateSchema } = useClient(); + let fieldNames = field.componentProps.fieldNames || []; + if (fieldNames.length === 0) { + fieldNames = fields.map((field) => field.name); + } + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + + {fields.map((collectionField) => ( + { + if (checked) { + fieldNames.push(collectionField.name); + } else { + const index = fieldNames.indexOf( + collectionField.name, + ); + if (index > -1) { + fieldNames.splice(index, 1); + } + } + console.log({ fieldNames, field }); + schema['x-component-props']['fieldNames'] = fieldNames; + field.componentProps.fieldNames = fieldNames; + updateSchema(schema); + }} + /> + ))} + + + { + setVisible(false); + const values = await FormDialog('编辑按钮', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + schema['title'] = values.title; + schema['x-component-props']['icon'] = values.icon; + field.componentProps.icon = values.icon; + field.title = values.title; + updateSchema(schema); + refresh(); + }} + > + 编辑按钮 + + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; + +Table.Operation = observer((props: any) => { + const { designable, schema } = useDesignable(); + return ( +
+ 操作 + +
+ ); +}); + +Table.Operation.Cell = observer((props: any) => { + const ctx = useContext(TableRowContext); + const schema = props.schema; + return ( +
+ +
+ ); +}); + +Table.Operation.DesignableBar = () => { + const { schema: columnSchema } = useDesignable(); + const groupSchema = Object.values(columnSchema.properties || {}).shift(); + const groupPath = getSchemaPath(groupSchema); + const { schema, remove, refresh, appendChild } = useDesignable(groupPath); + const [visible, setVisible] = useState(false); + const { createSchema, removeSchema, updateSchema } = useClient(); + + const map = new Map(); + schema.mapProperties((s) => { + if (!s['x-action-type']) { + return; + } + map.set(s['x-action-type'], s.name); + }); + const path = getSchemaPath(schema); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + + {[ + { title: '查看', name: 'view' }, + { title: '编辑', name: 'update' }, + { title: '删除', name: 'destroy' }, + ].map((item) => ( + { + if (checked) { + const s = generateMenuActionSchema(item.name); + const data = appendChild(s); + await createSchema(data); + } else if (map.get(item.name)) { + const removed = remove([...path, map.get(item.name)]); + await removeSchema(removed); + } + }} + /> + ))} + + + + 函数操作 + 弹窗表单 + 复杂弹窗 + + + } + > + + + + +
+ ); +}; + +Table.Action = () => null; + +Table.Action.DesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const isPopup = Object.keys(schema.properties || {}).length > 0; + const popupSchema = Object.values(schema.properties || {}).shift(); + const inActionBar = schema.parent['x-component'] === 'Table.ActionBar'; + const displayed = useDisplayedMapContext(); + const field = useField(); + const { createSchema, removeSchema, updateSchema } = useClient(); + const popupComponent = popupSchema?.['x-component'] || 'Action.Drawer'; + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + { + setVisible(false); + const values = await FormDialog('编辑按钮', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + schema['title'] = values.title; + schema['x-component-props']['icon'] = values.icon; + field.componentProps.icon = values.icon; + field.title = values.title; + updateSchema(schema); + refresh(); + }} + > + 编辑按钮 + + {isPopup && ( + + 在{' '} + {' '} + 内打开 + + )} + {!inActionBar && ( + + 点击表格行时触发    + + + )} + + { + const displayName = + schema?.['x-decorator-props']?.['displayName']; + const data = remove(); + await removeSchema(data); + if (displayName) { + displayed.remove(displayName); + } + setVisible(false); + }} + > + 隐藏 + + + } + > + + + + +
+ ); +}; + +Table.Cell = observer((props: any) => { + const ctx = useContext(TableRowContext); + const schema = props.schema; + const collectionField = useContext(CollectionFieldContext); + if (schema['x-component'] === 'Table.Operation') { + return ; + } + let uiSchema = collectionField?.uiSchema as Schema; + if (uiSchema?.['x-component'] === 'Upload.Attachment') { + uiSchema = cloneDeepWith(uiSchema); + set(uiSchema, 'x-component-props.size', 'small'); + } + const componentProps = merge( + uiSchema?.['x-component-props'] || {}, + schema?.['x-component-props'] || {}, + { + arrayMerge: (t, s) => s, + }, + ); + console.log('Table.Cell', collectionField?.interface, componentProps); + return ( +
+ +
+ ); +}); + +Table.Column = observer((props: any) => { + const collectionField = useContext(CollectionFieldContext); + const { schema, DesignableBar } = useDesignable(); + const displayed = useDisplayedMapContext(); + useEffect(() => { + if (collectionField?.name) { + displayed.set(collectionField.name, schema); + } + }, [collectionField, schema]); + return ( +
+ {schema.title || collectionField?.uiSchema?.title} + +
+ ); +}); + +Table.Column.DesignableBar = () => { + const field = useField(); + const { service, refresh: refreshTable } = useTable(); + // const fieldSchema = useFieldSchema(); + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const displayed = useDisplayedMapContext(); + const { getFieldsByCollection } = useCollectionsContext(); + const collectionField = useContext(CollectionFieldContext); + const { createSchema, removeSchema, updateSchema } = useClient(); + console.log('displayed.map', displayed.map); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + + { + setVisible(visible); + }} + overlay={ + + { + setVisible(false); + const values = await FormDialog('自定义列名称', () => { + return ( + + + + ); + }).open({ + initialValues: { + fieldName: collectionField?.uiSchema?.title, + title: schema['title'], + }, + }); + const title = values.title || null; + field.title = title; + schema.title = title; + refresh(); + await updateSchema({ + key: schema['key'], + title: title, + }); + }} + > + 自定义列名称 + + {collectionField?.interface === 'linkTo' && ( + +
+ 标签字段{' '} + { + const componentProps = schema['x-component-props'] || {}; + set(componentProps, 'pagination.defaultPageSize', value); + set(componentProps, 'pagination.pageSize', value); + schema['x-component-props'] = componentProps; + field.componentProps.pagination.pageSize = value; + field.componentProps.pagination.defaultPageSize = value; + refresh(); + updateSchema(schema); + setVisible(false); + }} + defaultValue={defaultPageSize} + > + 10 + 20 + 50 + 100 + {' '} + 条 + + + { + Modal.confirm({ + title: '删除区块', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const removed = deepRemove(); + // console.log({ removed }) + const last = removed.pop(); + await removeSchema(last); + setVisible(false); + }, + }); + }} + > + 删除 + +
+ } + > + +
+
+
+
+ ); +}); + +Table.useResource = ({ onSuccess, manual = true }) => { + const { props } = useTable(); + const { collection } = useCollectionContext(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest({ + resourceName: collection?.name || props.collectionName, + resourceKey: ctx.record[props.rowKey], + }); + const { schema } = useDesignable(); + const fieldFields = (schema: Schema) => { + const names = []; + schema.reduceProperties((buf, current) => { + if (current['x-component'] === 'Form.Field') { + const fieldName = current['x-component-props']?.['fieldName']; + if (fieldName) { + buf.push(fieldName); + } + } else { + const fieldNames = fieldFields(current); + buf.push(...fieldNames); + } + return buf; + }, names); + return names; + }; + console.log( + 'collection?.name || props.collectionName', + collection?.name || props.collectionName, + // fieldFields(schema), + ); + const service = useRequest( + (params?: any) => { + console.log('Table.useResource', params); + return resource.get({ ...params, appends: fieldFields(schema) }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + manual, + }, + ); + return { resource, service, initialValues: service.data, ...service }; +}; + +Table.useActionLogDetailsResource = ({ onSuccess }) => { + const { props } = useTable(); + const { collection } = useCollectionContext(); + const ctx = useContext(TableRowContext); + const resource = useResourceRequest({ + resourceName: 'action_logs', + resourceKey: ctx.record[props.rowKey], + }); + const service = useRequest( + (params?: any) => { + return resource.get({ + ...params, + appends: ['changes', 'user', 'collection'], + }); + }, + { + formatResult: (result) => result?.data, + onSuccess, + manual: true, + }, + ); + const [visible] = useContext(VisibleContext); + + useEffect(() => { + if (visible) { + service.run({}); + } + }, [visible]); + + return { resource, service, initialValues: service.data, ...service }; +}; + +const useActionLogsResource = (options: any = {}) => { + const { props } = useTable(); + const ctx = useContext(TableRowContext); + + class ActionLogoResource extends Resource { + list(options?: ListOptions) { + console.log({ options }); + let defaultFilter = options?.defaultFilter; + if (ctx?.record) { + const extra = { + index: ctx?.record?.id, + collection_name: props.collectionName, + }; + if (defaultFilter) { + defaultFilter = { and: [defaultFilter, extra] }; + } else { + defaultFilter = extra; + } + } + return super.list({ ...options, defaultFilter }); + } + } + + const resource = useResourceRequest('action_logs', ActionLogoResource); + + return { + resource, + }; +}; + +Table.useActionLogsResource = useActionLogsResource; +Table.useTableFilterAction = useTableFilterAction; +Table.useTableCreateAction = useTableCreateAction; +Table.useTableUpdateAction = useTableUpdateAction; +Table.useTableDestroyAction = useTableDestroyAction; +Table.useTableExportAction = useTableExportAction; +Table.useTableIndex = useTableIndex; +Table.useTableRowRecord = useTableRowRecord; +Table.SimpleDesignableBar = SimpleDesignableBar; diff --git a/packages/client/src/schemas/table/style.less b/packages/client/src/schemas/table/style.less new file mode 100644 index 0000000000000000000000000000000000000000..e7fe0753f037a7cdde4ccabf408f7cb0ff875007 --- /dev/null +++ b/packages/client/src/schemas/table/style.less @@ -0,0 +1,292 @@ +.nb-table { + overflow-x: auto; + overflow-y: hidden; +} + +.nb-table-column { + &:hover { + > .designable-bar { + display: block; + } + } + > .designable-bar { + display: none; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + border-radius: 0; + border: 2px solid #1890ff; + &.active { + display: block; + } + .designable-bar-actions { + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + font-size: 10px; + } + } + } +} + +.ant-popover.nb-action-group { + z-index: 1000; + padding-top: 0; + .ant-popover-arrow { + display: none; + } + .ant-popover-inner-content { + padding: 4px 0; + .ant-btn { + display: block; + min-width: 100px; + width: 100%; + border: 0; + border-radius: 0; + text-align: left; + padding: 5px 12px; + color: #000; + &:hover { + background-color: #f5f5f5; + } + &[disabled] { + color: #00000040; + background-color: #fff; + cursor: not-allowed; + } + } + } +} + +.nb-action-bar { + &.align-top { + margin-top: 1px; + margin-bottom: 8px; + } + &.align-bottom { + margin-top: 8px; + } + display: flex; +} + +th.nb-table-operation, +td.nb-table-operation { + width: 50px; + text-align: center !important; + padding: 0 !important; + &::before { + display: none; + } +} + +td.nb-table-operation { + .ant-btn { + border: 0; + box-shadow: none; + padding: 6px; + height: auto; + line-height: 16px; + background: none; + &:hover { + background: #f1f1f1; + } + } +} + +.nb-table-selection { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + &.dragSort { + .nb-table-index { + padding-left: 20px; + min-width: 38px; + } + } + .nb-table-sort-handle { + margin-right: 8px; + cursor: grab; + } + &.showIndex { + .ant-checkbox-wrapper { + position: absolute; + right: 0; + display: none; + // right: 8px; + } + .nb-table-sort-handle { + display: inline-flex; + align-items: baseline; + position: absolute; + // left: 8px; + cursor: grab; + margin-right: 8px; + z-index: 3; + } + } + .ant-checkbox-wrapper { + // position: absolute; + // right: 0; + // display: none; + // right: 8px; + } + .nb-table-index { + // display: inline-flex; + // align-items: baseline; + position: relative; + z-index: 2; + text-align: center; + // padding-left: 20px; + width: 100%; + // min-width: 38px; + // position: absolute; + // right: 8px; + // height: 16px; + // line-height: 16px; + // text-align: center; + // background-color: #fff; + // min-width: 16px; + // width: 100%; + // z-index: 2; + } +} + +.ant-table-selection-column { + text-align: right !important; + &:hover { + .nb-table-index { + opacity: 0; + } + .ant-checkbox-wrapper { + z-index: 4; + display: inline-flex; + } + } +} + +.ant-table-row-selected { + .nb-table-index { + opacity: 0; + } + .ant-checkbox-wrapper { + z-index: 4; + display: inline-flex !important; + } +} + +.ant-table-cell { + .ant-formily-item-feedback-layout-popover { + margin-bottom: 0; + } + .ant-formily-item-control + .ant-formily-item-control-content + .ant-formily-item-control-content-component { + min-height: inherit; + line-height: inherit; + } +} + +.ant-dropdown-menu-item { + &:hover { + .designable-bar { + display: block; + } + } + .designable-bar { + display: none; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + border-radius: 0; + border: 2px solid #1890ff; + &.active { + display: block; + } + .designable-bar-actions { + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + font-size: 10px; + } + } + } +} + +.action-bar-align-right.isOver, +.action-bar-align-left.isOver { + min-height: 32px; + background-color: #e6f7ff; +} + +.nb-space-between { + display: flex; + align-items: center; + justify-content: space-between; +} + +.field-interface-attachment { + margin-top: -13px; + margin-bottom: -13px; +} + +.ant-table-cell { + &.droppable.isDragging::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 100%; + background-color: #f18b62; + opacity: 0.3; + } + &.droppable:not(.isDragging).isOver::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 2px; + background-color: #f18b62; + } +} + +.ant-space-item { + .droppable { + position: relative; + } + .droppable.isDragging::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 100%; + background-color: #f18b62; + opacity: 0.3; + } + .droppable:not(.isDragging).isOver::after { + content: ''; + position: absolute; + top: 0; + right: -5px; + height: 100%; + width: 2px; + background-color: #f18b62; + } +} diff --git a/packages/client/src/schemas/tabs/index.md b/packages/client/src/schemas/tabs/index.md new file mode 100644 index 0000000000000000000000000000000000000000..acdf304e386135c8fa1c0b58363ca693609efb6a --- /dev/null +++ b/packages/client/src/schemas/tabs/index.md @@ -0,0 +1,96 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Tabs - 标签页 + +## Node + +
+
+  
+    // 添加其他节点
+  
+  
+    // 添加其他节点
+  
+
+
+ +## Designable Bar + +- Tabs.DesignableBar + +## Examples + +### 基本使用 + +```tsx +/** + * title: 基本使用 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + tabs: { + type: 'void', + 'x-decorator': 'Card', + 'x-component': 'Tabs', + 'x-designable-bar': 'Tabs.DesignableBar', + 'x-component-props': { + // singleton: true, + }, + properties: { + tab1: { + type: 'void', + title: 'Tab1', + 'x-component': 'Tabs.TabPane', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component-props': { + tab: 'Tab1', + }, + properties: { + aaa: { + type: 'string', + title: 'AAA', + 'x-decorator': 'FormItem', + required: true, + 'x-component': 'Input', + }, + }, + }, + tab2: { + type: 'void', + title: 'Tab2', + 'x-component': 'Tabs.TabPane', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component-props': { + tab: 'Tab2', + }, + properties: { + bbb: { + type: 'string', + title: 'BBB', + 'x-decorator': 'FormItem', + required: true, + 'x-component': 'Input', + }, + }, + }, + }, + }, + } +} + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/tabs/index.tsx b/packages/client/src/schemas/tabs/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e9eb38b0ac1f44f94a1a22126dc5c7845e9438e3 --- /dev/null +++ b/packages/client/src/schemas/tabs/index.tsx @@ -0,0 +1,369 @@ +import { observer, connect, useField, RecursionField } from '@formily/react'; +import React from 'react'; +import { + Button, + Tabs as AntdTabs, + Dropdown, + Menu, + Switch, + Space, + Modal, +} from 'antd'; +import { + findPropertyByPath, + getSchemaPath, + SchemaField, + useDesignable, +} from '../../components/schema-renderer'; +import { Schema, SchemaKey } from '@formily/react'; +import { PlusOutlined, MenuOutlined } from '@ant-design/icons'; +import { useState } from 'react'; +import cls from 'classnames'; +import { useClient } from '../../constate'; +import './style.less'; +import { uid } from '@formily/shared'; +import { DragHandle, SortableItem } from '../../components/Sortable'; +import { DndContext, DragOverlay } from '@dnd-kit/core'; +import { FormDialog, FormLayout } from '@formily/antd'; +import IconPicker from '../../components/icon-picker'; + +const useTabs = ({ singleton }) => { + const tabsField = useField(); + const { schema } = useDesignable(); + const tabs: { name: SchemaKey; props: any; schema: Schema }[] = []; + schema.mapProperties((schema, name) => { + const field = tabsField.query(tabsField.address.concat(name)).take(); + if (field?.display === 'none' || field?.display === 'hidden') return; + if (schema['x-component']?.indexOf('TabPane') > -1) { + tabs.push({ + name, + props: { + key: schema?.['x-component-props']?.key || name, + ...schema?.['x-component-props'], + }, + schema, + }); + } + }); + if (singleton) { + return [tabs.shift()].filter(Boolean); + } + return tabs; +}; + +export const Tabs: any = observer((props: any) => { + const { singleton, ...others } = props; + const { + designable, + schema, + DesignableBar, + appendChild, + root, + remove, + insertAfter, + } = useDesignable(); + const tabs = useTabs({ singleton }); + const [dragOverlayContent, setDragOverlayContent] = useState(''); + const { createSchema, removeSchema, updateSchema } = useClient(); + + const moveToAfter = (path1, path2) => { + if (!path1 || !path2) { + return; + } + if (path1.join('.') === path2.join('.')) { + return; + } + const data = findPropertyByPath(root, path1); + if (!data) { + return; + } + remove(path1); + return insertAfter(data.toJSON(), path2); + }; + + if (singleton) { + return ( +
+ + {tabs.map(({ props, schema, name }, key) => ( + + ))} +
+ ); + } + + return ( +
+ + { + setDragOverlayContent(event.active.data?.current?.title || ''); + }} + onDragEnd={async (event) => { + const path1 = event.active?.data?.current?.path; + const path2 = event.over?.data?.current?.path; + const data = moveToAfter(path1, path2); + await updateSchema(data); + }} + > + + {dragOverlayContent} + + } + onClick={async () => { + const values = await FormDialog('添加标签页', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + const data = appendChild({ + type: 'void', + name: uid(), + title: values.title, + 'x-component': 'Tabs.TabPane', + 'x-designable-bar': 'Tabs.TabPane.DesignableBar', + 'x-component-props': { + icon: values.icon, + }, + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid', + 'x-component-props': { + addNewComponent: 'AddNew.PaneItem', + }, + }, + }, + }); + await createSchema(data); + }} + > + 添加标签页 + + ) + } + > + {tabs.map(({ props, schema, name }, key) => ( + + } + key={key} + > + + + ))} + + +
+ ); +}); + +Tabs.TabPane = observer((props: any) => { + const { schema, DesignableBar } = useDesignable(); + return ( + +
+ + {schema.title} +
+
+ ); +}); + +Tabs.DesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const field = useField(); + const { createSchema, removeSchema, updateSchema } = useClient(); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + { + setVisible(visible); + }} + overlay={ + + { + const singleton = !field.componentProps.singleton; + schema['x-component-props'] = + schema['x-component-props'] || {}; + schema['x-component-props'].singleton = singleton; + field.componentProps.singleton = singleton; + updateSchema(schema); + }} + > + 禁用标签页 {' '} + + + + } + > + + + + +
+ ); +}; + +Tabs.TabPane.DesignableBar = () => { + const { schema, remove, refresh, insertAfter } = useDesignable(); + const [visible, setVisible] = useState(false); + const field = useField(); + const { createSchema, removeSchema, updateSchema } = useClient(); + return ( +
+ { + e.stopPropagation(); + }} + className={cls('designable-bar-actions', { active: visible })} + > + + {' '} + { + setVisible(visible); + }} + overlay={ + + { + setVisible(false); + const values = await FormDialog('编辑标签页', () => { + return ( + + + + ); + }).open({ + initialValues: { + title: schema['title'], + icon: schema['x-component-props']?.['icon'], + }, + }); + field.componentProps.icon = values.icon; + schema.title = values.title; + schema['x-component-props'] = + schema['x-component-props'] || {}; + schema['x-component-props']['icon'] = values.icon; + refresh(); + updateSchema(schema); + }} + > + 编辑标签页 + + + { + setVisible(false); + Modal.confirm({ + title: '删除标签页', + content: '删除后无法恢复,确定要删除吗?', + onOk: async () => { + const data = remove(); + await removeSchema(data); + }, + }); + }} + > + 删除 + + + } + > + + + + +
+ ); +}; diff --git a/packages/client/src/schemas/tabs/style.less b/packages/client/src/schemas/tabs/style.less new file mode 100644 index 0000000000000000000000000000000000000000..1dfa68a823fe139712845fc2f862c348de9d8eb1 --- /dev/null +++ b/packages/client/src/schemas/tabs/style.less @@ -0,0 +1,104 @@ +.nb-tabs, +.nb-tab-pane { + &:hover { + > .designable-bar { + display: block; + } + } + > .designable-bar { + pointer-events: none; + display: none; + position: absolute; + top: 0; + right: -16px; + left: -16px; + bottom: 0; + border-radius: 0; + border: 2px solid #1890ff; + &.active { + display: block; + } + + .ant-tabs { + position: relative; + z-index: 51; + } + .designable-bar-actions { + pointer-events: all; + position: absolute; + right: 0; + line-height: 1rem; + background-color: #1890ff; + color: #fff; + z-index: 10; + padding: 0 3px; + .anticon { + font-size: 10px; + margin-right: 0; + } + } + } +} + +.ant-tabs-tab:first-child { + .nb-tab-pane { + .designable-bar { + left: 0; + } + } +} + +.ant-tabs-tab:last-child { + .nb-tab-pane { + .designable-bar { + right: 0; + } + } +} + +.ant-tabs-dropdown-menu-item { + position: relative; +} + +.ant-tabs.singleton { + .ant-tabs-nav { + display: none; + } +} +.nb-tabs { + position: relative; + > .designable-bar { + left: 0; + right: 0; + } +} + +.ant-drawer-body, +.ant-card-body, +.ant-modal-body { + .nb-tabs { + margin: -24px; + padding: 24px; + } +} + +.ant-tabs-tab-btn { + .droppable.isDragging::after { + content: ''; + position: absolute; + top: 0; + right: -16px; + height: 100%; + left: -16px; + background-color: #f18b62; + opacity: 0.3; + } + .droppable:not(.isDragging).isOver::after { + content: ''; + position: absolute; + top: 0; + right: -16px; + height: 100%; + width: 2px; + background-color: #f18b62; + } +} diff --git a/packages/client/src/schemas/time-picker/index.md b/packages/client/src/schemas/time-picker/index.md new file mode 100644 index 0000000000000000000000000000000000000000..2328de96d2fd370b48fff82dcafc8b5009ca8c0a --- /dev/null +++ b/packages/client/src/schemas/time-picker/index.md @@ -0,0 +1,63 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# TimePicker - 时间选择器 + +## Node Tree + +
+
+
+ +## Designable Bar + +- TimePicker.DesignableBar + +## Examples + +### 日期选择器 + +```tsx +/** + * title: 日期选择器 + */ +import React from 'react'; +import { SchemaRenderer } from '../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'TimePicker', + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'TimePicker', + }, + } +} + +export default () => { + return ( + + ); +}; +``` diff --git a/packages/client/src/schemas/time-picker/index.tsx b/packages/client/src/schemas/time-picker/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..00b252d29321b79f6da7b48a23ee9530f10503ff --- /dev/null +++ b/packages/client/src/schemas/time-picker/index.tsx @@ -0,0 +1,44 @@ +import moment from 'moment'; +import { connect, mapProps, mapReadPretty } from '@formily/react'; +import { TimePicker as AntdTimePicker } from 'antd'; +import { + TimePickerProps as AntdTimePickerProps, + TimeRangePickerProps, +} from 'antd/lib/time-picker'; +import { Display } from '../display'; +import { formatMomentValue, momentable } from '@formily/antd/esm/__builtins__'; + +type ComposedTimePicker = React.FC & { + RangePicker?: React.FC; +}; + +const mapTimeFormat = function () { + return (props: any) => { + const format = props['format'] || 'HH:mm:ss'; + const onChange = props.onChange; + return { + ...props, + format, + value: momentable(props.value, format), + onChange: (value: moment.Moment | moment.Moment[]) => { + if (onChange) { + onChange(formatMomentValue(value, format)); + } + }, + }; + }; +}; + +export const TimePicker: ComposedTimePicker = connect( + AntdTimePicker, + mapProps(mapTimeFormat()), + mapReadPretty(Display.TimePicker), +); + +TimePicker.RangePicker = connect( + AntdTimePicker.RangePicker, + mapProps(mapTimeFormat()), + mapReadPretty(Display.TimeRangePicker), +); + +export default TimePicker; diff --git a/packages/client/src/schemas/tree-select/index.tsx b/packages/client/src/schemas/tree-select/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0afbb83d5fb60575e46bb8951df23c0cf7faaa00 --- /dev/null +++ b/packages/client/src/schemas/tree-select/index.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { connect, mapReadPretty, mapProps } from '@formily/react'; +import { TreeSelect as AntdTreeSelect } from 'antd'; +import { Display } from '../display'; +import { LoadingOutlined } from '@ant-design/icons'; +export const TreeSelect = connect( + AntdTreeSelect, + mapProps( + { + dataSource: 'treeData', + }, + (props, field) => { + return { + ...props, + suffixIcon: + field?.['loading'] || field?.['validating'] ? ( + + ) : ( + props.suffixIcon + ), + }; + }, + ), + mapReadPretty(Display.TreeSelect), +); + +export default TreeSelect; diff --git a/packages/client/src/schemas/upload/demos/demo1.tsx b/packages/client/src/schemas/upload/demos/demo1.tsx new file mode 100644 index 0000000000000000000000000000000000000000..695f1ce6953af4163ca2ade1bb481a6155a68e66 --- /dev/null +++ b/packages/client/src/schemas/upload/demos/demo1.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { SchemaRenderer } from '../../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'string', + title: `编辑模式`, + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + // multiple: true, + }, + 'x-reactions': { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + }, + read: { + type: 'string', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + // multiple: true, + }, + }, + }, +}; + +export default () => { + return ; +}; diff --git a/packages/client/src/schemas/upload/demos/demo2.tsx b/packages/client/src/schemas/upload/demos/demo2.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3684442e0748bb2bdd80dacaf1ee23e5dda38e50 --- /dev/null +++ b/packages/client/src/schemas/upload/demos/demo2.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { SchemaRenderer } from '../../'; + +const schema = { + type: 'object', + properties: { + input: { + type: 'object', + title: `编辑模式`, + default: [ + { + id: 45, + title: 's33766399', + name: 's33766399', + filename: 'cd48dc833ab01aa3959ac39309fc39de.jpg', + extname: '.jpg', + size: null, + mimetype: 'image/jpeg', + path: '', + meta: {}, + status: 'uploading', + percent: 60, + url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/cd48dc833ab01aa3959ac39309fc39de.jpg', + created_at: '2021-08-13T15:00:17.423Z', + updated_at: '2021-08-13T15:00:17.423Z', + created_by_id: null, + updated_by_id: null, + storage_id: 2, + }, + ], + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + multiple: true, + }, + 'x-reactions': [ + { + target: 'read', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + { + target: 'read2', + fulfill: { + state: { + value: '{{$self.value}}', + }, + }, + }, + ], + }, + read: { + type: 'object', + title: `阅读模式`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + multiple: true, + }, + }, + read2: { + type: 'object', + title: `小图预览`, + 'x-read-pretty': true, + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + multiple: true, + size: 'small', + }, + }, + }, +}; + +export default () => { + return ; +}; diff --git a/packages/client/src/schemas/upload/index.md b/packages/client/src/schemas/upload/index.md new file mode 100644 index 0000000000000000000000000000000000000000..559d5872225ab356cceeb05e3f8ee94136f52cff --- /dev/null +++ b/packages/client/src/schemas/upload/index.md @@ -0,0 +1,28 @@ +--- +nav: + path: /components +group: + path: /components/schema-components +--- + +# Upload - 上传 + +## Node Tree + +
+
+
+ +## Designable Bar + +- Upload.DesignableBar + +## Examples + +### 单文件上传 + + + +### 多文件上传 + + diff --git a/packages/client/src/schemas/upload/index.tsx b/packages/client/src/schemas/upload/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f302f38f90e399b1d0ed647c835ee270f068b144 --- /dev/null +++ b/packages/client/src/schemas/upload/index.tsx @@ -0,0 +1,599 @@ +import React, { useEffect } from 'react'; +import { + connect, + mapProps, + mapReadPretty, + observer, + useField, +} from '@formily/react'; +import { Button, Progress, Space, Upload as AntdUpload } from 'antd'; +import { + UploadChangeParam, + UploadProps as AntdUploadProps, + DraggerProps as AntdDraggerProps, +} from 'antd/lib/upload'; +import { reaction } from '@formily/reactive'; +import { UploadFile } from 'antd/lib/upload/interface'; +import { isArr, toArr as toArray, isValid } from '@formily/shared'; +import { UPLOAD_PLACEHOLDER } from './placeholder'; +import { usePrefixCls } from '@formily/antd/esm/__builtins__'; +import { useState } from 'react'; +import Lightbox from 'react-image-lightbox'; +import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app +import { useMap } from 'ahooks'; +import DeleteOutlined from '@ant-design/icons/DeleteOutlined'; +import UploadOutlined from '@ant-design/icons/UploadOutlined'; +import PlusOutlined from '@ant-design/icons/PlusOutlined'; +import DownloadOutlined from '@ant-design/icons/DownloadOutlined'; +import './style.less'; +import cls from 'classnames'; +import { saveAs } from 'file-saver'; + +const toArr = (value) => { + if (!isValid(value)) { + return []; + } + if (Object.keys(value).length === 0) { + return []; + } + return toArray(value); +}; + +type UploadProps = Omit & { + onChange?: (fileList: UploadFile[]) => void; + serviceErrorMessage?: string; + value?: any; +}; + +type DraggerProps = Omit & { + onChange?: (fileList: UploadFile[]) => void; + serviceErrorMessage?: string; +}; + +type ComposedUpload = React.FC & { + Dragger?: React.FC; + File?: React.FC; + Attachment?: React.FC; +}; + +type IUploadProps = { + serviceErrorMessage?: string; + onChange?: (...args: any) => void; +}; + +const testOpts = ( + ext: RegExp, + options: { exclude?: string[]; include?: string[] }, +) => { + if (options && isArr(options.include)) { + return options.include.some((url) => ext.test(url)); + } + + if (options && isArr(options.exclude)) { + return !options.exclude.some((url) => ext.test(url)); + } + + return true; +}; + +const getImageByUrl = (url: string, options: any) => { + for (let i = 0; i < UPLOAD_PLACEHOLDER.length; i++) { + if ( + UPLOAD_PLACEHOLDER[i].ext.test(url) && + testOpts(UPLOAD_PLACEHOLDER[i].ext, options) + ) { + return UPLOAD_PLACEHOLDER[i].icon || url; + } + } + + return url; +}; + +const getURL = (target: any) => { + return target?.['url'] || target?.['downloadURL'] || target?.['imgURL']; +}; +const getThumbURL = (target: any) => { + return ( + target?.['thumbUrl'] || + target?.['url'] || + target?.['downloadURL'] || + target?.['imgURL'] + ); +}; + +const getErrorMessage = (target: any) => { + return target?.errorMessage || + target?.errMsg || + target?.errorMsg || + target?.message || + typeof target?.error === 'string' + ? target.error + : ''; +}; + +const getState = (target: any) => { + if (target?.success === false) return 'error'; + if (target?.failed === true) return 'error'; + if (target?.error) return 'error'; + return target?.state || target?.status; +}; + +const normalizeFileList = (fileList: UploadFile[]) => { + if (fileList && fileList.length) { + return fileList.map((file, index) => { + return { + ...file, + uid: file.uid || `${index}`, + status: getState(file.response) || getState(file), + url: getURL(file) || getURL(file?.response), + thumbUrl: getImageByUrl( + getThumbURL(file) || getThumbURL(file?.response), + { + exclude: ['.png', '.jpg', '.jpeg', '.gif'], + }, + ), + }; + }); + } + return []; +}; + +const useValidator = (validator: (value: any) => string) => { + const field = useField(); + useEffect(() => { + const dispose = reaction( + () => field.value, + (value) => { + const message = validator(value); + field.setFeedback({ + type: 'error', + code: 'UploadError', + messages: message ? [message] : [], + }); + }, + ); + return () => { + dispose(); + }; + }, []); +}; + +const useUploadValidator = (serviceErrorMessage = 'Upload Service Error') => { + useValidator((value) => { + const list = toArr(value); + for (let i = 0; i < list.length; i++) { + if (list[i]?.status === 'error') { + return ( + getErrorMessage(list[i]?.response) || + getErrorMessage(list[i]) || + serviceErrorMessage + ); + } + } + }); +}; + +function useUploadProps({ + serviceErrorMessage, + ...props +}: T) { + useUploadValidator(serviceErrorMessage); + const onChange = (param: UploadChangeParam) => { + props.onChange?.(normalizeFileList([...param.fileList])); + }; + return { + ...props, + onChange, + }; +} + +export const Upload: ComposedUpload = connect( + (props: UploadProps) => { + return ; + }, + mapProps({ + value: 'fileList', + }), + mapReadPretty((props) => { + const field = useField(); + console.log('field.value', field.value); + return (field.value || []).map((item) => ( +
+ {item.url ? ( + + {item.name} + + ) : ( + {item.name} + )} +
+ )); + }), +); + +const Dragger = connect( + (props: DraggerProps) => { + return ( +
+ +
+ ); + }, + mapProps({ + value: 'fileList', + }), +); + +function toItem(file) { + if (file?.response?.data) { + file = file.response.data; + } + return { + ...file, + id: file.id || file.uid, + title: file.title || file.name, + imageUrl: getImageByUrl(file.url, { + exclude: ['.png', '.jpg', '.jpeg', '.gif'], + }), + }; +} + +function toFileList(fileList: any) { + return toArr(fileList).map(toItem); +} + +function toValue(fileList: any) { + return toArr(fileList) + .filter((file) => !file.response || file.status === 'done') + .map((file) => file?.response?.data || file); +} + +function toMap(fileList: any) { + if (!fileList) { + return []; + } + if (typeof fileList !== 'object') { + return []; + } + let list = fileList; + if (!Array.isArray(fileList)) { + if (Object.keys({ ...fileList }).length === 0) { + return []; + } + list = [fileList]; + } + console.log({ list, fileList }); + return list.map((item) => { + return [item.id || item.uid, toItem(item)]; + }); +} + +const toImages = (fileList) => { + if (!fileList) { + return []; + } + if (typeof fileList !== 'object') { + return []; + } + if (Object.keys(fileList).length === 0) { + return []; + } + let list = fileList; + if (!Array.isArray(fileList) && typeof fileList === 'object') { + list = [fileList]; + } + return list.map((item) => { + return { + ...item, + title: item.title || item.name, + imageUrl: getImageByUrl(item.url, { + exclude: ['.png', '.jpg', '.jpeg', '.gif'], + }), + }; + }); +}; + +Upload.Attachment = connect( + (props: UploadProps) => { + const { disabled, multiple, value, onChange } = props; + const [fileList, setFileList] = useState([]); + const [sync, setSync] = useState(true); + const images = fileList; + const [photoIndex, setPhotoIndex] = useState(0); + const [visible, setVisible] = useState(false); + useEffect(() => { + if (sync) { + setFileList(toFileList(value)); + } + }, [value, sync]); + return ( +
+
+
+ {fileList.map((file) => { + const handleClick = (e) => { + e.preventDefault(); + const index = fileList.indexOf(file); + setVisible(true); + setPhotoIndex(index); + }; + return ( +
+
+ + + +
+
+ ); + })} +
+ { + setSync(false); + if (multiple) { + if (info.file.status === 'done') { + onChange(toValue(info.fileList)); + } + setFileList(info.fileList.map(toItem)); + } else { + if (info.file.status === 'done') { + console.log('field.value', info.file?.response?.data); + // TODO(BUG): object 的联动有问题,不响应,折中的办法先置空再赋值 + onChange(null); + onChange(info.file?.response?.data); + } + setFileList([toItem(info.file)]); + } + }} + showUploadList={false} + > + {!disabled && (multiple || toArr(value).length < 1) && ( + + +
上传 +
+ )} +
+
+
+
+ {visible && ( + setVisible(false)} + onMovePrevRequest={() => + setPhotoIndex((photoIndex + images.length - 1) % images.length) + } + onMoveNextRequest={() => + setPhotoIndex((photoIndex + 1) % images.length) + } + imageTitle={images[photoIndex]?.title} + toolbarButtons={[ + , + ]} + /> + )} +
+ ); + }, + mapReadPretty((props) => { + const field = useField(); + const images = toImages(toArr(field.value)); + const [photoIndex, setPhotoIndex] = useState(0); + const [visible, setVisible] = useState(false); + const { size } = props; + console.log('field.value', field.value, images); + return ( +
+
+
+ {images.map((file) => { + const handleClick = (e) => { + e.preventDefault(); + e.stopPropagation(); + const index = images.indexOf(file); + setVisible(true); + setPhotoIndex(index); + }; + return ( +
+
+ + {size !== 'small' && ( + + +
+
+ ); + })} +
+
+ {visible && ( + { + e.preventDefault(); + e.stopPropagation(); + setVisible(false); + }} + onMovePrevRequest={() => + setPhotoIndex((photoIndex + images.length - 1) % images.length) + } + onMoveNextRequest={() => + setPhotoIndex((photoIndex + 1) % images.length) + } + imageTitle={images[photoIndex]?.title} + toolbarButtons={[ + , + ]} + /> + )} +
+ ); + }), +); + +Upload.Dragger = Dragger; + +export default Upload; diff --git a/packages/client/src/schemas/upload/placeholder.ts b/packages/client/src/schemas/upload/placeholder.ts new file mode 100755 index 0000000000000000000000000000000000000000..7be1a1ee2145683ef03b47910b224ca63f0a9642 --- /dev/null +++ b/packages/client/src/schemas/upload/placeholder.ts @@ -0,0 +1,62 @@ +export const UPLOAD_PLACEHOLDER = [ + { + ext: /\.docx?$/i, + icon: '//img.alicdn.com/tfs/TB1n8jfr1uSBuNjy1XcXXcYjFXa-200-200.png', + }, + { + ext: /\.pptx?$/i, + icon: '//img.alicdn.com/tfs/TB1ItgWr_tYBeNjy1XdXXXXyVXa-200-200.png', + }, + { + ext: /\.jpe?g$/i, + icon: '//img.alicdn.com/tfs/TB1wrT5r9BYBeNjy0FeXXbnmFXa-200-200.png', + }, + { + ext: /\.pdf$/i, + icon: '//img.alicdn.com/tfs/TB1GwD8r9BYBeNjy0FeXXbnmFXa-200-200.png', + }, + { + ext: /\.png$/i, + icon: '//img.alicdn.com/tfs/TB1BHT5r9BYBeNjy0FeXXbnmFXa-200-200.png', + }, + { + ext: /\.eps$/i, + icon: '//img.alicdn.com/tfs/TB1G_iGrVOWBuNjy0FiXXXFxVXa-200-200.png', + }, + { + ext: /\.ai$/i, + icon: '//img.alicdn.com/tfs/TB1B2cVr_tYBeNjy1XdXXXXyVXa-200-200.png', + }, + { + ext: /\.gif$/i, + icon: '//img.alicdn.com/tfs/TB1DTiGrVOWBuNjy0FiXXXFxVXa-200-200.png', + }, + { + ext: /\.svg$/i, + icon: '//img.alicdn.com/tfs/TB1uUm9rY9YBuNjy0FgXXcxcXXa-200-200.png', + }, + { + ext: /\.xlsx?$/i, + icon: '//img.alicdn.com/tfs/TB1any1r1OSBuNjy0FdXXbDnVXa-200-200.png', + }, + { + ext: /\.psd?$/i, + icon: '//img.alicdn.com/tfs/TB1_nu1r1OSBuNjy0FdXXbDnVXa-200-200.png', + }, + { + ext: /\.(wav|aif|aiff|au|mp1|mp2|mp3|ra|rm|ram|mid|rmi)$/i, + icon: '//img.alicdn.com/tfs/TB1jPvwr49YBuNjy0FfXXXIsVXa-200-200.png', + }, + { + ext: /\.(avi|wmv|mpg|mpeg|vob|dat|3gp|mp4|mkv|rm|rmvb|mov|flv)$/i, + icon: '//img.alicdn.com/tfs/TB1FrT5r9BYBeNjy0FeXXbnmFXa-200-200.png', + }, + { + ext: /\.(zip|rar|arj|z|gz|iso|jar|ace|tar|uue|dmg|pkg|lzh|cab)$/i, + icon: '//img.alicdn.com/tfs/TB10jmfr29TBuNjy0FcXXbeiFXa-200-200.png', + }, + { + ext: /\.[^.]+$/i, + icon: '//img.alicdn.com/tfs/TB10.R4r3mTBuNjy1XbXXaMrVXa-200-200.png', + }, +]; diff --git a/packages/client/src/schemas/upload/style.less b/packages/client/src/schemas/upload/style.less new file mode 100644 index 0000000000000000000000000000000000000000..04e6c92f873fbdf2f9e75991c2ecbd533dba61c8 --- /dev/null +++ b/packages/client/src/schemas/upload/style.less @@ -0,0 +1,64 @@ +.nb-file-list { + display: flex; +} +.nb-file-item { +} + +.nb-upload { + .ant-upload-list-item.ant-upload-list-item-list-type-picture-card { + padding: 3px; + } + .ant-upload-list-item-thumbnail { + img { + object-fit: cover; + } + } + .ant-upload-list-item-actions { + left: auto; + right: 4px; + top: 4px; + transform: none; + } + .ant-upload-list-picture-card .ant-upload-list-item-info { + overflow: inherit; + } + .ant-upload-list-picture-card .ant-upload-list-item-name { + display: block; + margin-top: 10px; + font-size: 13px; + color: #636363; + } + .ant-upload-list-picture-card + .ant-upload-list-item:hover + .ant-upload-list-item-info::before { + display: none; + } + .ant-upload-list-picture-card .ant-upload-list-item-progress { + bottom: calc(50% - 11px); + pointer-events: none; + } + .ant-btn { + background: rgba(0, 0, 0, 0.5); + // .anticon { + // color: #1890ff; + // } + } + .ant-upload-list-picture-card-container { + margin-bottom: 28px; + } +} + +.nb-upload-small { + .ant-upload-list-picture-card-container { + margin: 0 3px 3px 0; + height: 32px; + width: 32px; + } + .ant-upload-list-picture-card .ant-upload-list-item-name { + display: none; + } + .ant-upload-list-picture .ant-upload-list-item, + .ant-upload-list-picture-card .ant-upload-list-item { + padding: 1px; + } +} diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json index 261d2d65090fbdc4ec739190d77f6720caac9708..4e64a1f5b274882bc0e5cce42c4ad1db3516e9cb 100644 --- a/packages/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -1,21 +1,7 @@ { + "extends": "../../tsconfig.json", "compilerOptions": { - "lib": [ "es5", "es6" ], - "module": "commonjs", - "target": "es6", - "moduleResolution": "node", - "importHelpers": true, - "jsx": "react", - "esModuleInterop": true, - "sourceMap": true, - "baseUrl": "./", - "strict": true, - "declaration": true, - "paths": { - }, - "allowSyntheticDefaultImports": true - }, - "exclude": [ - "node_modules" - ] + "outDir": "./lib", + "target": "ES6" + } } \ No newline at end of file diff --git a/packages/client/.fatherrc.ts b/packages/create-nocobase-app/.fatherrc.ts similarity index 100% rename from packages/client/.fatherrc.ts rename to packages/create-nocobase-app/.fatherrc.ts diff --git a/packages/plugin-full-collections/.npmignore b/packages/create-nocobase-app/.npmignore similarity index 100% rename from packages/plugin-full-collections/.npmignore rename to packages/create-nocobase-app/.npmignore diff --git a/packages/create-nocobase-app/README.md b/packages/create-nocobase-app/README.md index 449b5843f641c0b46465fa9bb4248a457d05a9c2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100755 --- a/packages/create-nocobase-app/README.md +++ b/packages/create-nocobase-app/README.md @@ -1 +0,0 @@ -# @nocobase/create-nocobase-app diff --git a/packages/create-nocobase-app/package.json b/packages/create-nocobase-app/package.json index 72c79f9598c625b6bc6a33093707042769cda522..df273307b7408ad1cca0b94f201b9adb9669b335 100755 --- a/packages/create-nocobase-app/package.json +++ b/packages/create-nocobase-app/package.json @@ -1,16 +1,27 @@ { "name": "create-nocobase-app", - "version": "0.4.0-alpha.7", - "description": "create-nocobase-app", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "types": "lib/index.d.ts", + "files": [ + "lib", + "bin", + "templates" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/nocobase/nocobase.git", + "directory": "packages/create-nocobase-app" + }, "license": "MIT", - "private": true, - "scripts": {}, "dependencies": { - "@umijs/utils": "3.2.23" + "@umijs/utils": "3.5.17", + "commander": "^8.2.0", + "execa": "^5.1.1", + "ora": "^5.4.1" }, "bin": { "create-nocobase-app": "bin/create-nocobase-app.js" - } + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/create-nocobase-app/src/AppGenerator/AppGenerator.ts b/packages/create-nocobase-app/src/AppGenerator/AppGenerator.ts index cd5a854c3c099e4bf2dbb22958dac65ca3938779..9d5d8f69c845c1df56fa4c480fe9c2978ad79650 100755 --- a/packages/create-nocobase-app/src/AppGenerator/AppGenerator.ts +++ b/packages/create-nocobase-app/src/AppGenerator/AppGenerator.ts @@ -2,11 +2,17 @@ import { Generator } from '@umijs/utils'; import { join } from 'path'; export default class AppGenerator extends Generator { + private tplContext = {}; + + setTplContext(context) { + this.tplContext = context; + } + async writing() { this.copyDirectory({ context: { version: require('../../package').version, - conventionRoutes: this.args.conventionRoutes, + ...this.tplContext }, path: join(__dirname, '../../templates/AppGenerator'), target: this.cwd, diff --git a/packages/create-nocobase-app/src/cli.ts b/packages/create-nocobase-app/src/cli.ts index c4b3d372cd1fc0c8184c43fd0a19d71fe8cb07cd..fed3e0c923db3b956d3ebc8faaeb141e1cfe7918 100755 --- a/packages/create-nocobase-app/src/cli.ts +++ b/packages/create-nocobase-app/src/cli.ts @@ -1,30 +1,107 @@ -import { chalk, yParser } from '@umijs/utils'; -import { existsSync } from 'fs'; -import { join } from 'path'; - -const args = yParser(process.argv.slice(2), { - alias: { - version: ['v'], - help: ['h'], - }, - boolean: ['version'], -}); - -if (args.version && !args._[0]) { - args._[0] = 'version'; - const local = existsSync(join(__dirname, '../.local')) - ? chalk.cyan('@local') - : ''; - const { name, version } = require('../package.json'); - console.log(`${name}@${version}${local}`); -} else { - require('./') - .default({ - cwd: process.cwd(), - args, - }) - .catch((err: Error) => { - console.error(`Create failed, ${err.message}`); - console.error(err); +import { chalk } from '@umijs/utils'; +import commander from 'commander'; +import path from 'path'; +import ora from 'ora'; +import { hasYarn, runInit, runInstall, runStart } from './utils'; +import execa from 'execa'; + +const packageJson = require('../package.json'); + +const program = new commander.Command(packageJson.name) + .version(packageJson.version) + .option('--simple', 'create nocobase app without install dependencies') + .option('--quickstart', 'create quickstart nocobase app') + .arguments('') + .usage(`${chalk.green('')}`) + .action(async (directory, options) => { + console.log( + `Creating a new Nocobase application at ${chalk.green(directory)}.`, + ); + console.log('Creating files.'); + + const fullPath = path.join(process.cwd(), directory); + + await require('./index').default({ + cwd: fullPath, + args: {}, + tplContext: options.quickstart + ? { quickstart: true } + : { quickstart: false }, }); -} + + const cmd = chalk.cyan(hasYarn() ? 'yarn' : 'npm run'); + + if (options.simple) { + console.log(); + console.log('Done. You can start by doing:'); + console.log(); + console.log(` ${chalk.cyan('cd')} ${directory}`); + console.log(` ${cmd} install`); + console.log(` ${cmd} nocobase init${hasYarn() ? '' : ' --'} --import-demo`); + console.log(` ${cmd} start`); + console.log(); + return; + } + + const installPrefix = chalk.yellow('Installing dependencies:'); + const loader = ora(installPrefix).start(); + const logInstall = (chunk = '') => { + loader.text = `${installPrefix} ${chunk + .toString() + .split('\n') + .join(' ')}`; + }; + + const runner = runInstall(fullPath); + + runner?.stdout?.on('data', logInstall); + runner?.stderr?.on('data', logInstall); + + await runner; + loader.stop(); + console.log(`Dependencies installed ${chalk.green('successfully')}.`); + console.log(); + console.log(`Your application was created at ${chalk.green(directory)}.\n`); + + if (options.quickstart) { + // Using Sqlite as Database + const prefix = chalk.yellow('Nocobase init'); + const initLoader = ora(prefix).start(); + + try { + const initLog = (chunk = '') => { + initLoader.text = `${prefix} ${chunk + .toString() + .split('\n') + .join(' ')}`; + }; + + const init = runInit(fullPath); + init.stderr.on('data', initLog); + init.stdout.on('data', initLog); + await init; + initLoader.stop(); + } catch (e) { + initLoader.stop(); + console.log(); + console.log(e.message); + process.exit(1); + } + + console.log(`Running your application.`); + await execa('npm', ['run', 'start'], { + stdio: 'inherit', + cwd: fullPath, + }); + } else { + console.log(); + console.log('You can start by doing:'); + console.log(); + console.log(` ${chalk.cyan('cd')} ${directory}`); + console.log(` ${cmd} nocobase init${hasYarn() ? '' : ' --'} --import-demo`); + console.log(` ${cmd} start`); + console.log(); + } + }) + .showHelpAfterError() + .parse(process.argv); diff --git a/packages/create-nocobase-app/src/index.test.ts b/packages/create-nocobase-app/src/index.test.ts index 2afcb8ba48027c83badce385b3ad7b6076dc53d6..70aab0bc2475553e986096662b00e4838d10c91e 100755 --- a/packages/create-nocobase-app/src/index.test.ts +++ b/packages/create-nocobase-app/src/index.test.ts @@ -1,6 +1,6 @@ -import { join } from 'path'; import { rimraf } from '@umijs/utils'; import { existsSync } from 'fs'; +import { join } from 'path'; import runGenerator from './index'; const fixtures = join(__dirname, 'fixtures'); diff --git a/packages/create-nocobase-app/src/index.ts b/packages/create-nocobase-app/src/index.ts index e79f1f6a5436380af5145a7c6bfc1d8b3c367810..e7c60642134e5875bdd14543f31d139a8d29278c 100755 --- a/packages/create-nocobase-app/src/index.ts +++ b/packages/create-nocobase-app/src/index.ts @@ -4,13 +4,17 @@ import AppGenerator from './AppGenerator/AppGenerator'; export default async ({ cwd, args, + tplContext }: { cwd: string; args: yargs.Arguments; + tplContext: object }) => { const generator = new AppGenerator({ cwd, args, }); + + generator.setTplContext(tplContext); await generator.run(); }; diff --git a/packages/create-nocobase-app/src/utils/index.ts b/packages/create-nocobase-app/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8a74c79126b1aeb4da828a0a6390f2e1bdb7bf8 --- /dev/null +++ b/packages/create-nocobase-app/src/utils/index.ts @@ -0,0 +1,28 @@ +import execa from 'execa'; + +export function hasYarn() { + return (process.env.npm_config_user_agent || '').indexOf('yarn') === 0; +} + +function runYarn(path: string, args: string[]) { + if (hasYarn()) { + return execa('yarn', args, { + cwd: path, + stdin: 'ignore', + }); + } + + return execa('npm', args, { cwd: path, stdin: 'ignore' }); +} + +export function runInstall(path) { + return runYarn(path, ['install']); +} + +export function runStart(path) { + return runYarn(path, ['run', 'start']); +} + +export function runInit(path) { + return runYarn(path, ['run', 'nocobase', 'init', hasYarn() ? '--import-demo' : '-- --import-demo']); +} diff --git a/packages/create-nocobase-app/templates/AppGenerator/.env b/packages/create-nocobase-app/templates/AppGenerator/.env deleted file mode 100644 index 6bc6efc8b450cefc190985fb947e2b3c40b949b8..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/.env +++ /dev/null @@ -1,14 +0,0 @@ -API_PORT=23000 - -DB_DATABASE=test -DB_USER=test -DB_PASSWORD=test -# DB_HOST=mysql -# DB_PORT=3306 -# DB_DIALECT=mysql - -DB_HOST=postgres -DB_PORT=5432 -DB_DIALECT=postgres -# DB_PORT=25432 -# DB_HOST=localhost diff --git a/packages/create-nocobase-app/templates/AppGenerator/.env.example b/packages/create-nocobase-app/templates/AppGenerator/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..a39aab1796552108673097fbd3bcc0e5f970cb44 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/.env.example @@ -0,0 +1,44 @@ +########## DOCKER COMPOSE ENV ########## +ADMINER_PORT=8080 +DB_MYSQL_PORT=3306 +DB_POSTGRES_PORT=5432 +VERDACCIO_PORT=4873 +APP_PORT=13001 +API_PORT=13002 + +########## NOCOBASE ENV ########## + +# DATABASE +DB_DIALECT=sqlite +DB_STORAGE=db.sqlite + +# DB_DIALECT=postgres +# DB_HOST=localhost +# DB_PORT=5432 +# DB_DATABASE=nocobase +# DB_USER=nocobase +# DB_PASSWORD=nocobase + +# set to 'on' to enable log +DB_LOG_SQL= + +# ADMIN USER (Initialization only) + +ADMIN_EMAIL=admin@nocobase.com +ADMIN_PASSWORD=admin + +# STORAGE (Initialization only) + +# local or ali-oss +STORAGE_TYPE=local + +# LOCAL STORAGE +LOCAL_STORAGE_USE_STATIC_SERVER=true +LOCAL_STORAGE_BASE_URL=http://localhost:13002 + +# ALI OSS STORAGE +ALI_OSS_STORAGE_BASE_URL= +ALI_OSS_REGION=oss-cn-beijing +ALI_OSS_ACCESS_KEY_ID= +ALI_OSS_ACCESS_KEY_SECRET= +ALI_OSS_BUCKET= diff --git a/packages/create-nocobase-app/templates/AppGenerator/.env.tpl b/packages/create-nocobase-app/templates/AppGenerator/.env.tpl new file mode 100644 index 0000000000000000000000000000000000000000..f8ae03ddde740bf20d424886e72a3203b072d8a3 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/.env.tpl @@ -0,0 +1,44 @@ +########## DOCKER COMPOSE ENV ########## +ADMINER_PORT=8080 +DB_MYSQL_PORT=3306 +DB_POSTGRES_PORT=5432 +VERDACCIO_PORT=4873 +APP_PORT=13001 +API_PORT=13002 + +########## NOCOBASE ENV ########## + +# DATABASE +DB_DIALECT=sqlite +DB_STORAGE=db.sqlite + +# DB_DIALECT=postgres +# DB_HOST=localhost +# DB_PORT=5432 +# DB_DATABASE=nocobase +# DB_USER=nocobase +# DB_PASSWORD=nocobase + +# set to 'on' to enable log +DB_LOG_SQL= + +# ADMIN USER (Initialization only) + +ADMIN_EMAIL=admin@nocobase.com +ADMIN_PASSWORD=admin123 + +# STORAGE (Initialization only) + +# local or ali-oss +STORAGE_TYPE=local + +# LOCAL STORAGE +LOCAL_STORAGE_USE_STATIC_SERVER=true +LOCAL_STORAGE_BASE_URL=http://localhost:13002 + +# ALI OSS STORAGE +ALI_OSS_STORAGE_BASE_URL= +ALI_OSS_REGION=oss-cn-beijing +ALI_OSS_ACCESS_KEY_ID= +ALI_OSS_ACCESS_KEY_SECRET= +ALI_OSS_BUCKET= diff --git a/packages/create-nocobase-app/templates/AppGenerator/.fatherrc.ts b/packages/create-nocobase-app/templates/AppGenerator/.fatherrc.ts deleted file mode 100755 index 491de68f67457a6c9e36c0ff843973f2f9600b05..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/.fatherrc.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default { - entry: 'src/api', - target: 'node', - cjs: { type: 'babel', lazy: true }, - include: 'api/*', - disableTypeCheck: true, - // pkgs: [ - // 'api', - // ], -}; diff --git a/packages/create-nocobase-app/templates/AppGenerator/.gitignore.tpl b/packages/create-nocobase-app/templates/AppGenerator/.gitignore old mode 100755 new mode 100644 similarity index 95% rename from packages/create-nocobase-app/templates/AppGenerator/.gitignore.tpl rename to packages/create-nocobase-app/templates/AppGenerator/.gitignore index bee1cf61ce749bc0d6ad0509e15d900cc72b7b3a..821479b4855ef5666f33dde04d6112678d2d4bee --- a/packages/create-nocobase-app/templates/AppGenerator/.gitignore.tpl +++ b/packages/create-nocobase-app/templates/AppGenerator/.gitignore @@ -17,4 +17,4 @@ /src/.umi /src/.umi-production /src/.umi-test -/.env.local +/.env.local \ No newline at end of file diff --git a/packages/create-nocobase-app/templates/AppGenerator/.prettierignore b/packages/create-nocobase-app/templates/AppGenerator/.prettierignore old mode 100755 new mode 100644 diff --git a/packages/create-nocobase-app/templates/AppGenerator/.prettierrc b/packages/create-nocobase-app/templates/AppGenerator/.prettierrc old mode 100755 new mode 100644 diff --git a/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts b/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts new file mode 100644 index 0000000000000000000000000000000000000000..ed96bdd56f4f5a95396b5b43d1eb88c6f51c9671 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts @@ -0,0 +1,36 @@ +import { defineConfig } from 'umi'; +import dotenv from 'dotenv'; +import path from 'path'; + +dotenv.config({ + path: path.resolve(__dirname, './.env'), +}); + +process.env.MFSU_AD = 'none'; + +export default defineConfig({ + favicon: '/favicon.png', + nodeModulesTransform: { + type: 'none', + }, + define: { + 'process.env.API_URL': process.env.API_URL || `/api/`, + 'process.env.API_PORT': process.env.API_PORT || '13001', + }, + proxy: { + '/api': { + target: `http://localhost:${process.env.API_PORT || '13001'}/`, + changeOrigin: true, + pathRewrite: { '^/api': '/api' }, + }, + }, + routes: [{ path: '/', exact: false, component: '@/pages/index' }], + fastRefresh: {}, + locale: { + default: 'zh-CN', + // antd: false, + // title: false, + baseNavigator: false, + baseSeparator: '-', + }, +}); diff --git a/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts.tpl b/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts.tpl deleted file mode 100755 index 226c48b20d6d5e775e35a313ad95804284acb9d3..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/.umirc.ts.tpl +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'umi'; - -export default defineConfig({ - nodeModulesTransform: { - type: 'none', - }, -{{ ^conventionRoutes }} - routes: [ - { path: '/', component: '@/pages/index' }, - ], -{{ /conventionRoutes }} -}); diff --git a/packages/create-nocobase-app/templates/AppGenerator/Dockerfile b/packages/create-nocobase-app/templates/AppGenerator/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..29dff2d8aa727687d3ab2777d9a8fbb93550266c --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/Dockerfile @@ -0,0 +1,21 @@ +FROM node:12.20.0-stretch + +WORKDIR /app +# COPY . /app +RUN ls -a + +RUN npm config set registry https://registry.npm.taobao.org +RUN yarn config set registry https://registry.npm.taobao.org + +# RUN npm install +# RUN npm run bootstrap +# RUN npm run build + +# # Install app dependencies +# ENV NPM_CONFIG_LOGLEVEL warn +# RUN yarn install + +# # Show current folder structure in logs +# RUN ls -a + +# CMD [ "npm", "run", "serve" ] diff --git a/packages/create-nocobase-app/templates/AppGenerator/README.md b/packages/create-nocobase-app/templates/AppGenerator/README.md old mode 100755 new mode 100644 index e521300a000ee6304a64bc031fdc608ad680223f..02c3f4aa8181c08ccfb39f0abbecb1de52e29fbf --- a/packages/create-nocobase-app/templates/AppGenerator/README.md +++ b/packages/create-nocobase-app/templates/AppGenerator/README.md @@ -1,15 +1,9 @@ -# NocoBase Application +# NocoBase ## Getting Started -Install dependencies, - -```bash -$ yarn install -``` - -Start the dev server, - ```bash -$ yarn start +yarn install +yarn nocobase init +yarn start ``` diff --git a/packages/create-nocobase-app/templates/AppGenerator/docker-compose.yml b/packages/create-nocobase-app/templates/AppGenerator/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..cae60db90b8ec7b2e429ff3b5a7f31179c733d5b --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/docker-compose.yml @@ -0,0 +1,37 @@ +version: "3" +networks: + nocobase: + driver: bridge +services: + adminer: + image: adminer + restart: always + networks: + - nocobase + ports: + - ${ADMINER_PORT}:8080 + postgres: + image: postgres:10 + restart: always + ports: + - "${DB_POSTGRES_PORT}:5432" + networks: + - nocobase + command: postgres -c wal_level=logical + environment: + POSTGRES_USER: ${DB_USER} + POSTGRES_DB: ${DB_DATABASE} + POSTGRES_PASSWORD: ${DB_PASSWORD} + nocobase: + build: + context: . + dockerfile: Dockerfile + networks: + - nocobase + command: [ "yarn", "nocobase", "start", "--port", "8000" ] + working_dir: /app + env_file: ./.env + volumes: + - ./:/app + ports: + - "${APP_PORT}:8000" diff --git a/packages/create-nocobase-app/templates/AppGenerator/nodemon.json b/packages/create-nocobase-app/templates/AppGenerator/nodemon.json deleted file mode 100644 index 36d1db80903d7fdfd20ad93147c953a3ddd922b7..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/nodemon.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "watch": ["src/api", ".env"], - "ext": "ts", - "exec": "ts-node ./src/api/index.ts" -} \ No newline at end of file diff --git a/packages/create-nocobase-app/templates/AppGenerator/package.json.tpl b/packages/create-nocobase-app/templates/AppGenerator/package.json.tpl old mode 100755 new mode 100644 index 3af91e0a69a29fbe7802e9bd1013497782e88a22..b535cf04f60f913da4cd08f70744840bcc4716b4 --- a/packages/create-nocobase-app/templates/AppGenerator/package.json.tpl +++ b/packages/create-nocobase-app/templates/AppGenerator/package.json.tpl @@ -1,9 +1,16 @@ { + "name": "nocobase-app", "private": true, "scripts": { - "start": "concurrently \"nodemon\" \"umi dev\"", - "build": "father-build && umi build", - "postinstall": "umi generate tmp", + "start": "concurrently \"npm run start-server\" \"umi dev\"", + "start-client": "umi dev", + "start-server": "ts-node-dev -r dotenv/config --project tsconfig.apis.json ./src/apis/index.ts", + "nocobase": "ts-node -r dotenv/config --project tsconfig.apis.json ./src/apis/index.ts", + "serve": "node -r dotenv/config ./lib/apis/index.js", + "build": "npm run build-server && npm run build-client", + "build-client": "umi build", + "build-server": "rimraf -rf lib && tsc --project tsconfig.apis.json", + "postinstall": "node ./umi.js generate tmp", "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", "test": "umi-test", "test:coverage": "umi-test --coverage" @@ -20,20 +27,37 @@ ] }, "dependencies": { - "@ant-design/pro-layout": "^5.0.12", - "@umijs/preset-react": "1.x", - "@umijs/test": "^3.2.23", - "@nocobase/server": "^{{{ version }}}", - "@nocobase/client": "^{{{ version }}}", - "@nocobase/father-build": "^{{{ version }}}", + "sqlite3": "https://github.com/mapbox/node-sqlite3/tarball/master", + "@nocobase/plugin-action-logs": "^{{{ version }}}", + "@nocobase/plugin-china-region": "^{{{ version }}}", + "@nocobase/plugin-client": "^{{{ version }}}", "@nocobase/plugin-collections": "^{{{ version }}}", + "@nocobase/plugin-export": "^{{{ version }}}", + "@nocobase/plugin-file-manager": "^{{{ version }}}", + "@nocobase/plugin-multi-apps": "^{{{ version }}}", + "@nocobase/plugin-permissions": "^{{{ version }}}", + "@nocobase/plugin-system-settings": "^{{{ version }}}", + "@nocobase/plugin-ui-router": "^{{{ version }}}", + "@nocobase/plugin-ui-schema": "^{{{ version }}}", + "@nocobase/plugin-users": "^{{{ version }}}", + "@nocobase/server": "^{{{ version }}}" + }, + "devDependencies": { + "@nocobase/client": "^{{{ version }}}", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@umijs/preset-react": "1.x", + "@umijs/test": "^3.4.15", "concurrently": "^5.3.0", - "lint-staged": "^10.0.7", - "nodemon": "^2.0.6", - "prettier": "^1.19.1", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "umi": "^3.2.23", + "cross-env": "^7.0.3", + "micromark": "~2.11.0", + "mockjs": "^1.1.0", + "prettier": "^2.2.0", + "react": "17.x", + "react-dom": "17.x", + "ts-node-dev": "^1.1.8", + "typescript": "4.1.5", + "umi": "^3.0.0", "yorkie": "^2.0.0" } } diff --git a/packages/create-nocobase-app/templates/AppGenerator/public/favicon.png b/packages/create-nocobase-app/templates/AppGenerator/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f80966cc72f29b2100440fd0fcc3a329b76307dd Binary files /dev/null and b/packages/create-nocobase-app/templates/AppGenerator/public/favicon.png differ diff --git a/packages/create-nocobase-app/templates/AppGenerator/server.js b/packages/create-nocobase-app/templates/AppGenerator/server.js deleted file mode 100644 index 549072ca84ab66a77432c70ef533901a5a287656..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/server.js +++ /dev/null @@ -1,7 +0,0 @@ -const api = require('@nocobase/api'); - -require('dotenv').config(); - -api.listen(23000, () => { - console.log('http://localhost:23000/'); -}); diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/api/index.ts b/packages/create-nocobase-app/templates/AppGenerator/src/api/index.ts deleted file mode 100644 index f0babd3587c138949e194f06d3043a24368b040e..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/templates/AppGenerator/src/api/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Api from '@nocobase/server'; -import dotenv from 'dotenv'; - -const sync = { - force: true, - alter: { - drop: true, - }, -}; - -dotenv.config(); - -const api = Api.create({ - database: { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.platform === 'linux' ? process.env.DB_HOST : 'localhost', - port: process.platform === 'linux' ? process.env.DB_PORT : ( process.env.DB_DIALECT == 'postgres' ? 25432 : 23306 ), - dialect: process.env.DB_DIALECT as any, - dialectOptions: { - charset: 'utf8mb4', - collate: 'utf8mb4_unicode_ci', - }, - // logging: false, - define: {}, - sync, - }, - resourcer: { - prefix: '/api', - }, -}); - -api - .plugins([ - [require('@nocobase/plugin-collections').default, {}], - ]) - .then(() => { - api.listen(23001, () => { - console.log('http://localhost:23001/'); - }); - }); diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/apis/config/db.ts b/packages/create-nocobase-app/templates/AppGenerator/src/apis/config/db.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ff54d38ebd0fadb4271fedc33afa78d6c0f6416 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/src/apis/config/db.ts @@ -0,0 +1,32 @@ +import path from 'path'; +import { DatabaseOptions } from '@nocobase/database'; + +export default { + sqlite: { + dialect: 'sqlite', + dialectModule: require('sqlite3'), + storage: process.env.DB_STORAGE || path.resolve(process.cwd(), './db.sqlite'), + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + }, + postgres: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: 'postgres', + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + sync: { + force: false, + alter: { + drop: false, + }, + }, + }, +} as { + [key: string]: DatabaseOptions, +}; diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/apis/index.ts b/packages/create-nocobase-app/templates/AppGenerator/src/apis/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6839c44cc7a7ea4cd9ca8266303fd1c575acff63 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/src/apis/index.ts @@ -0,0 +1,43 @@ +import path from 'path'; +import Application from '@nocobase/server'; +import dbConfig from './config/db'; + +const start = Date.now(); + +const api = new Application({ + database: dbConfig[process.env.DB_DIALECT || 'sqlite'], + resourcer: { + prefix: '/api', + }, +}); + +const plugins = [ + '@nocobase/plugin-ui-router', + '@nocobase/plugin-ui-schema', + '@nocobase/plugin-collections', + '@nocobase/plugin-users', + '@nocobase/plugin-action-logs', + '@nocobase/plugin-file-manager', + '@nocobase/plugin-permissions', + '@nocobase/plugin-export', + '@nocobase/plugin-system-settings', + '@nocobase/plugin-china-region', +]; + +for (const plugin of plugins) { + api.plugin(require(`${plugin}/lib/server`).default); +} + +api.plugin(require(`@nocobase/plugin-client/lib/server`).default, { + dist: path.resolve(process.cwd(), './dist'), + // importDemo: true, +}); + +if (process.argv.length < 3) { + // @ts-ignore + process.argv.push('start', '--port', process.env.API_PORT || '13001'); +} + +api.parse(process.argv).then(() => { + console.log(`Start-up time: ${(Date.now() - start) / 1000}s`); +}); diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/app.ts b/packages/create-nocobase-app/templates/AppGenerator/src/app.ts new file mode 100644 index 0000000000000000000000000000000000000000..817ee6ce324f975d238511894cf3c8286e9541a4 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/src/app.ts @@ -0,0 +1 @@ +import './css_browser_selector'; diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/css_browser_selector.js b/packages/create-nocobase-app/templates/AppGenerator/src/css_browser_selector.js new file mode 100644 index 0000000000000000000000000000000000000000..bf0a0f1431256c1c4505202579bdd43beed08e7d --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/src/css_browser_selector.js @@ -0,0 +1,163 @@ +/* +CSS Browser Selector 0.6.3 +Originally written by Rafael Lima (http://rafael.adm.br) +http://rafael.adm.br/css_browser_selector +License: http://creativecommons.org/licenses/by/2.5/ +Co-maintained by: +https://github.com/verbatim/css_browser_selector +*/ + +showLog=true; +function log(m) {if ( window.console && showLog ) {console.log(m); } } + +function css_browser_selector(u) { + var uaInfo = {}, + screens = [320, 480, 640, 768, 1024, 1152, 1280, 1440, 1680, 1920, 2560], + allScreens = screens.length, + ua=u.toLowerCase(), + is=function(t) { return RegExp(t,"i").test(ua); }, + version = function(p,n) + { + n=n.replace(".","_"); var i = n.indexOf('_'), ver=""; + while (i>0) {ver += " "+ p+n.substring(0,i);i = n.indexOf('_', i+1);} + ver += " "+p+n; return ver; + }, + g='gecko', + w='webkit', + c='chrome', + f='firefox', + s='safari', + o='opera', + m='mobile', + a='android', + bb='blackberry', + lang='lang_', + dv='device_', + html=document.documentElement, + b= [ + + // browser + ((!(/opera|webtv/i.test(ua))&&/msie\s(\d+)/.test(ua)||(/trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.test(ua))))?('ie ie'+(/trident\/4\.0/.test(ua) ? '8' : RegExp.$1 == '11.0'?'11':RegExp.$1)) + :is('firefox/')?g+ " " + f+(/firefox\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+f+RegExp.$2 + ' '+f+RegExp.$2+"_"+RegExp.$4:'') + :is('gecko/')?g + :is('opera')?o+(/version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+o+RegExp.$2 + ' '+o+RegExp.$2+"_"+RegExp.$4 : (/opera(\s|\/)(\d+)\.(\d+)/.test(ua)?' '+o+RegExp.$2+" "+o+RegExp.$2+"_"+RegExp.$3:'')) + :is('konqueror')?'konqueror' + + :is('blackberry') ? + ( bb + + ( /Version\/(\d+)(\.(\d+)+)/i.test(ua) + ? " " + bb+ RegExp.$1 + " "+bb+ RegExp.$1+RegExp.$2.replace('.','_') + : (/Blackberry ?(([0-9]+)([a-z]?))[\/|;]/gi.test(ua) + ? ' ' +bb+RegExp.$2 + (RegExp.$3?' ' +bb+RegExp.$2+RegExp.$3:'') + : '') + ) + ) // blackberry + + :is('android') ? + ( a + + ( /Version\/(\d+)(\.(\d+))+/i.test(ua) + ? " " + a+ RegExp.$1 + " "+a+ RegExp.$1+RegExp.$2.replace('.','_') + : '') + + (/Android (.+); (.+) Build/i.test(ua) + ? ' '+dv+( (RegExp.$2).replace(/ /g,"_") ).replace(/-/g,"_") + :'' ) + ) //android + + :is('chrome')?w+ ' '+c+(/chrome\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+c+RegExp.$2 +((RegExp.$4>0) ? ' '+c+RegExp.$2+"_"+RegExp.$4:''):'') + + :is('iron')?w+' iron' + + :is('applewebkit/') ? + ( w+ ' '+ s + + ( /version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua) + ? ' '+ s +RegExp.$2 + " "+s+ RegExp.$2+RegExp.$3.replace('.','_') + : ( / Safari\/(\d+)/i.test(ua) + ? + ( (RegExp.$1=="419" || RegExp.$1=="417" || RegExp.$1=="416" || RegExp.$1=="412" ) ? ' '+ s + '2_0' + : RegExp.$1=="312" ? ' '+ s + '1_3' + : RegExp.$1=="125" ? ' '+ s + '1_2' + : RegExp.$1=="85" ? ' '+ s + '1_0' + : '' ) + :'') + ) + ) //applewebkit + + :is('mozilla/')?g + :'' + + // mobile + ,is("android|mobi|mobile|j2me|iphone|ipod|ipad|blackberry|playbook|kindle|silk")?m:'' + + // os/platform + ,is('j2me')?'j2me' + :is('ipad|ipod|iphone')? + ( + ( + /CPU( iPhone)? OS (\d+[_|\.]\d+([_|\.]\d+)*)/i.test(ua) ? + 'ios' + version('ios',RegExp.$2) : '' + ) + ' ' + ( /(ip(ad|od|hone))/gi.test(ua) ? RegExp.$1 : "" ) + ) //'iphone' + //:is('ipod')?'ipod' + //:is('ipad')?'ipad' + :is('playbook')?'playbook' + :is('kindle|silk')?'kindle' + :is('playbook')?'playbook' + :is('mac')?'mac'+ (/mac os x ((\d+)[.|_](\d+))/.test(ua) ? ( ' mac' + (RegExp.$2) + ' mac' + (RegExp.$1).replace('.',"_") ) : '' ) + :is('win')?'win'+ + (is('windows nt 6.2')?' win8' + :is('windows nt 6.1')?' win7' + :is('windows nt 6.0')?' vista' + :is('windows nt 5.2') || is('windows nt 5.1') ? ' win_xp' + :is('windows nt 5.0')?' win_2k' + :is('windows nt 4.0') || is('WinNT4.0') ?' win_nt' + : '' + ) + :is('freebsd')?'freebsd' + :(is('x11|linux'))?'linux' + :'' + + // user agent language + ,(/[; |\[](([a-z]{2})(\-[a-z]{2})?)[)|;|\]]/i.test(ua))?(lang+RegExp.$2).replace("-","_")+(RegExp.$3!=''?(' '+lang+RegExp.$1).replace("-","_"):''):'' + + // beta: test if running iPad app + ,( is('ipad|iphone|ipod') && !is('safari') ) ? 'ipad_app' : '' + + + ]; // b + + console.debug(ua); + + function screenSize() { + var w = window.outerWidth || html.clientWidth; + var h = window.outerHeight || html.clientHeight; + uaInfo.orientation = ((w=0;i--) { if (w >= screens[i] ) { uaInfo.maxw = screens[i]; break; }} + widthClasses=""; + for (var info in uaInfo) { widthClasses+=" "+info+"_"+ uaInfo[info] }; + html.className = ( html.className +widthClasses ); + return widthClasses; + } // screenSize + + window.onresize = screenSize; + screenSize(); + + function retina(){ + var r = window.devicePixelRatio > 1; + if (r) { + html.className+=' retina'; + } + else { + html.className+=' non-retina'; + } + } + retina(); + + var cssbs = (b.join(' ')) + " js "; + html.className = ( cssbs + html.className.replace(/\b(no[-|_]?)?js\b/g,"") ).replace(/^ /, "").replace(/ +/g," "); + + return cssbs; +} + +css_browser_selector(navigator.userAgent); \ No newline at end of file diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/global.less b/packages/create-nocobase-app/templates/AppGenerator/src/global.less new file mode 100644 index 0000000000000000000000000000000000000000..1412bdf030f66750c4f2e27d1a95b6bc150cdd88 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/src/global.less @@ -0,0 +1,27 @@ +.win { + /* width */ + ::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + /* Track */ + ::-webkit-scrollbar-track { + background: #f1f1f1; + } + + /* Handle */ + ::-webkit-scrollbar-thumb { + background: #c0c0c0; + border-radius: 4px; + } + + /* Handle on hover */ + ::-webkit-scrollbar-thumb:hover { + background: #a8a8a8; + } + + .rc-virtual-list-scrollbar-thumb { + background: #c0c0c0 !important; + } +} diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.less b/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.less old mode 100755 new mode 100644 index fd9812c34fb3217832efa4e965d8b39ed92abf65..586302bfc88f61d7d5e9d2362bf9c67a5a7ef4ce --- a/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.less +++ b/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.less @@ -1,7 +1,3 @@ - -.normal { -} - .title { background: rgb(121, 242, 157); } diff --git a/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.tsx b/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.tsx old mode 100755 new mode 100644 index 9171ffc4039f477d2b396be0adbb532707c769b1..0f4a453987d789266d15cfb5532763410c1895b3 --- a/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.tsx +++ b/packages/create-nocobase-app/templates/AppGenerator/src/pages/index.tsx @@ -1,10 +1,65 @@ -import React from 'react'; -import styles from './index.less'; +import 'antd/dist/antd.css'; +import { useRequest } from 'ahooks'; +import { Spin } from 'antd'; +import React, { useMemo } from 'react'; +import { MemoryRouter as Router } from 'react-router-dom'; +import { + createRouteSwitch, + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + ConfigProvider, + ClientSDK, +} from '@nocobase/client'; +import { extend } from 'umi-request'; + +console.log(`${location.protocol}//${location.hostname}:${location.port}/api/`); + +const request = extend({ + prefix: `${location.protocol}//${location.hostname}:${location.port}/api/`, + timeout: 30000, +}); + +request.use(async (ctx, next) => { + const { headers } = ctx.req.options as any; + const token = localStorage.getItem('NOCOBASE_TOKEN'); + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + headers['X-Hostname'] = window.location.hostname; + await next(); +}); + +const client = new ClientSDK({ request }); + +const RouteSwitch = createRouteSwitch({ + components: { + AdminLayout, + AuthLayout, + RouteSchemaRenderer, + }, +}); + +const App = () => { + const { data, loading } = useRequest('routes:getAccessible', { + formatResult: (result) => result?.data, + }); + + if (loading) { + return ; + } -export default () => { return (
-

Page index

+
); +}; + +export default function IndexPage() { + return ( + + + + ); } diff --git a/packages/create-nocobase-app/templates/AppGenerator/tsconfig.apis.json b/packages/create-nocobase-app/templates/AppGenerator/tsconfig.apis.json new file mode 100644 index 0000000000000000000000000000000000000000..a571c5824d04a28bad41a8745155ed6e96898d16 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/tsconfig.apis.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", + "jsx": "react", + "module": "commonjs", + "target": "ES6", + "allowJs": false, + "noUnusedLocals": false, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "declaration": true, + "experimentalDecorators": true, + "downlevelIteration": true, + "baseUrl": ".", + "outDir": "./lib/apis", + "paths": { + } + }, + "include": [ + "src/apis", + ] +} diff --git a/packages/create-nocobase-app/templates/AppGenerator/tsconfig.json b/packages/create-nocobase-app/templates/AppGenerator/tsconfig.json old mode 100755 new mode 100644 index 9c54bd9698715edf19dfdf8eb4e084dd9c2f1e90..bc5250b036870fa314635bff63ce6126c2dc3e45 --- a/packages/create-nocobase-app/templates/AppGenerator/tsconfig.json +++ b/packages/create-nocobase-app/templates/AppGenerator/tsconfig.json @@ -1,11 +1,10 @@ { "compilerOptions": { - "lib": [ "es5", "es6" ], - "module": "commonjs", - "target": "es6", + "target": "esnext", + "module": "esnext", "moduleResolution": "node", "importHelpers": true, - "jsx": "react", + "jsx": "react-jsx", "esModuleInterop": true, "sourceMap": true, "baseUrl": "./", @@ -22,5 +21,16 @@ "config/**/*", ".umirc.ts", "typings.d.ts" + ], + "exclude": [ + "node_modules", + "lib", + "es", + "dist", + "typings", + "**/__test__", + "test", + "docs", + "tests" ] } diff --git a/packages/create-nocobase-app/templates/AppGenerator/typings.d.ts b/packages/create-nocobase-app/templates/AppGenerator/typings.d.ts old mode 100755 new mode 100644 index 5df84ee02abf7079c2d9a2e6df692f8163009849..06c8a5b8ca65ba7fb618c40835e67afeba0bbe72 --- a/packages/create-nocobase-app/templates/AppGenerator/typings.d.ts +++ b/packages/create-nocobase-app/templates/AppGenerator/typings.d.ts @@ -1,8 +1,10 @@ declare module '*.css'; declare module '*.less'; -declare module "*.png"; +declare module '*.png'; declare module '*.svg' { - export function ReactComponent(props: React.SVGProps): React.ReactElement - const url: string - export default url + export function ReactComponent( + props: React.SVGProps, + ): React.ReactElement; + const url: string; + export default url; } diff --git a/packages/create-nocobase-app/templates/AppGenerator/umi.js b/packages/create-nocobase-app/templates/AppGenerator/umi.js new file mode 100644 index 0000000000000000000000000000000000000000..8a37a191b875c1fa7332ef31b31edd06a40a0106 --- /dev/null +++ b/packages/create-nocobase-app/templates/AppGenerator/umi.js @@ -0,0 +1,22 @@ +#!/usr/bin/env node + +try { + require.resolve('umi'); + + require('v8-compile-cache'); + + const resolveCwd = require('@umijs/deps/compiled/resolve-cwd'); + + const { name, bin } = require('umi/package.json'); + const localCLI = resolveCwd.silent(`${name}/${bin['umi']}`); + if (!process.env.USE_GLOBAL_UMI && localCLI && localCLI !== __filename) { + const debug = require('@umijs/utils').createDebug('umi:cli'); + debug('Using local install of umi'); + require(localCLI); + } else { + require('umi/lib/cli'); + } + +} catch (error) { + console.log('done') +} diff --git a/packages/create-nocobase-app/tsconfig.json b/packages/create-nocobase-app/tsconfig.json deleted file mode 100644 index 0843093a631903f8e25a8accfb9ec82e32443b20..0000000000000000000000000000000000000000 --- a/packages/create-nocobase-app/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "lib": [ "es5", "es6" ], - "module": "commonjs", - "target": "es6", - "allowJs": true, - "declaration": false, - "resolveJsonModule": true, - "esModuleInterop": true, - "sourceMap": false, - "baseUrl": "./", - "paths": { - } - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/packages/database-next/package.json b/packages/database-next/package.json new file mode 100644 index 0000000000000000000000000000000000000000..64512dc988833bcf0925137c9236d2e955ed8ca1 --- /dev/null +++ b/packages/database-next/package.json @@ -0,0 +1,22 @@ +{ + "name": "@nocobase/database-next", + "version": "0.5.0-alpha.25", + "private": true, + "description": "", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "license": "MIT", + "scripts": {}, + "dependencies": { + "bcrypt": "^5.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.6", + "sequelize": "^6.3.3" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nocobase/nocobase.git", + "directory": "packages/database" + }, + "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" +} diff --git a/packages/database-next/src/__tests__/fields/belongs-to-field.test.ts b/packages/database-next/src/__tests__/fields/belongs-to-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..f17fe84288afcccfda2058d60f697f0b3d79c41d --- /dev/null +++ b/packages/database-next/src/__tests__/fields/belongs-to-field.test.ts @@ -0,0 +1,151 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; + +describe('belongs to field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('association undefined', async () => { + const Comment = db.collection({ + name: 'comments', + fields: [{ type: 'belongsTo', name: 'post' }], + }); + expect(Comment.model.associations['post']).toBeUndefined(); + }); + + it('association defined', async () => { + const Comment = db.collection({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, + { type: 'belongsTo', name: 'post' }, + ], + }); + expect(Comment.model.associations.post).toBeUndefined(); + const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + ], + }); + const association = Comment.model.associations.post; + expect(Comment.model.associations.post).toBeDefined(); + expect(association.foreignKey).toBe('postId'); + // @ts-ignore + expect(association.targetKey).toBe('id'); + expect(Comment.model.rawAttributes.postId).toBeDefined(); + await db.sync(); + const comment = await Comment.model.create(); + await comment.createPost({ + title: 'title222', + }); + const post1 = await comment.getPost(); + expect(post1.toJSON()).toMatchObject({ + title: 'title222', + }); + const post = await Post.model.create({ + title: 'title111' + }); + await comment.setPost(post); + const post2 = await comment.getPost(); + expect(post2.toJSON()).toMatchObject({ + title: 'title111', + }); + }); + + it('custom targetKey and foreignKey', async () => { + const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'key', unique: true }, + ], + }); + const Comment = db.collection({ + name: 'comments', + fields: [ + { + type: 'belongsTo', + name: 'post', + targetKey: 'key', + foreignKey: 'postKey', + }, + ], + }); + const association = Comment.model.associations.post; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('postKey'); + // @ts-ignore + expect(association.targetKey).toBe('key'); + expect(Comment.model.rawAttributes['postKey']).toBeDefined(); + }); + + it('custom name and target', async () => { + const Comment = db.collection({ + name: 'comments', + fields: [ + { type: 'string', name: 'content' }, + { + type: 'belongsTo', + name: 'article', + target: 'posts', + targetKey: 'key', + foreignKey: 'postKey', + }, + ], + }); + expect(Comment.model.associations.article).toBeUndefined(); + const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'key', unique: true }, + ], + }); + const association = Comment.model.associations.article; + expect(Comment.model.associations.article).toBeDefined(); + expect(association.foreignKey).toBe('postKey'); + // @ts-ignore + expect(association.targetKey).toBe('key'); + expect(Comment.model.rawAttributes.postKey).toBeDefined(); + await db.sync(); + const comment = await Comment.model.create(); + await comment.createArticle({ + key: 'title222', + }); + const post1 = await comment.getArticle(); + expect(post1.toJSON()).toMatchObject({ + key: 'title222', + }); + const post = await Post.model.create({ + key: 'title111' + }); + await comment.setArticle(post); + const post2 = await comment.getArticle(); + expect(post2.toJSON()).toMatchObject({ + key: 'title111', + }); + }); + + it('schema delete', async () => { + const Comment = db.collection({ + name: 'comments', + fields: [{ type: 'belongsTo', name: 'post' }], + }); + const Post = db.collection({ + name: 'posts', + fields: [{ type: 'hasMany', name: 'comments' }], + }); + // await db.sync(); + Comment.removeField('post'); + expect(Comment.model.associations.post).toBeUndefined(); + expect(Comment.model.rawAttributes.postId).toBeDefined(); + Post.removeField('comments'); + expect(Comment.model.rawAttributes.postId).toBeUndefined(); + }); +}); diff --git a/packages/database-next/src/__tests__/fields/belongs-to-many-field.test.ts b/packages/database-next/src/__tests__/fields/belongs-to-many-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..4301610bee0cdc7aca172d2dbd3660d3ce07bfee --- /dev/null +++ b/packages/database-next/src/__tests__/fields/belongs-to-many-field.test.ts @@ -0,0 +1,42 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; + +describe('belongs to many field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('association undefined', async () => { + const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsToMany', name: 'tags' }, + ], + }); + expect(Post.model.associations.tags).toBeUndefined(); + expect(db.getCollection('posts_tags')).toBeUndefined(); + const Tag = db.collection({ + name: 'tags', + fields: [ + { type: 'string', name: 'name' }, + ], + }); + expect(Post.model.associations.tags).toBeDefined(); + const Through = db.getCollection('posts_tags'); + expect(Through).toBeDefined(); + expect(Through.model.rawAttributes['postId']).toBeDefined(); + expect(Through.model.rawAttributes['tagId']).toBeDefined(); + const PostTag = db.collection({ + name: 'posts_tags', + }); + expect(PostTag.model.rawAttributes['postId']).toBeDefined(); + expect(PostTag.model.rawAttributes['tagId']).toBeDefined(); + }); +}); diff --git a/packages/database-next/src/__tests__/fields/has-many-field.test.ts b/packages/database-next/src/__tests__/fields/has-many-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..40b9f9576ef70f6298e970a33199c33c51514b18 --- /dev/null +++ b/packages/database-next/src/__tests__/fields/has-many-field.test.ts @@ -0,0 +1,155 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; + +describe('has many field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('association undefined', async () => { + const collection = db.collection({ + name: 'posts', + fields: [{ type: 'hasMany', name: 'comments' }], + }); + await db.sync(); + expect(collection.model.associations['comments']).toBeUndefined(); + }); + + it('association defined', async () => { + const { model } = db.collection({ + name: 'posts', + fields: [{ type: 'hasMany', name: 'comments' }], + }); + expect(model.associations['comments']).toBeUndefined(); + const comments = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'content' }], + }); + const association = model.associations.comments; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('postId'); + // @ts-ignore + expect(association.sourceKey).toBe('id'); + expect(comments.model.rawAttributes['postId']).toBeDefined(); + await db.sync(); + const post = await model.create(); + await post.createComment({ + content: 'content111', + }); + const postComments = await post.getComments(); + expect(postComments.map((comment) => comment.content)).toEqual([ + 'content111', + ]); + }); + + it('custom sourceKey', async () => { + const collection = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'key', unique: true }, + { + type: 'hasMany', + name: 'comments', + sourceKey: 'key', + // foreignKey: 'postKey', + }, + ], + }); + const comments = db.collection({ + name: 'comments', + fields: [], + }); + const association = collection.model.associations.comments; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('postKey'); + // @ts-ignore + expect(association.sourceKey).toBe('key'); + expect(comments.model.rawAttributes['postKey']).toBeDefined(); + await db.sync(); + }); + + it('custom sourceKey and foreignKey', async () => { + const collection = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'key', unique: true }, + { + type: 'hasMany', + name: 'comments', + sourceKey: 'key', + foreignKey: 'postKey', + }, + ], + }); + const comments = db.collection({ + name: 'comments', + fields: [], + }); + const association = collection.model.associations.comments; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('postKey'); + // @ts-ignore + expect(association.sourceKey).toBe('key'); + expect(comments.model.rawAttributes['postKey']).toBeDefined(); + await db.sync(); + }); + + it('custom name and target', async () => { + const collection = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'key', unique: true }, + { + type: 'hasMany', + name: 'reviews', + target: 'comments', + sourceKey: 'key', + foreignKey: 'postKey', + }, + ], + }); + db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'content' }], + }); + const association = collection.model.associations.reviews; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('postKey'); + // @ts-ignore + expect(association.sourceKey).toBe('key'); + await db.sync(); + const post = await collection.model.create({ + key: 'key1', + }); + await post.createReview({ + content: 'content111', + }); + const postComments = await post.getReviews(); + expect(postComments.map((comment) => comment.content)).toEqual([ + 'content111', + ]); + }); + + it('schema delete', async () => { + const Post = db.collection({ + name: 'posts', + fields: [{ type: 'hasMany', name: 'comments' }], + }); + const Comment = db.collection({ + name: 'comments', + fields: [{ type: 'belongsTo', name: 'post' }], + }); + await db.sync(); + Post.removeField('comments'); + expect(Post.model.associations.comments).toBeUndefined(); + expect(Comment.model.rawAttributes.postId).toBeDefined(); + Comment.removeField('post'); + expect(Comment.model.rawAttributes.postId).toBeUndefined(); + }); +}); diff --git a/packages/database-next/src/__tests__/fields/has-one-field.test.ts b/packages/database-next/src/__tests__/fields/has-one-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..146378abbe1370d900005b943b3b04ff25c99372 --- /dev/null +++ b/packages/database-next/src/__tests__/fields/has-one-field.test.ts @@ -0,0 +1,67 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; + +describe('has many field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('association undefined', async () => { + const User = db.collection({ + name: 'users', + fields: [{ type: 'hasOne', name: 'profile' }], + }); + await db.sync(); + expect(User.model.associations.profile).toBeUndefined(); + }); + + it('association defined', async () => { + const User = db.collection({ + name: 'users', + fields: [{ type: 'hasOne', name: 'profile' }], + }); + expect(User.model.associations.phone).toBeUndefined(); + const Profile = db.collection({ + name: 'profiles', + fields: [{ type: 'string', name: 'content' }], + }); + const association = User.model.associations.profile; + expect(association).toBeDefined(); + expect(association.foreignKey).toBe('userId'); + // @ts-ignore + expect(association.sourceKey).toBe('id'); + expect(Profile.model.rawAttributes['userId']).toBeDefined(); + await db.sync(); + // const post = await model.create(); + // await post.createComment({ + // content: 'content111', + // }); + // const postComments = await post.getComments(); + // expect(postComments.map((comment) => comment.content)).toEqual([ + // 'content111', + // ]); + }); + + it('schema delete', async () => { + const User = db.collection({ + name: 'users', + fields: [{ type: 'hasOne', name: 'profile' }], + }); + const Profile = db.collection({ + name: 'profiles', + fields: [{ type: 'belongsTo', name: 'user' }], + }); + await db.sync(); + User.removeField('profile'); + expect(User.model.associations.profile).toBeUndefined(); + expect(Profile.model.rawAttributes.userId).toBeDefined(); + Profile.removeField('user'); + expect(Profile.model.rawAttributes.userId).toBeUndefined(); + }); +}); diff --git a/packages/database-next/src/__tests__/fields/sort-field.test.ts b/packages/database-next/src/__tests__/fields/sort-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..6376446239fc4789673c84dad7b167ffea65558a --- /dev/null +++ b/packages/database-next/src/__tests__/fields/sort-field.test.ts @@ -0,0 +1,70 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; +import { SortField } from '../../fields'; + +describe('string field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + db.registerFieldTypes({ + sort: SortField + }); + }); + + afterEach(async () => { + await db.close(); + }); + + it('sort', async () => { + const Test = db.collection({ + name: 'tests', + fields: [ + { type: 'sort', name: 'sort' }, + ], + }); + await db.sync(); + const test1 = await Test.model.create(); + expect(test1.sort).toBe(1); + const test2 = await Test.model.create(); + expect(test2.sort).toBe(2); + const test3 = await Test.model.create(); + expect(test3.sort).toBe(3); + }); + + it('skip if sort value not empty', async () => { + const Test = db.collection({ + name: 'tests', + fields: [ + { type: 'sort', name: 'sort' }, + ], + }); + await db.sync(); + const test1 = await Test.model.create({ sort: 3 }); + expect(test1.sort).toBe(3); + const test2 = await Test.model.create(); + expect(test2.sort).toBe(4); + const test3 = await Test.model.create(); + expect(test3.sort).toBe(5); + }); + + it('scopeKey', async () => { + const Test = db.collection({ + name: 'tests', + fields: [ + { type: 'sort', name: 'sort', scopeKey: 'status' }, + { type: 'string', name: 'status' }, + ], + }); + await db.sync(); + const t1 = await Test.model.create({ status: 'publish' }); + const t2 = await Test.model.create({ status: 'publish' }); + const t3 = await Test.model.create({ status: 'draft' }); + const t4 = await Test.model.create({ status: 'draft' }); + expect(t1.get('sort')).toBe(1); + expect(t2.get('sort')).toBe(2); + expect(t3.get('sort')).toBe(1); + expect(t4.get('sort')).toBe(2); + }); + +}); diff --git a/packages/database-next/src/__tests__/fields/string-field.test.ts b/packages/database-next/src/__tests__/fields/string-field.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..817fffedce854612b9a19f4e2b87a95b704ee6d5 --- /dev/null +++ b/packages/database-next/src/__tests__/fields/string-field.test.ts @@ -0,0 +1,79 @@ +import { Database } from '../../database'; +import { mockDatabase } from '../'; + +describe('string field', () => { + let db: Database; + + beforeEach(() => { + db = mockDatabase(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('define', async () => { + const Test = db.collection({ + name: 'tests', + fields: [ + { type: 'string', name: 'name' }, + ], + }); + await db.sync(); + expect(Test.model.rawAttributes['name']).toBeDefined(); + const model = await Test.model.create({ + name: 'abc', + }); + expect(model.toJSON()).toMatchObject({ + name: 'abc', + }); + }); + + it('set', async () => { + const Test = db.collection({ + name: 'tests', + fields: [ + { type: 'string', name: 'name1' }, + ], + }); + await db.sync(); + Test.addField({ type: 'string', name: 'name2' }); + await db.sync(); + expect(Test.model.rawAttributes['name1']).toBeDefined(); + expect(Test.model.rawAttributes['name2']).toBeDefined(); + const model = await Test.model.create({ + name1: 'a1', + name2: 'a2', + }); + expect(model.toJSON()).toMatchObject({ + name1: 'a1', + name2: 'a2', + }); + }); + + it('model hook', async () => { + const collection = db.collection({ + name: 'tests', + fields: [ + { type: 'string', name: 'name' }, + ], + }); + await db.sync(); + collection.model.beforeCreate((model) => { + const changed = model.changed(); + for (const name of changed || []) { + model.set(name, `${model.get(name)}111`); + } + }); + collection.addField({ type: 'string', name: 'name2' }); + await db.sync(); + const model = await collection.model.create({ + name: 'n1', + name2: 'n2', + }); + expect(model.toJSON()).toMatchObject({ + name: 'n1111', + name2: 'n2111', + }); + }); +}); diff --git a/packages/database-next/src/__tests__/index.ts b/packages/database-next/src/__tests__/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..bc70cdd806d8f9a704ac99ac86e846676ebfc703 --- /dev/null +++ b/packages/database-next/src/__tests__/index.ts @@ -0,0 +1,40 @@ +import merge from 'deepmerge'; +import { Database, DatabaseOptions } from '../database'; + +export function generatePrefixByPath() { + const { id } = require.main; + const key = id + .replace(`${process.env.PWD}/packages`, '') + .replace(/src\/__tests__/g, '') + .replace('.test.ts', '') + .replace(/[^\w]/g, '_') + .replace(/_+/g, '_'); + return key +} + +export function getConfig(config = {}, options?: any): DatabaseOptions { + return merge({ + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT, + dialect: process.env.DB_DIALECT, + logging: process.env.DB_LOG_SQL === 'on', + sync: { + force: true, + alter: { + drop: true, + }, + }, + hooks: { + beforeDefine(model, options) { + options.tableName = `${generatePrefixByPath()}_${options.tableName || options.modelName || options.name.plural}`; + }, + }, + }, config || {}, options) as any; +}; + +export function mockDatabase(options?: DatabaseOptions): Database { + return new Database(getConfig(options)); +} diff --git a/packages/database-next/src/__tests__/repository.test.ts b/packages/database-next/src/__tests__/repository.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..a1d6668f1d84b5bc49a01cd85b08c245288551e6 --- /dev/null +++ b/packages/database-next/src/__tests__/repository.test.ts @@ -0,0 +1,426 @@ +import { Collection } from '../collection'; +import { Database } from '../database'; +import { mockDatabase } from './'; + +describe('repository.find', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'name' }], + }); + await db.sync(); + await User.repository.createMany([ + { + name: 'user1', + posts: [ + { + name: 'post11', + comments: [ + { name: 'comment111' }, + { name: 'comment112' }, + { name: 'comment113' }, + ], + }, + { + name: 'post12', + comments: [ + { name: 'comment121' }, + { name: 'comment122' }, + { name: 'comment123' }, + ], + }, + { + name: 'post13', + comments: [ + { name: 'comment131' }, + { name: 'comment132' }, + { name: 'comment133' }, + ], + }, + { + name: 'post14', + comments: [ + { name: 'comment141' }, + { name: 'comment142' }, + { name: 'comment143' }, + ], + }, + ], + }, + { + name: 'user2', + posts: [ + { + name: 'post21', + comments: [ + { name: 'comment211' }, + { name: 'comment212' }, + { name: 'comment213' }, + ], + }, + { + name: 'post22', + comments: [ + { name: 'comment221' }, + { name: 'comment222' }, + { name: 'comment223' }, + ], + }, + { + name: 'post23', + comments: [ + { name: 'comment231' }, + { name: 'comment232' }, + { name: 'comment233' }, + ], + }, + { name: 'post24' }, + ], + }, + { + name: 'user3', + posts: [ + { + name: 'post31', + comments: [ + { name: 'comment311' }, + { name: 'comment312' }, + { name: 'comment313' }, + ], + }, + { name: 'post32' }, + { + name: 'post33', + comments: [ + { name: 'comment331' }, + { name: 'comment332' }, + { name: 'comment333' }, + ], + }, + { name: 'post34' }, + ], + }, + ]); + }); + + afterEach(async () => { + await db.close(); + }); + + it('findOne', async () => { + const data = await User.repository.findOne({ + filter: { + 'posts.comments.name': 'comment331', + }, + }); + console.log(data); + }); + + it('findMany', async () => { + const data = await User.repository.findMany({ + filter: { + 'posts.comments.id': null, + }, + page: 1, + pageSize: 1, + }); + console.log( + data.count, + JSON.stringify( + data.rows.map((row) => row.toJSON()), + null, + 2, + ), + ); + // expect(data.toJSON()).toMatchObject({ + // name: 'user3', + // }); + }); +}); + +describe('repository.create', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'name' }], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('create', async () => { + const user = await User.repository.create({ + name: 'user1', + posts: [ + { + name: 'post11', + comments: [ + { name: 'comment111' }, + { name: 'comment112' }, + { name: 'comment113' }, + ], + }, + ], + }); + const post = await Post.model.findOne(); + expect(post).toMatchObject({ + name: 'post11', + userId: user.get('id'), + }); + const comments = await Comment.model.findAll(); + expect(comments.map((m) => m.get('postId'))).toEqual([ + post.get('id'), + post.get('id'), + post.get('id'), + ]); + }); +}); + +describe('repository.update', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'name' }], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('update1', async () => { + const user = await User.model.create({ + name: 'user1', + }); + await User.repository.update( + { + name: 'user11', + posts: [{ name: 'post1' }], + }, + user, + ); + const updated = await User.model.findByPk(user.id); + expect(updated).toMatchObject({ + name: 'user11', + }); + const post = await Post.model.findOne({ + where: { + name: 'post1', + }, + }); + expect(post).toMatchObject({ + name: 'post1', + userId: user.id, + }); + }); + + it('update2', async () => { + const user = await User.model.create({ + name: 'user1', + posts: [{ name: 'post1' }], + }); + await User.repository.update( + { + name: 'user11', + posts: [{ name: 'post1' }], + }, + user.id, + ); + const updated = await User.model.findByPk(user.id); + expect(updated).toMatchObject({ + name: 'user11', + }); + const post = await Post.model.findOne({ + where: { + name: 'post1', + }, + }); + expect(post).toMatchObject({ + name: 'post1', + userId: user.id, + }); + }); +}); + +describe('repository.destroy', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'name' }], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('destroy1', async () => { + const user = await User.model.create(); + await User.repository.destroy(user.id); + const user1 = await User.model.findByPk(user.id); + expect(user1).toBeNull(); + }); + + it('destroy2', async () => { + const user = await User.model.create(); + await User.repository.destroy({ + filter: { + id: user.id, + }, + }); + const user1 = await User.model.findByPk(user.id); + expect(user1).toBeNull(); + }); +}); + +describe('repository.relatedQuery', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsTo', name: 'user' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [{ type: 'string', name: 'name' }], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('create', async () => { + const user = await User.repository.create(); + const post = await User.repository.relatedQuery('posts').for(user).create({ + name: 'post1', + }); + expect(post).toMatchObject({ + name: 'post1', + userId: user.id, + }); + const post2 = await User.repository + .relatedQuery('posts') + .for(user.id) + .create({ + name: 'post2', + }); + expect(post2).toMatchObject({ + name: 'post2', + userId: user.id, + }); + }); + + it('update', async () => { + const post = await Post.repository.create({ + user: { + name: 'user11', + } + }); + await Post.repository.relatedQuery('user').for(post).update({ + name: 'user12', + }); + }); +}); diff --git a/packages/database-next/src/__tests__/update-associations.test.ts b/packages/database-next/src/__tests__/update-associations.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..4148c75aa072156a71873679cb241d8a7627c9c1 --- /dev/null +++ b/packages/database-next/src/__tests__/update-associations.test.ts @@ -0,0 +1,294 @@ +import { Collection } from '../collection'; +import { Database } from '../database'; +import { updateAssociation, updateAssociations } from '../update-associations'; +import { mockDatabase } from './'; + +describe('update associations', () => { + + describe('belongsTo', () => { + let db: Database; + beforeEach(() => { + db = mockDatabase(); + }); + afterEach(async () => { + await db.close(); + }); + it('post.user', async () => { + const User = db.collection({ + name: 'users', + fields: [{ type: 'string', name: 'name' }], + }); + const Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsTo', name: 'user' }, + ], + }); + await db.sync(); + const user = await User.model.create({ name: 'user1' }); + const post1 = await Post.model.create({ name: 'post1' }); + await updateAssociations(post1, { + user, + }); + expect(post1.toJSON()).toMatchObject({ + id: 1, + name: 'post1', + userId: 1, + user: { + id: 1, + name: 'user1', + }, + }); + const post2 = await Post.model.create({ name: 'post2' }); + await updateAssociations(post2, { + user: user.id, + }); + expect(post2.toJSON()).toMatchObject({ + id: 2, + name: 'post2', + userId: 1, + }); + const post3 = await Post.model.create({ name: 'post3' }); + await updateAssociations(post3, { + user: { + name: 'user3', + }, + }); + expect(post3.toJSON()).toMatchObject({ + id: 3, + name: 'post3', + userId: 2, + user: { + id: 2, + name: 'user3', + }, + }); + const post4 = await Post.model.create({ name: 'post4' }); + await updateAssociations(post4, { + user: { + id: user.id, + name: 'user4', + }, + }); + expect(post4.toJSON()).toMatchObject({ + id: 4, + name: 'post4', + userId: 1, + user: { + id: 1, + name: 'user1', + }, + }); + }); + }); + + describe('hasMany', () => { + let db: Database; + let User: Collection; + let Post: Collection; + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + ], + }); + await db.sync(); + }); + afterEach(async () => { + await db.close(); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + await updateAssociations(user1, { + posts: { + name: 'post1', + }, + }); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + posts: [ + { + name: 'post1', + userId: user1.id, + } + ], + }); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + await updateAssociations(user1, { + posts: [{ + name: 'post1', + }], + }); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + posts: [ + { + name: 'post1', + userId: user1.id, + } + ], + }); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + const post1 = await Post.model.create({ name: 'post1' }); + await updateAssociations(user1, { + posts: post1.id, + }); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + }); + const post11 = await Post.model.findByPk(post1.id); + expect(post11.toJSON()).toMatchObject({ + userId: user1.id, + }); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + const post1 = await Post.model.create({ name: 'post1' }); + await updateAssociations(user1, { + posts: post1, + }); + console.log(JSON.stringify(user1, null, 2)); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + }); + const post11 = await Post.model.findByPk(post1.id); + expect(post11.toJSON()).toMatchObject({ + userId: user1.id, + }); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + const post1 = await Post.model.create({ name: 'post1' }); + await updateAssociations(user1, { + posts: { + id: post1.id, + name: 'post111', + }, + }); + console.log(JSON.stringify(user1, null, 2)); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + }); + const post11 = await Post.model.findByPk(post1.id); + expect(post11.toJSON()).toMatchObject({ + userId: user1.id, + name: 'post1', + }); + }); + it('user.posts', async () => { + const user1 = await User.model.create({ name: 'user1' }); + const post1 = await Post.model.create({ name: 'post1' }); + const post2 = await Post.model.create({ name: 'post2' }); + const post3 = await Post.model.create({ name: 'post3' }); + await updateAssociations(user1, { + posts: [ + { + id: post1.id, + name: 'post111', + }, + post2.id, + post3, + ] + }); + console.log(JSON.stringify(user1, null, 2)); + expect(user1.toJSON()).toMatchObject({ + name: 'user1', + }); + const post11 = await Post.model.findByPk(post1.id); + expect(post11.toJSON()).toMatchObject({ + userId: user1.id, + name: 'post1', + }); + const post22 = await Post.model.findByPk(post2.id); + expect(post22.toJSON()).toMatchObject({ + userId: user1.id, + name: 'post2', + }); + const post33 = await Post.model.findByPk(post3.id); + expect(post33.toJSON()).toMatchObject({ + userId: user1.id, + name: 'post3', + }); + }); + }); + + describe('nested', () => { + let db: Database; + let User: Collection; + let Post: Collection; + let Comment: Collection; + + beforeEach(async () => { + db = mockDatabase(); + User = db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'hasMany', name: 'posts' }, + ], + }); + Post = db.collection({ + name: 'posts', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsTo', name: 'user' }, + { type: 'hasMany', name: 'comments' }, + ], + }); + Comment = db.collection({ + name: 'comments', + fields: [ + { type: 'string', name: 'name' }, + { type: 'belongsTo', name: 'post' }, + ], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + it('nested', async () => { + const user = await User.model.create({ name: 'user1' }); + await updateAssociations(user, { + posts: [ + { + name: 'post1', + comments: [ + { + name: 'comment1', + }, + ], + }, + ], + }); + const post1 = await Post.model.findOne({ + where: { name: 'post1' } + }); + const comment1 = await Comment.model.findOne({ + where: { name: 'comment1' } + }); + expect(post1).toMatchObject({ + userId: user.get('id'), + }); + expect(comment1).toMatchObject({ + postId: post1.get('id'), + }); + }); + }); +}); diff --git a/packages/database-next/src/collection.ts b/packages/database-next/src/collection.ts new file mode 100644 index 0000000000000000000000000000000000000000..cea603c3d978ae7dbc26e7b41a311c3f60ad0a3c --- /dev/null +++ b/packages/database-next/src/collection.ts @@ -0,0 +1,118 @@ +import { Sequelize, ModelCtor, Model, DataTypes, Utils } from 'sequelize'; +import { EventEmitter } from 'events'; +import { Database } from './database'; +import { Field } from './fields'; +import _ from 'lodash'; +import { Repository } from './repository'; + +export interface CollectionOptions { + name: string; + tableName?: string; + fields?: any; + [key: string]: any; +} + +export interface CollectionContext { + database: Database; +} + +export class Collection extends EventEmitter { + options: CollectionOptions; + context: CollectionContext; + fields: Map; + model: ModelCtor; + repository: Repository; + + get name() { + return this.options.name; + } + + constructor(options: CollectionOptions, context?: CollectionContext) { + super(); + this.options = options; + this.context = context; + this.fields = new Map(); + this.model = class extends Model {}; + const attributes = {}; + const { name, tableName } = options; + // TODO: 不能重复 model.init,如果有涉及 InitOptions 参数修改,需要另外处理。 + this.model.init(attributes, { + ..._.omit(options, ['name', 'fields']), + sequelize: context.database.sequelize, + modelName: name, + tableName: tableName || name, + }); + this.on('field.afterAdd', (field) => field.bind()); + this.on('field.afterRemove', (field) => field.unbind()); + this.setFields(options.fields); + this.repository = new Repository(this); + } + + forEachField(callback: (field: Field) => void) { + return [...this.fields.values()].forEach(callback); + } + + findField(callback: (field: Field) => boolean) { + return [...this.fields.values()].find(callback); + } + + hasField(name: string) { + return this.fields.has(name); + } + + getField(name: string) { + return this.fields.get(name); + } + + addField(options) { + const { name, ...others } = options; + if (!name) { + return this; + } + const { database } = this.context; + const field = database.buildField({ name, ...others }, { + ...this.context, + collection: this, + model: this.model, + }); + this.fields.set(name, field); + this.emit('field.afterAdd', field); + } + + setFields(fields: any, reset = true) { + if (!fields) { + return this; + } + if (reset) { + this.fields.clear(); + } + if (Array.isArray(fields)) { + for (const field of fields) { + this.addField(field); + } + } else if (typeof fields === 'object') { + for (const [name, options] of Object.entries(fields)) { + this.addField({...options, name}); + } + } + } + + removeField(name) { + const field = this.fields.get(name); + const bool = this.fields.delete(name); + if (bool) { + this.emit('field.afterRemove', field); + } + return bool; + } + + // TODO + extend(options) { + const { fields } = options; + this.setFields(fields); + } + + sync() { + + } +} diff --git a/packages/database-next/src/database.ts b/packages/database-next/src/database.ts new file mode 100644 index 0000000000000000000000000000000000000000..64acf66dea6d60cdba82e11fa29516879ec324c6 --- /dev/null +++ b/packages/database-next/src/database.ts @@ -0,0 +1,150 @@ +import { + Sequelize, + ModelCtor, + Model, + Options, + SyncOptions, + Op, + Utils, +} from 'sequelize'; +import { EventEmitter } from 'events'; +import { Collection, CollectionOptions } from './collection'; +import * as FieldTypes from './fields'; +import { RelationField } from './fields'; + +export interface PendingOptions { + field: RelationField; + model: ModelCtor; +} + +export type DatabaseOptions = Options | Sequelize; + +export class Database extends EventEmitter { + sequelize: Sequelize; + fieldTypes = new Map(); + models = new Map(); + repositories = new Map(); + operators = new Map(); + collections: Map; + pendingFields = new Map(); + + constructor(options: DatabaseOptions) { + super(); + + if (options instanceof Sequelize) { + this.sequelize = options; + } else { + this.sequelize = new Sequelize(options); + } + + this.collections = new Map(); + + this.on('collection.afterDefine', (collection) => { + const items = this.pendingFields.get(collection.name); + for (const field of items || []) { + field.bind(); + } + }); + + for (const [name, field] of Object.entries(FieldTypes)) { + if (['Field', 'RelationField'].includes(name)) { + continue; + } + let key = name.replace(/Field$/g, ''); + key = key.substring(0, 1).toLowerCase() + key.substring(1); + this.registerFieldTypes({ + [key]: field, + }); + } + + const operators = new Map(); + + // Sequelize 内置 + for (const key in Op) { + operators.set('$' + key, Op[key]); + const val = Utils.underscoredIf(key, true); + operators.set('$' + val, Op[key]); + operators.set('$' + val.replace(/_/g, ''), Op[key]); + } + + this.operators = operators; + } + + collection(options: CollectionOptions) { + let collection = this.collections.get(options.name); + if (collection) { + collection.extend(options); + } else { + collection = new Collection(options, { database: this }); + } + this.collections.set(collection.name, collection); + this.emit('collection.afterDefine', collection); + return collection; + } + + getCollection(name: string) { + return this.collections.get(name); + } + + addPendingField(field: RelationField) { + const associating = this.pendingFields; + const items = this.pendingFields.get(field.target) || []; + items.push(field); + associating.set(field.target, items); + } + + removePendingField(field: RelationField) { + const items = this.pendingFields.get(field.target) || []; + const index = items.indexOf(field); + if (index !== -1) { + delete items[index]; + this.pendingFields.set(field.target, items); + } + } + + registerFieldTypes(fieldTypes: any) { + for (const [type, fieldType] of Object.entries(fieldTypes)) { + this.fieldTypes.set(type, fieldType); + } + } + + registerModels(models: any) { + for (const [type, schemaType] of Object.entries(models)) { + this.models.set(type, schemaType); + } + } + + registerRepositories(repositories: any) { + for (const [type, schemaType] of Object.entries(repositories)) { + this.repositories.set(type, schemaType); + } + } + + registerOperators(operators) { + for (const [key, operator] of Object.entries(operators)) { + this.operators.set(key, operator); + } + } + + buildField(options, context) { + const { type } = options; + const Field = this.fieldTypes.get(type); + return new Field(options, context); + } + + async sync(options?: SyncOptions) { + const isMySQL = this.sequelize.getDialect() === 'mysql'; + if (isMySQL) { + await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null); + } + const result = await this.sequelize.sync(options); + if (isMySQL) { + await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null); + } + return result; + } + + async close() { + return this.sequelize.close(); + } +} diff --git a/packages/database-next/src/fields/belongs-to-field.ts b/packages/database-next/src/fields/belongs-to-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef095eee2d3ebd3e1d82a87877383fc029703f19 --- /dev/null +++ b/packages/database-next/src/fields/belongs-to-field.ts @@ -0,0 +1,56 @@ +import { omit } from 'lodash'; +import { Sequelize, ModelCtor, Model, DataTypes, Utils } from 'sequelize'; +import { RelationField } from './relation-field'; + +export class BelongsToField extends RelationField { + + static type = 'belongsTo'; + + get target() { + const { target, name } = this.options; + return target || Utils.pluralize(name); + } + + bind() { + const { database, collection } = this.context; + const Target = this.TargetModel; + if (!Target) { + database.addPendingField(this); + return false; + } + const association = collection.model.belongsTo(Target, { + as: this.name, + ...omit(this.options, ['name', 'type', 'target']), + }); + // 建立关系之后从 pending 列表中删除 + database.removePendingField(this); + if (!this.options.foreignKey) { + this.options.foreignKey = association.foreignKey; + } + if (!this.options.sourceKey) { + // @ts-ignore + this.options.sourceKey = association.sourceKey; + } + return true; + } + + unbind() { + const { database, collection } = this.context; + // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段 + database.removePendingField(this); + // 如果外键没有显式的创建,关系表也无反向关联字段,删除关系时,外键也删除掉 + const tcoll = database.collections.get(this.target); + const foreignKey = this.options.foreignKey; + const field1 = collection.getField(foreignKey); + const field2 = tcoll.findField((field) => { + return field.type === 'hasMany' && field.foreignKey === foreignKey; + }); + if (!field1 && !field2) { + collection.model.removeAttribute(foreignKey); + } + // 删掉 model 的关联字段 + delete collection.model.associations[this.name]; + // @ts-ignore + collection.model.refreshAttributes(); + } +} diff --git a/packages/database-next/src/fields/belongs-to-many-field.ts b/packages/database-next/src/fields/belongs-to-many-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..5a0cad0bca5d3ac47edc908ec940da8066de8d58 --- /dev/null +++ b/packages/database-next/src/fields/belongs-to-many-field.ts @@ -0,0 +1,53 @@ +import { omit } from 'lodash'; +import { Sequelize, ModelCtor, Model, DataTypes, Utils } from 'sequelize'; +import { RelationField } from './relation-field'; + +export class BelongsToManyField extends RelationField { + + get through() { + return ( + this.options.through || + [this.context.collection.model.name, this.target] + .map((name) => name.toLowerCase()) + .sort() + .join('_') + ); + } + + bind() { + const { database, collection } = this.context; + const Target = this.TargetModel; + if (!Target) { + database.addPendingField(this); + return false; + } + const through = this.through; + let Through = + database.getCollection(through) || + database.collection({ + name: through, + }); + const association = collection.model.belongsToMany(Target, { + ...omit(this.options, ['name', 'type', 'target']), + as: this.name, + through: Through.model, + }); + // 建立关系之后从 pending 列表中删除 + database.removePendingField(this); + if (!this.options.foreignKey) { + this.options.foreignKey = association.foreignKey; + } + if (!this.options.sourceKey) { + this.options.sourceKey = association.sourceKey; + } + return true; + } + + unbind() { + const { database, collection } = this.context; + // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段 + database.removePendingField(this); + // 删掉 model 的关联字段 + delete collection.model.associations[this.name]; + } +} diff --git a/packages/database-next/src/fields/date-field.ts b/packages/database-next/src/fields/date-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..5de85c9544a6cd93da1d1ec118658ccc6a8318a0 --- /dev/null +++ b/packages/database-next/src/fields/date-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class DateField extends Field { + get dataType() { + return DataTypes.DATE; + } +} diff --git a/packages/database-next/src/fields/field.ts b/packages/database-next/src/fields/field.ts new file mode 100644 index 0000000000000000000000000000000000000000..02502a0cbf476a656957825bf961281bf43773f2 --- /dev/null +++ b/packages/database-next/src/fields/field.ts @@ -0,0 +1,70 @@ +import { Sequelize, ModelCtor, Model, DataTypes, Utils } from 'sequelize'; +import { EventEmitter } from 'events'; +import { Collection } from '../collection'; +import { Database } from '../database'; +import _ from 'lodash'; + +export interface FieldContext { + database: Database; + collection: Collection; +} + +export abstract class Field { + options: any; + context: FieldContext; + database: Database; + collection: Collection; + [key: string]: any; + + get name() { + return this.options.name; + } + + get type() { + return this.options.type; + } + + get dataType() { + return this.options.dataType; + } + + constructor(options?: any, context?: FieldContext) { + this.context = context; + this.database = context.database; + this.collection = context.collection; + this.options = options || {}; + this.init(); + } + + init() { + // code + } + + get(name: string) { + return this.options[name]; + } + + merge(obj: any) { + Object.assign(this.options, obj); + } + + bind() { + const { model } = this.context.collection; + model.rawAttributes[this.name] = this.toSequelize(); + // @ts-ignore + model.refreshAttributes(); + } + + unbind() { + const { model } = this.context.collection; + model.removeAttribute(this.name); + } + + toSequelize(): any { + const opts = _.omit(this.options, ['name']); + if (this.dataType) { + Object.assign(opts, { type: this.dataType }); + } + return opts; + } +} diff --git a/packages/database-next/src/fields/float-field.ts b/packages/database-next/src/fields/float-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..8f83a44f6047d8950c2fe6d6aca7c93c513d6929 --- /dev/null +++ b/packages/database-next/src/fields/float-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class FloatField extends Field { + get dataType() { + return DataTypes.FLOAT; + } +} diff --git a/packages/database-next/src/fields/has-many-field.ts b/packages/database-next/src/fields/has-many-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb9d062fc163f21f3914615a66930463ab4cf57d --- /dev/null +++ b/packages/database-next/src/fields/has-many-field.ts @@ -0,0 +1,135 @@ +import { omit } from 'lodash'; +import { + Sequelize, + ModelCtor, + Model, + DataType, + AssociationScope, + ForeignKeyOptions, + HasManyOptions, + Utils, +} from 'sequelize'; +import { RelationField } from './relation-field'; + +export interface HasManyFieldOptions extends HasManyOptions { + /** + * The name of the field to use as the key for the association in the source table. Defaults to the primary + * key of the source table + */ + sourceKey?: string; + + /** + * A string or a data type to represent the identifier in the table + */ + keyType?: DataType; + + scope?: AssociationScope; + + /** + * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If + * you create multiple associations between the same tables, you should provide an alias to be able to + * distinguish between them. If you provide an alias when creating the assocition, you should provide the + * same alias when eager loading and when getting associated models. Defaults to the singularized name of + * target + */ + as?: string | { singular: string; plural: string }; + + /** + * The name of the foreign key in the target table or an object representing the type definition for the + * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property + * to set the name of the column. Defaults to the name of source + primary key of source + */ + foreignKey?: string | ForeignKeyOptions; + + /** + * What happens when delete occurs. + * + * Cascade if this is a n:m, and set null if it is a 1:m + * + * @default 'SET NULL' or 'CASCADE' + */ + onDelete?: string; + + /** + * What happens when update occurs + * + * @default 'CASCADE' + */ + onUpdate?: string; + + /** + * Should on update and on delete constraints be enabled on the foreign key. + */ + constraints?: boolean; + foreignKeyConstraint?: boolean; + + // scope?: AssociationScope; + + /** + * If `false` the applicable hooks will not be called. + * The default value depends on the context. + */ + hooks?: boolean; +} + +export class HasManyField extends RelationField { + + get foreignKey() { + if (this.options.foreignKey) { + return this.options.foreignKey; + } + const { model } = this.context.collection; + return Utils.camelize( + [ + model.options.name.singular, + this.sourceKey || model.primaryKeyAttribute + ].join('_') + ); + } + + bind() { + const { database, collection } = this.context; + const Target = this.TargetModel; + if (!Target) { + database.addPendingField(this); + return false; + } + const association = collection.model.hasMany(Target, { + as: this.name, + foreignKey: this.foreignKey, + ...omit(this.options, ['name', 'type', 'target']), + }); + // 建立关系之后从 pending 列表中删除 + database.removePendingField(this); + if (!this.options.foreignKey) { + this.options.foreignKey = association.foreignKey; + } + if (!this.options.sourceKey) { + // @ts-ignore + this.options.sourceKey = association.sourceKey; + } + return true; + } + + unbind() { + const { database, collection } = this.context; + // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段 + database.removePendingField(this); + // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉 + const tcoll = database.collections.get(this.target); + const foreignKey = this.options.foreignKey; + const field = tcoll.findField((field) => { + if (field.name === foreignKey) { + return true; + } + return field.type === 'belongsTo' && field.foreignKey === foreignKey; + }); + if (!field) { + tcoll.model.removeAttribute(foreignKey); + } + // 删掉 model 的关联字段 + delete collection.model.associations[this.name]; + // @ts-ignore + collection.model.refreshAttributes(); + } +} diff --git a/packages/database-next/src/fields/has-one-field.ts b/packages/database-next/src/fields/has-one-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d21f7e7acd107a14afe074336740a02dbf1ca4e --- /dev/null +++ b/packages/database-next/src/fields/has-one-field.ts @@ -0,0 +1,140 @@ +import { omit } from 'lodash'; +import { + Sequelize, + ModelCtor, + Model, + DataType, + AssociationScope, + ForeignKeyOptions, + HasOneOptions, + Utils, +} from 'sequelize'; +import { RelationField } from './relation-field'; + +export interface HasOneFieldOptions extends HasOneOptions { + /** + * The name of the field to use as the key for the association in the source table. Defaults to the primary + * key of the source table + */ + sourceKey?: string; + + /** + * A string or a data type to represent the identifier in the table + */ + keyType?: DataType; + + scope?: AssociationScope; + + /** + * The alias of this model, in singular form. See also the `name` option passed to `sequelize.define`. If + * you create multiple associations between the same tables, you should provide an alias to be able to + * distinguish between them. If you provide an alias when creating the assocition, you should provide the + * same alias when eager loading and when getting associated models. Defaults to the singularized name of + * target + */ + as?: string | { singular: string; plural: string }; + + /** + * The name of the foreign key in the target table or an object representing the type definition for the + * foreign column (see `Sequelize.define` for syntax). When using an object, you can add a `name` property + * to set the name of the column. Defaults to the name of source + primary key of source + */ + foreignKey?: string | ForeignKeyOptions; + + /** + * What happens when delete occurs. + * + * Cascade if this is a n:m, and set null if it is a 1:m + * + * @default 'SET NULL' or 'CASCADE' + */ + onDelete?: string; + + /** + * What happens when update occurs + * + * @default 'CASCADE' + */ + onUpdate?: string; + + /** + * Should on update and on delete constraints be enabled on the foreign key. + */ + constraints?: boolean; + foreignKeyConstraint?: boolean; + + // scope?: AssociationScope; + + /** + * If `false` the applicable hooks will not be called. + * The default value depends on the context. + */ + hooks?: boolean; +} + +export class HasOneField extends RelationField { + + get target() { + const { target, name } = this.options; + return target || Utils.pluralize(name); + } + + get foreignKey() { + if (this.options.foreignKey) { + return this.options.foreignKey; + } + const { model } = this.context.collection; + return Utils.camelize( + [ + model.options.name.singular, + model.primaryKeyAttribute + ].join('_') + ); + } + + bind() { + const { database, collection } = this.context; + const Target = this.TargetModel; + if (!Target) { + database.addPendingField(this); + return false; + } + const association = collection.model.hasOne(Target, { + as: this.name, + foreignKey: this.foreignKey, + ...omit(this.options, ['name', 'type', 'target']), + }); + // 建立关系之后从 pending 列表中删除 + database.removePendingField(this); + if (!this.options.foreignKey) { + this.options.foreignKey = association.foreignKey; + } + if (!this.options.sourceKey) { + // @ts-ignore + this.options.sourceKey = association.sourceKey; + } + return true; + } + + unbind() { + const { database, collection } = this.context; + // 如果关系字段还没建立就删除了,也同步删除待建立关联的关系字段 + database.removePendingField(this); + // 如果关系表内没有显式的创建外键字段,删除关系时,外键也删除掉 + const tcoll = database.collections.get(this.target); + const foreignKey = this.options.foreignKey; + const field = tcoll.findField((field) => { + if (field.name === foreignKey) { + return true; + } + return field.type === 'belongsTo' && field.foreignKey === foreignKey; + }); + if (!field) { + tcoll.model.removeAttribute(foreignKey); + } + // 删掉 model 的关联字段 + delete collection.model.associations[this.name]; + // @ts-ignore + collection.model.refreshAttributes(); + } +} diff --git a/packages/database-next/src/fields/index.ts b/packages/database-next/src/fields/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7e9dab58a6f7df3b7c979fd0757f54261b69319a --- /dev/null +++ b/packages/database-next/src/fields/index.ts @@ -0,0 +1,9 @@ +export * from './field'; +export * from './string-field'; +export * from './relation-field' +export * from './belongs-to-field' +export * from './belongs-to-many-field'; +export * from './has-one-field'; +export * from './has-many-field'; +export * from './json-field'; +export * from './sort-field'; diff --git a/packages/database-next/src/fields/integer-field.ts b/packages/database-next/src/fields/integer-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..eda93e17fa567b3e8d6ebf7cd36fcc0d51fbcee3 --- /dev/null +++ b/packages/database-next/src/fields/integer-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class IntegerField extends Field { + get dataType() { + return DataTypes.INTEGER; + } +} diff --git a/packages/database-next/src/fields/json-field.ts b/packages/database-next/src/fields/json-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..3641bbf7d09d2092cbc13f7423d22219021f8ffa --- /dev/null +++ b/packages/database-next/src/fields/json-field.ts @@ -0,0 +1,18 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class JsonField extends Field { + get dataType() { + return DataTypes.JSON; + } +} + +export class JsonbField extends Field { + get dataType() { + const dialect = this.context.database.sequelize.getDialect(); + if (dialect === 'postgres') { + return DataTypes.JSONB; + } + return DataTypes.JSON; + } +} diff --git a/packages/database-next/src/fields/number-field.ts b/packages/database-next/src/fields/number-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..b012d3d54cd026e7ccd76a29a0836fe6dfcc8ac9 --- /dev/null +++ b/packages/database-next/src/fields/number-field.ts @@ -0,0 +1,32 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class IntegerField extends Field { + get dataType() { + return DataTypes.INTEGER; + } +} + +export class FloatField extends Field { + get dataType() { + return DataTypes.FLOAT; + } +} + +export class DoubleField extends Field { + get dataType() { + return DataTypes.DOUBLE; + } +} + +export class RealField extends Field { + get dataType() { + return DataTypes.REAL; + } +} + +export class DecimalField extends Field { + get dataType() { + return DataTypes.DECIMAL; + } +} diff --git a/packages/database-next/src/fields/relation-field.ts b/packages/database-next/src/fields/relation-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbefd216cc45509cc6ad8032b969d5520f9e0f06 --- /dev/null +++ b/packages/database-next/src/fields/relation-field.ts @@ -0,0 +1,20 @@ +import { Field } from './field'; + +export abstract class RelationField extends Field { + get target() { + const { target, name } = this.options; + return target || name; + } + + get foreignKey() { + return this.options.foreignKey; + } + + get sourceKey() { + return this.options.sourceKey; + } + + get TargetModel() { + return this.context.database.sequelize.models[this.target]; + } +} diff --git a/packages/database-next/src/fields/sort-field.ts b/packages/database-next/src/fields/sort-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..a47b980374edb5bbb69e6e78f25f9104f47ec839 --- /dev/null +++ b/packages/database-next/src/fields/sort-field.ts @@ -0,0 +1,25 @@ +import { isNumber } from 'lodash'; +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class SortField extends Field { + get dataType() { + return DataTypes.INTEGER; + } + + init() { + const { name, scopeKey } = this.options; + const { model } = this.context.collection; + model.beforeCreate(async (instance, options) => { + if (isNumber(instance.get(name))) { + return; + } + const where = {}; + if (scopeKey) { + where[scopeKey] = instance.get(scopeKey); + } + const max = await model.max(name, { ...options, where }); + instance.set(name, (max || 0) + 1); + }); + } +} diff --git a/packages/database-next/src/fields/string-field.ts b/packages/database-next/src/fields/string-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..b29d0061d2601e4cc6116d78040f35949307e620 --- /dev/null +++ b/packages/database-next/src/fields/string-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class StringField extends Field { + get dataType() { + return DataTypes.STRING; + } +} diff --git a/packages/database-next/src/fields/text-field.ts b/packages/database-next/src/fields/text-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..f049e407d7a036d2d3d648891d2c8beaa128beec --- /dev/null +++ b/packages/database-next/src/fields/text-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class TextField extends Field { + get dataType() { + return DataTypes.TEXT; + } +} diff --git a/packages/database-next/src/fields/time-field.ts b/packages/database-next/src/fields/time-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..9de30d5b7fa2a3bd34044889ca80160514af7aae --- /dev/null +++ b/packages/database-next/src/fields/time-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class TimeField extends Field { + get dataType() { + return DataTypes.TIME; + } +} diff --git a/packages/database-next/src/fields/virtual-field.ts b/packages/database-next/src/fields/virtual-field.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a706f47abb4417d6b19d05a1ef00a0627cd2fc7 --- /dev/null +++ b/packages/database-next/src/fields/virtual-field.ts @@ -0,0 +1,8 @@ +import { DataTypes } from 'sequelize'; +import { Field } from './field'; + +export class VirtualField extends Field { + get dataType() { + return DataTypes.VIRTUAL; + } +} diff --git a/packages/app/src/components/fields/form-slot/style.ts b/packages/database-next/src/index.ts similarity index 100% rename from packages/app/src/components/fields/form-slot/style.ts rename to packages/database-next/src/index.ts diff --git a/packages/database-next/src/repository.ts b/packages/database-next/src/repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..70c44f1d2be0350677c7847fec2ac54941978ccb --- /dev/null +++ b/packages/database-next/src/repository.ts @@ -0,0 +1,453 @@ +import { + Op, + Model, + ModelCtor, + Association, + FindOptions, + BulkCreateOptions, + DestroyOptions as SequelizeDestroyOptions, + CreateOptions as SequelizeCreateOptions, + UpdateOptions as SequelizeUpdateOptions, +} from 'sequelize'; +import { flatten } from 'flat'; +import { Collection } from './collection'; +import _ from 'lodash'; +import { Database } from './database'; +import { updateAssociations } from './update-associations'; +import { RelationField } from './fields'; + +export interface IRepository {} + +interface CreateManyOptions extends BulkCreateOptions {} + +interface FindManyOptions extends FindOptions { + filter?: any; + fields?: any; + appends?: any; + expect?: any; + page?: any; + pageSize?: any; + sort?: any; +} + +interface FindOneOptions extends FindOptions { + filter?: any; + fields?: any; + appends?: any; + expect?: any; + sort?: any; +} + +interface CreateOptions extends SequelizeCreateOptions { + values?: any; + whitelist?: any; + blacklist?: any; +} + +interface UpdateOptions extends SequelizeUpdateOptions { + values?: any; + whitelist?: any; + blacklist?: any; +} + +interface DestroyOptions extends SequelizeDestroyOptions { + filter?: any; +} + +interface RelatedQueryOptions { + database: Database; + field: RelationField; + source: { + idOrInstance: any; + collection: Collection; + }; + target: { + association: Association & { + accessors: any; + }; + collection: Collection; + }; +} + +type Identity = string | number; + +class RelatedQuery { + options: RelatedQueryOptions; + sourceInstance: Model; + + constructor(options: RelatedQueryOptions) { + this.options = options; + } + + async getSourceInstance() { + if (this.sourceInstance) { + return this.sourceInstance; + } + const { idOrInstance, collection } = this.options.source; + if (idOrInstance instanceof Model) { + return (this.sourceInstance = idOrInstance); + } + this.sourceInstance = await collection.model.findByPk(idOrInstance); + return this.sourceInstance; + } + + async findMany(options?: any) { + const { collection } = this.options.target; + return await collection.repository.findMany(options); + } + + async findOne(options?: any) { + const { collection } = this.options.target; + return await collection.repository.findOne(options); + } + + async create(values?: any, options?: any) { + const { association } = this.options.target; + const createAccessor = association.accessors.create; + const source = await this.getSourceInstance(); + const instance = await source[createAccessor](values, options); + if (!instance) { + return; + } + await updateAssociations(instance, values); + return instance; + } + + async update(values: any, options?: Identity | Model | UpdateOptions) { + const { association, collection } = this.options.target; + if (options instanceof Model) { + return await collection.repository.update(values, options); + } + const { field } = this.options; + if (field.type === 'hasOne' || field.type === 'belongsTo') { + const getAccessor = association.accessors.get; + const source = await this.getSourceInstance(); + const instance = await source[getAccessor](); + return await collection.repository.update(values, instance); + } + // TODO + return await collection.repository.update(values, options); + } + + async destroy(options?: any) { + const { association, collection } = this.options.target; + const { field } = this.options; + if (field.type === 'hasOne' || field.type === 'belongsTo') { + const getAccessor = association.accessors.get; + const source = await this.getSourceInstance(); + const instance = await source[getAccessor](); + if (!instance) { + return; + } + return await collection.repository.destroy(instance.id); + } + return await collection.repository.destroy(options); + } + + async set(options?: any) {} + + async add(options?: any) {} + + async remove(options?: any) {} + + async toggle(options?: any) {} + + async sync(options?: any) {} +} + +class HasOneQuery extends RelatedQuery {} + +class HasManyQuery extends RelatedQuery {} + +class BelongsToQuery extends RelatedQuery {} + +class BelongsToManyQuery extends RelatedQuery {} + +export class Repository implements IRepository { + database: Database; + collection: Collection; + model: ModelCtor; + + constructor(collection: Collection) { + this.database = collection.context.database; + this.collection = collection; + this.model = collection.model; + } + + async findMany(options?: FindManyOptions) { + const model = this.collection.model; + const opts = { + subQuery: false, + ...this.buildQueryOptions(options), + }; + let rows = []; + if (opts.include) { + const ids = ( + await model.findAll({ + ...opts, + includeIgnoreAttributes: false, + attributes: [model.primaryKeyAttribute], + group: `${model.name}.${model.primaryKeyAttribute}`, + }) + ).map((item) => item[model.primaryKeyAttribute]); + if (ids.length > 0) { + rows = await model.findAll({ + ...opts, + where: { + [model.primaryKeyAttribute]: { + [Op.in]: ids, + }, + }, + }); + } + } else { + rows = await model.findAll({ + ...opts, + }); + } + const count = await model.count({ + ...opts, + distinct: opts.include ? true : undefined, + }); + return { count, rows }; + } + + async findOne(options?: FindOneOptions) { + const model = this.collection.model; + const opts = { + subQuery: false, + ...this.buildQueryOptions(options), + }; + let data: Model; + if (opts.include) { + const item = await model.findOne({ + ...opts, + includeIgnoreAttributes: false, + attributes: [model.primaryKeyAttribute], + group: `${model.name}.${model.primaryKeyAttribute}`, + }); + if (!item) { + return; + } + data = await model.findOne({ + ...opts, + where: item.toJSON(), + }); + } else { + data = await model.findOne({ + ...opts, + }); + } + return data; + } + + async create(values?: any, options?: CreateOptions) { + const instance = await this.model.create(values, options); + if (!instance) { + return; + } + await updateAssociations(instance, values, options); + return instance; + } + + async createMany(records: any[], options?: CreateManyOptions) { + const instances = await this.collection.model.bulkCreate(records, options); + const promises = instances.map((instance, index) => { + return updateAssociations(instance, records[index]); + }); + return Promise.all(promises); + } + + async update(values: any, options: Identity | Model | UpdateOptions) { + if (options instanceof Model) { + await options.update(values); + await updateAssociations(options, values); + return options; + } + let instance: Model; + if (typeof options === 'string' || typeof options === 'number') { + instance = await this.model.findByPk(options); + } else { + // TODO + instance = await this.findOne(options); + } + await instance.update(values); + await updateAssociations(instance, values); + return instance; + } + + async destroy(options: Identity | Identity[] | DestroyOptions) { + if (typeof options === 'number' || typeof options === 'string') { + return await this.model.destroy({ + where: { + [this.model.primaryKeyAttribute]: options, + }, + }); + } + if (Array.isArray(options)) { + return await this.model.destroy({ + where: { + [this.model.primaryKeyAttribute]: { + [Op.in]: options, + }, + }, + }); + } + const opts = this.buildQueryOptions(options); + return await this.model.destroy(opts); + } + + // TODO + async sort() {} + + relatedQuery(name: string) { + return { + for: (sourceIdOrInstance: any) => { + const field = this.collection.getField(name) as RelationField; + const database = this.collection.context.database; + const collection = database.getCollection(field.target); + const options: RelatedQueryOptions = { + field, + database: database, + source: { + collection: this.collection, + idOrInstance: sourceIdOrInstance, + }, + target: { + collection, + association: this.collection.model.associations[name] as any, + }, + }; + switch (field.type) { + case 'hasOne': + return new HasOneQuery(options); + case 'hasMany': + return new HasManyQuery(options); + case 'belongsTo': + return new BelongsToQuery(options); + case 'belongsToMany': + return new BelongsToManyQuery(options); + } + }, + }; + } + + buildQueryOptions(options: any) { + const opts = this.parseFilter(options.filter); + return { ...options, ...opts }; + } + + parseFilter(filter?: any) { + if (!filter) { + return {}; + } + const model = this.collection.model; + if (typeof filter === 'number' || typeof filter === 'string') { + return { + where: { + [model.primaryKeyAttribute]: filter, + }, + }; + } + const operators = this.database.operators; + const obj = flatten(filter || {}); + const include = {}; + const where = {}; + let skipPrefix = null; + const filter2 = {}; + for (const [key, value] of Object.entries(obj)) { + _.set(filter2, key, value); + } + for (let [key, value] of Object.entries(obj)) { + if (skipPrefix && key.startsWith(skipPrefix)) { + continue; + } + let keys = key.split('.'); + const associations = model.associations; + const paths = []; + const origins = []; + while (keys.length) { + const k = keys.shift(); + origins.push(k); + if (k.startsWith('$')) { + if (operators.has(k)) { + const opKey = operators.get(k); + if (typeof opKey === 'symbol') { + paths.push(opKey); + continue; + } else if (typeof opKey === 'function') { + skipPrefix = origins.join('.'); + // console.log({ skipPrefix }, filter2, _.get(filter2, origins)); + value = opKey(_.get(filter2, origins)); + break; + } + } else { + paths.push(k); + continue; + } + } + if (/\d+/.test(k)) { + paths.push(k); + continue; + } + if (!associations[k]) { + paths.push(k); + continue; + } + const associationKeys = []; + associationKeys.push(k); + _.set(include, k, { + association: k, + attributes: [], + }); + let target = associations[k].target; + while (target) { + const attr = keys.shift(); + if (target.rawAttributes[attr]) { + associationKeys.push(attr); + target = null; + } else if (target.associations[attr]) { + associationKeys.push(attr); + const assoc = []; + associationKeys.forEach((associationKey, index) => { + if (index > 0) { + assoc.push('include'); + } + assoc.push(associationKey); + }); + _.set(include, assoc, { + association: attr, + attributes: [], + }); + target = target.associations[attr].target; + } + } + if (associationKeys.length > 1) { + paths.push(`$${associationKeys.join('.')}$`); + } else { + paths.push(k); + } + } + console.log(paths, value); + const values = _.get(where, paths); + if ( + values && + typeof values === 'object' && + value && + typeof value === 'object' + ) { + value = { ...value, ...values }; + } + _.set(where, paths, value); + } + const toInclude = (items) => { + return Object.values(items).map((item: any) => { + if (item.include) { + item.include = toInclude(item.include); + } + return item; + }); + }; + return { where, include: toInclude(include) }; + } +} diff --git a/packages/database-next/src/update-associations.ts b/packages/database-next/src/update-associations.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5018700ad15ecc3772ecd77bbf88b51e4451b51 --- /dev/null +++ b/packages/database-next/src/update-associations.ts @@ -0,0 +1,222 @@ +import { + Sequelize, + ModelCtor, + Model, + DataTypes, + Utils, + Association, +} from 'sequelize'; + +function isUndefinedOrNull(value: any) { + return typeof value === 'undefined' || value === null; +} + +function isStringOrNumber(value: any) { + return typeof value === 'string' || typeof value === 'number'; +} + +export async function updateAssociations( + instance: Model, + values: any, + options: any = {}, +) { + const { transaction = await instance.sequelize.transaction() } = options; + // @ts-ignore + for (const key of Object.keys(instance.constructor.associations)) { + // 如果 key 不存在才跳过 + if (!Object.keys(values||{}).includes(key)) { + continue; + } + await updateAssociation(instance, key, values[key], { + ...options, + transaction, + }); + } + if (!options.transaction) { + await transaction.commit(); + } +} + +export async function updateAssociation( + instance: Model, + key: string, + value: any, + options: any = {}, +) { + // @ts-ignore + const association = instance.constructor.associations[key] as Association; + if (!association) { + return false; + } + switch (association.associationType) { + case 'HasOne': + case 'BelongsTo': + return updateSingleAssociation(instance, key, value, options); + case 'HasMany': + case 'BelongsToMany': + return updateMultipleAssociation(instance, key, value, options); + } +} + +export async function updateSingleAssociation( + model: Model, + key: string, + value: any, + options: any = {}, +) { + // @ts-ignore + const association = model.constructor.associations[key] as Association; + if (!association) { + return false; + } + if (!['undefined', 'string', 'number', 'object'].includes(typeof value)) { + return false; + } + const { transaction = await model.sequelize.transaction() } = options; + try { + // @ts-ignore + const setAccessor = association.accessors.set; + if (isUndefinedOrNull(value)) { + await model[setAccessor](null, { transaction }); + model.setDataValue(key, null); + if (!options.transaction) { + await transaction.commit(); + } + return true; + } + if (isStringOrNumber(value)) { + await model[setAccessor](value, { transaction }); + if (!options.transaction) { + await transaction.commit(); + } + return true; + } + if (value instanceof Model) { + await model[setAccessor](value); + model.setDataValue(key, value); + if (!options.transaction) { + await transaction.commit(); + } + return true; + } + // @ts-ignore + const createAccessor = association.accessors.create; + let dataKey: string; + let M: ModelCtor; + if (association.associationType === 'BelongsTo') { + M = association.target; + // @ts-ignore + dataKey = association.targetKey; + } else { + M = association.source; + dataKey = M.primaryKeyAttribute; + } + if (isStringOrNumber(value[dataKey])) { + let instance: any = await M.findOne({ + where: { + [dataKey]: value[dataKey], + }, + transaction, + }); + if (instance) { + await model[setAccessor](instance); + await updateAssociations(instance, value, { transaction, ...options }); + model.setDataValue(key, instance); + if (!options.transaction) { + await transaction.commit(); + } + return true; + } + } + const instance = await model[createAccessor](value, { transaction }); + await updateAssociations(instance, value, { transaction, ...options }); + model.setDataValue(key, instance); + // @ts-ignore + if (association.targetKey) { + model.setDataValue(association.foreignKey, instance[dataKey]); + } + if (!options.transaction) { + await transaction.commit(); + } + } catch (error) { + if (!options.transaction) { + await transaction.rollback(); + } + throw error; + } +} + +export async function updateMultipleAssociation( + model: Model, + key: string, + value: any, + options: any = {}, +) { + // @ts-ignore + const association = model.constructor.associations[key] as Association; + if (!association) { + return false; + } + if (!['undefined', 'string', 'number', 'object'].includes(typeof value)) { + return false; + } + const { transaction = await model.sequelize.transaction() } = options; + try { + // @ts-ignore + const setAccessor = association.accessors.set; + // @ts-ignore + const createAccessor = association.accessors.create; + if (isUndefinedOrNull(value)) { + await model[setAccessor](null, { transaction }); + model.setDataValue(key, null); + return; + } + if (isStringOrNumber(value)) { + await model[setAccessor](value, { transaction }); + return; + } + if (!Array.isArray(value)) { + value = [value]; + } + const list1 = []; // to be setted + const list2 = []; // to be added + for (const item of value) { + if (isUndefinedOrNull(item)) { + continue; + } + if (isStringOrNumber(item)) { + list1.push(item); + } else if (item instanceof Model) { + list1.push(item); + } else if (item.sequelize) { + list1.push(item); + } else if (typeof item === 'object') { + list2.push(item); + } + } + await model[setAccessor](list1, { transaction }); + const list3 = []; + for (const item of list2) { + const pk = association.target.primaryKeyAttribute; + if (isUndefinedOrNull(item[pk])) { + const instance = await model[createAccessor](item, { transaction }); + await updateAssociations(instance, item, { transaction, ...options }); + list3.push(instance); + } else { + const instance = await association.target.findByPk(item[pk], { transaction }); + // @ts-ignore + const addAccessor = association.accessors.add; + await model[addAccessor](item[pk], { transaction }); + await updateAssociations(instance, item, { transaction, ...options }); + list3.push(instance); + } + } + model.setDataValue(key, list1.concat(list3)); + if (!options.transaction) { + await transaction.commit(); + } + } catch (error) { + await transaction.rollback(); + throw error; + } +} diff --git a/packages/database-next/src/utils.ts b/packages/database-next/src/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..ad5a9643865297221800ed82954afec0254bec11 --- /dev/null +++ b/packages/database-next/src/utils.ts @@ -0,0 +1,18 @@ +export default { + fiter: { + and: [ + { a: 'a' }, + { b: 'b' }, + { c: 'c' }, + { 'assoc.a': 'abc1' }, + { 'assoc.b': 'abc2' }, + { 'assoc.c': 'abc3' }, + { + and: [ + { 'assoc.a': 'abc1' }, + { 'assoc.b': 'abc2' }, + ], + }, + ], + }, +}; diff --git a/packages/database/package.json b/packages/database/package.json index a8b0ed4d098d7cbc4c83fd440bbf65f18df76aa4..3fbb17af91be3b67f3279767a7833adaaa4d8d00 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@nocobase/database", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "description": "", "main": "./lib/index.js", "types": "./lib/index.d.ts", @@ -10,12 +10,12 @@ "bcrypt": "^5.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.6", - "sequelize": "^6.3.3" + "sequelize": "6.7.0" }, "repository": { "type": "git", "url": "git+https://github.com/nocobase/nocobase.git", "directory": "packages/database" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/database/src/__tests__/emitter.test.ts b/packages/database/src/__tests__/emitter.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..96370e96f5b246af66246dca106941a486cb2b77 --- /dev/null +++ b/packages/database/src/__tests__/emitter.test.ts @@ -0,0 +1,96 @@ +import { getDatabase } from './'; +import Database from '../database'; + +let db: Database; + +beforeEach(async () => { + db = getDatabase(); +}); + +afterEach(async () => { + await db.close(); +}); + +describe('emitter', () => { + it('event emitter', async () => { + db.table({ + name: 'test', + fields: [ + { + type: 'json', + name: 'arr', + defaultValue: [], + }, + ], + }); + db.table({ + name: 'test2', + fields: [ + { + type: 'json', + name: 'arr', + defaultValue: [], + }, + ], + }); + await db.sync(); + const arr = []; + db.on('afterCreate', async function abc1(...args) { + return new Promise((resolve) => { + setTimeout(() => { + console.log('db.on.afterCreate') + arr.push(1); + resolve(); + }, 200); + }); + }); + db.on('test.afterCreate', async function abc2(model, options) { + return new Promise((resolve) => { + setTimeout(() => { + console.log('db.on.test.afterCreate') + arr.push(2); + resolve(); + }, 100); + }); + }); + db.on('test2.afterCreate', async (model, options) => { + return new Promise((resolve) => { + setTimeout(() => { + console.log('db.on.test2.afterCreate') + arr.push(3); + resolve(); + }, 100); + }); + }); + const Test2 = db.getModel('test2'); + await Test2.create(); + const Test1 = db.getModel('test'); + await Test1.create(); + expect(arr).toEqual([3, 1, 2, 1]); + }); + + it.only('a', async () => { + db.table({ + name: 'test', + fields: [ + { type: 'string', name: 'name' } + ], + }); + db.on('test.afterBulkCreate', async (...args) => { + console.log('afterBulkCreate1', args); + }); + db.on('test2.afterBulkCreate', async (...args) => { + console.log('afterBulkCreate2', args); + }); + await db.sync(); + const Test = db.getModel('test'); + await Test.create(); + await Test.bulkCreate([{}, {}]); + await Test.update({ + name: 'name' + }, { + where: {}, + }); + await Test.findAll(); + }); +}); diff --git a/packages/database/src/__tests__/fields/radio.test.ts b/packages/database/src/__tests__/fields/radio.test.ts index c2b6aa5c63f924d6e8547cfa41b92dfa39ceb82e..7a946fd00092a1c920c49aa95f71648e2d3541dc 100644 --- a/packages/database/src/__tests__/fields/radio.test.ts +++ b/packages/database/src/__tests__/fields/radio.test.ts @@ -11,13 +11,13 @@ describe('radio', () => { fields: [ { type: 'string', - name: 'name' + name: 'name', }, { type: 'hasMany', - name: 'posts' - } - ] + name: 'posts', + }, + ], }); db.table({ @@ -38,25 +38,25 @@ describe('radio', () => { }, { type: 'radio', - name: 'pinned' + name: 'pinned', }, { type: 'radio', name: 'latest', - defaultValue: true + defaultValue: true, }, { type: 'radio', name: 'pinned_in_status', - scope: ['status'] + scope: ['status'], }, { type: 'radio', name: 'pinned_in_user', scope: ['user'], - defaultValue: true - } - ] + defaultValue: true, + }, + ], }); await db.sync({ force: true }); @@ -79,7 +79,7 @@ describe('radio', () => { expect(posts.map(({ pinned, latest }) => ({ pinned, latest }))).toEqual([ { pinned: true, latest: false }, - { pinned: false, latest: true } + { pinned: false, latest: true }, ]); }); @@ -107,7 +107,7 @@ describe('radio', () => { expect(posts.map(({ pinned, latest }) => ({ pinned, latest }))).toEqual([ { pinned: false, latest: false }, { pinned: true, latest: false }, - { pinned: false, latest: true } + { pinned: false, latest: true }, ]); }); @@ -117,25 +117,50 @@ describe('radio', () => { const Post = db.getModel('posts'); const bulkCreated = await Post.bulkCreate([ { title: 'title1', status: 'published', user_id: 1 }, - { title: 'title2', status: 'published', user_id: 2, pinned_in_status: true }, - { title: 'title3', status: 'draft', user_id: 1, pinned_in_status: true }, + { + title: 'title2', + status: 'published', + user_id: 2, + pinned_in_status: true, + }, + { + title: 'title3', + status: 'draft', + user_id: 1, + pinned_in_status: true, + }, ]); - expect(bulkCreated.map(({ pinned_in_status, pinned_in_user }) => ({ pinned_in_status, pinned_in_user }))).toEqual([ + expect( + bulkCreated.map(({ pinned_in_status, pinned_in_user }) => ({ + pinned_in_status, + pinned_in_user, + })), + ).toEqual([ { pinned_in_status: false, pinned_in_user: false }, { pinned_in_status: true, pinned_in_user: true }, - { pinned_in_status: true, pinned_in_user: true } + { pinned_in_status: true, pinned_in_user: true }, ]); - const user1Post = await users[1].createPost({ title: 'title4', status: 'draft', pinned_in_status: true }); + const user1Post = await users[1].createPost({ + title: 'title4', + status: 'draft', + pinned_in_status: true, + }); expect(user1Post.pinned_in_status).toBe(true); expect(user1Post.pinned_in_user).toBe(true); const posts = await Post.findAll({ order: [['id', 'ASC']] }); - expect(posts.map(({ title, pinned_in_status, pinned_in_user }) => ({ title, pinned_in_status, pinned_in_user }))).toMatchObject([ + expect( + posts.map(({ title, pinned_in_status, pinned_in_user }) => ({ + title, + pinned_in_status, + pinned_in_user, + })), + ).toMatchObject([ { title: 'title1', pinned_in_status: false, pinned_in_user: false }, { title: 'title2', pinned_in_status: true, pinned_in_user: false }, { title: 'title3', pinned_in_status: false, pinned_in_user: true }, - { title: 'title4', pinned_in_status: true, pinned_in_user: true } + { title: 'title4', pinned_in_status: true, pinned_in_user: true }, ]); }); }); @@ -145,13 +170,13 @@ describe('radio', () => { const Post = db.getModel('posts'); await Post.bulkCreate([ { title: 'title1', pinned: true }, - { title: 'title2' } + { title: 'title2' }, ]); const created = await Post.create({ pinned: false }); expect(created.pinned).toBe(false); - const posts = await Post.findAll({ order: [['title', 'ASC']] }); + const posts = await Post.findAll({ order: [['id', 'ASC']] }); expect(posts.map(({ pinned }) => pinned)).toEqual([true, false, false]); }); @@ -160,13 +185,13 @@ describe('radio', () => { const Post = db.getModel('posts'); await Post.bulkCreate([ { title: 'title1', pinned: true }, - { title: 'title2' } + { title: 'title2' }, ]); const created = await Post.create({ pinned: true }); expect(created.pinned).toBe(true); - const posts = await Post.findAll({ order: [['title', 'ASC']] }); + const posts = await Post.findAll({ order: [['id', 'ASC']] }); expect(posts.map(({ pinned }) => pinned)).toEqual([false, false, true]); }); @@ -176,7 +201,7 @@ describe('radio', () => { await Post.bulkCreate([ { title: 'bug1' }, { title: 'bug2' }, - { title: 'bug3' } + { title: 'bug3' }, ]); const post = await Post.findByPk(2); @@ -186,7 +211,7 @@ describe('radio', () => { }); await post.update({ - status: 'draft' + status: 'draft', }); const posts = await Post.findAll({ order: [['id', 'ASC']] }); diff --git a/packages/database/src/__tests__/fields/types.test.ts b/packages/database/src/__tests__/fields/types.test.ts index f65edda179b249088aa001ab6fc1524fbce763a8..dd558aba7de482111472d1e61cf21beb76fef6f8 100644 --- a/packages/database/src/__tests__/fields/types.test.ts +++ b/packages/database/src/__tests__/fields/types.test.ts @@ -33,20 +33,28 @@ describe('field types', () => { const table = db.table({ name: 'test', }); - const field = buildField({ - type: actual, - name: 'test', - }, { - sourceTable: table, - database: db, - }); + const field = buildField( + { + type: actual, + name: 'test', + }, + { + sourceTable: table, + database: db, + }, + ); + expect(field).toBeInstanceOf(expected); + if (field instanceof Column) { const { type } = field.getAttributeOptions() as any; if (actual instanceof ABSTRACT) { expect(type).toBeInstanceOf(field.getDataType()); // postgres 的 text 不限制长度,无需参数 - if (db.sequelize.getDialect() !== 'postgres' || getDataTypeKey(type) !== 'TEXT') { + if ( + db.sequelize.getDialect() !== 'postgres' || + getDataTypeKey(type) !== 'TEXT' + ) { // 非严谨比较,undefined == null expect(type).toEqual(actual); } @@ -58,7 +66,7 @@ describe('field types', () => { } } db.close(); - } + }; it('shound be boolean', () => { assertTypeInstanceOf(Boolean, 'boolean'); @@ -69,9 +77,12 @@ describe('field types', () => { assertTypeInstanceOf(Integer, 'int'); assertTypeInstanceOf(Integer, 'integer'); assertTypeInstanceOf(Integer, DataTypes.INTEGER); - assertTypeInstanceOf(Integer, DataTypes.INTEGER({ - length: 5, - })); + assertTypeInstanceOf( + Integer, + DataTypes.INTEGER({ + length: 5, + }), + ); }); it('shound be tiny integer', () => { @@ -80,9 +91,12 @@ describe('field types', () => { assertTypeInstanceOf(Integer, 'tinyinteger'); assertTypeInstanceOf(Integer, 'tinyInteger'); assertTypeInstanceOf(Integer, DataTypes.TINYINT); - assertTypeInstanceOf(Integer, DataTypes.TINYINT({ - length: 5, - })); + assertTypeInstanceOf( + Integer, + DataTypes.TINYINT({ + length: 5, + }), + ); }); it('shound be small integer', () => { @@ -91,9 +105,12 @@ describe('field types', () => { assertTypeInstanceOf(Integer, 'smallinteger'); assertTypeInstanceOf(Integer, 'smallInteger'); assertTypeInstanceOf(Integer, DataTypes.SMALLINT); - assertTypeInstanceOf(Integer, DataTypes.SMALLINT({ - length: 5, - })); + assertTypeInstanceOf( + Integer, + DataTypes.SMALLINT({ + length: 5, + }), + ); }); it('shound be medium integer', () => { @@ -102,9 +119,12 @@ describe('field types', () => { assertTypeInstanceOf(Integer, 'MediumInteger'); assertTypeInstanceOf(Integer, 'MediumInteger'); assertTypeInstanceOf(Integer, DataTypes.MEDIUMINT); - assertTypeInstanceOf(Integer, DataTypes.MEDIUMINT({ - length: 5, - })); + assertTypeInstanceOf( + Integer, + DataTypes.MEDIUMINT({ + length: 5, + }), + ); }); it('shound be big integer', () => { @@ -113,16 +133,22 @@ describe('field types', () => { assertTypeInstanceOf(Integer, 'biginteger'); assertTypeInstanceOf(Integer, 'bigInteger'); assertTypeInstanceOf(Integer, DataTypes.BIGINT); - assertTypeInstanceOf(Integer, DataTypes.BIGINT({ - length: 5, - })); + assertTypeInstanceOf( + Integer, + DataTypes.BIGINT({ + length: 5, + }), + ); }); it('shound be float', () => { assertTypeInstanceOf(Float, 'float'); - assertTypeInstanceOf(Float, DataTypes.FLOAT({ - length: 5, - })); + assertTypeInstanceOf( + Float, + DataTypes.FLOAT({ + length: 5, + }), + ); }); it('shound be double', () => { @@ -132,9 +158,12 @@ describe('field types', () => { it('shound be real', () => { assertTypeInstanceOf(Real, 'real'); - assertTypeInstanceOf(Real, DataTypes.REAL({ - length: 5, - })); + assertTypeInstanceOf( + Real, + DataTypes.REAL({ + length: 5, + }), + ); }); it('shound be decimal', () => { @@ -151,9 +180,12 @@ describe('field types', () => { it('shound be text', () => { assertTypeInstanceOf(Text, 'text'); assertTypeInstanceOf(Text, DataTypes.TEXT); - assertTypeInstanceOf(Text, DataTypes.TEXT({ - length: 'long', - })); + assertTypeInstanceOf( + Text, + DataTypes.TEXT({ + length: 'long', + }), + ); }); it('shound be time', () => { @@ -185,6 +217,9 @@ describe('field types', () => { }); it('shound be jsonb', () => { + if (process.env.DB_DIALECT === 'sqlite') { + return; + } assertTypeInstanceOf(Jsonb, 'jsonb'); assertTypeInstanceOf(Jsonb, DataTypes.JSONB); }); @@ -273,7 +308,7 @@ describe('field types', () => { name: 'password', }, ], - }) + }); db.table({ name: 'bars', tableName: 'formula_bars', @@ -281,9 +316,9 @@ describe('field types', () => { { type: 'string', name: 'col2', - } + }, ], - }) + }); await db.sync({ force: true }); }); afterEach(async () => { @@ -316,7 +351,7 @@ describe('field types', () => { await formula.updateAssociations({ bar: { col2: 'val2', - } + }, }); const f = await Formula.findOne({ where: { @@ -324,7 +359,7 @@ describe('field types', () => { }, include: { association: 'bar', - } + }, }); expect(f.reference1).toBe('val1'); expect(f.reference2).toBe('val2'); diff --git a/packages/database/src/__tests__/hooks.test.ts b/packages/database/src/__tests__/hooks.test.ts index d3ba6822e01ce2a1e09774117bcc1a05f548da0a..df6e1b4f83b375840904b99b3806e7efce2ed633 100644 --- a/packages/database/src/__tests__/hooks.test.ts +++ b/packages/database/src/__tests__/hooks.test.ts @@ -122,7 +122,7 @@ describe('hooks', () => { expect(test.get('arr')).toEqual([1, 2]); }); - it.only('add hook in custom field', async () => { + it('add hook in custom field', async () => { const table = db.table({ name: 'test3', fields: [ diff --git a/packages/database/src/__tests__/index.ts b/packages/database/src/__tests__/index.ts index 475c18964638cdfaa4378805860ce645b380bece..c1050f2ed4bbd794b5ae01de53c22b7c9c34e0bd 100644 --- a/packages/database/src/__tests__/index.ts +++ b/packages/database/src/__tests__/index.ts @@ -1,5 +1,7 @@ import Database from '../database'; import { Dialect } from 'sequelize'; +import path from 'path'; +import { uid } from '../utils'; function getTestKey() { const { id } = require.main; @@ -9,39 +11,43 @@ function getTestKey() { .replace(/src\/__tests__/g, '') .replace('.test.ts', '') .replace(/[^\w]/g, '_'); - return key + return key; } -const config = { +let config: any = { username: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, host: process.env.DB_HOST, port: Number.parseInt(process.env.DB_PORT, 10), dialect: process.env.DB_DIALECT as Dialect, - define: { - hooks: { - beforeCreate(model, options) { - - }, - }, - }, - logging: process.env.DB_LOG_SQL === 'on' ? console.log : false + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, }; +if (process.env.DB_DIALECT === 'sqlite') { + config = { + dialect: process.env.DB_DIALECT as Dialect, + storage: path.resolve(__dirname, `./.db/${uid()}.sqlite`), + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + }; +} + export function getDatabase() { return new Database({ ...config, sync: { force: true, - alter: { - drop: true, - } }, hooks: { - beforeDefine(columns, model) { - model.tableName = `${getTestKey()}_${model.tableName || model.name.plural}`; - } - } + beforeDefine(model, options) { + // @ts-ignore + options.tableNamePrefix = `${getTestKey()}_`; + // @ts-ignore + options.hookModelName = options.tableName; + options.tableName = `${getTestKey()}_${ + options.tableName || options.name.plural + }`; + }, + }, }); -}; +} diff --git a/packages/database/src/__tests__/model/model.test.ts b/packages/database/src/__tests__/model/model.test.ts index 4900febc58a37589fa75fe34d84e8d86c6a472d0..0757a46ae4192cc49fb9afc8e64a897938429677 100644 --- a/packages/database/src/__tests__/model/model.test.ts +++ b/packages/database/src/__tests__/model/model.test.ts @@ -2,8 +2,6 @@ import Database from '../..'; import { getDatabase } from '..'; import Model, { ModelCtor } from '../../model'; - - let db: Database; beforeEach(async () => { @@ -39,8 +37,8 @@ describe('model', () => { scope: { title: 'title1', }, - } - ] + }, + ], }); db.table({ @@ -51,7 +49,7 @@ describe('model', () => { type: 'string', name: 'name', }, - ] + ], }); db.table({ @@ -87,7 +85,7 @@ describe('model', () => { name: 'current_user_comments', target: 'comments', }, - ] + ], }); db.table({ @@ -98,7 +96,7 @@ describe('model', () => { type: 'string', name: 'name', }, - ] + ], }); db.table({ @@ -131,8 +129,8 @@ describe('model', () => { { type: 'string', name: 'content', - } - ] + }, + ], }); db.table({ @@ -147,7 +145,7 @@ describe('model', () => { { type: 'hasMany', name: 'fields', - } + }, ], }); @@ -161,7 +159,7 @@ describe('model', () => { { type: 'string', name: 'name', - } + }, ], }); @@ -177,7 +175,7 @@ describe('model', () => { type: 'hasMany', name: 'columns', sourceKey: 'name', - } + }, ], }); @@ -192,7 +190,7 @@ describe('model', () => { { type: 'string', name: 'name', - } + }, ], }); @@ -208,7 +206,7 @@ describe('model', () => { const user = await User.create(); const post = await Post.create(); await post.updateAssociations({ - user: user.id + user: user.id, }); const authorizedPost = await Post.findByPk(post.id); @@ -219,7 +217,7 @@ describe('model', () => { const Post = db.getModel('posts'); const post = await Post.create(); await post.updateAssociations({ - user: {} + user: {}, }); const authorizedPost = await Post.findByPk(post.id); @@ -231,7 +229,7 @@ describe('model', () => { const user = await User.create(); const post = await Post.create(); await post.updateAssociations({ - user + user, }); const authorizedPost = await Post.findByPk(post.id); @@ -244,10 +242,10 @@ describe('model', () => { const user2 = await Post.create(); const post = await Post.create(); await post.updateAssociations({ - user: user1.id + user: user1.id, }); await post.updateAssociations({ - user: user2.id + user: user2.id, }); const authorizedPost = await Post.findByPk(post.id); @@ -261,26 +259,26 @@ describe('model', () => { const post = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments: comments.map(item => item.id) + comments: comments.map((item) => item.id), }); const postComments = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id'] + attributes: ['id'], }); - expect(postComments.map(item => item.id)).toEqual([1, 2, 3, 4]); + expect(postComments.map((item) => item.id)).toEqual([1, 2, 3, 4]); }); it('update with new object', async () => { const [Post, Comment] = db.getModels(['posts', 'comments']); const post = await Post.create(); await post.updateAssociations({ - comments: [{}, {}, {}, {}] + comments: [{}, {}, {}, {}], }); const postCommentIds = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id'] + attributes: ['id'], }); - expect(postCommentIds.map(item => item.id)).toEqual([1, 2, 3, 4]); + expect(postCommentIds.map((item) => item.id)).toEqual([1, 2, 3, 4]); }); it('update with new model', async () => { @@ -288,13 +286,13 @@ describe('model', () => { const post = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments + comments, }); const postCommentIds = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id'] + attributes: ['id'], }); - expect(postCommentIds.map(item => item.id)).toEqual([1, 2, 3, 4]); + expect(postCommentIds.map((item) => item.id)).toEqual([1, 2, 3, 4]); }); it('update with exist rows/primaryKeys', async () => { @@ -302,19 +300,19 @@ describe('model', () => { const post = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments + comments, }); await post.updateAssociations({ - comments + comments, }); await post.updateAssociations({ - comments: comments.map(item => item.id) + comments: comments.map((item) => item.id), }); const postCommentIds = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id'] + attributes: ['id'], }); - expect(postCommentIds.map(item => item.id)).toEqual([1, 2, 3, 4]); + expect(postCommentIds.map((item) => item.id)).toEqual([1, 2, 3, 4]); }); it('update with exist objects', async () => { @@ -322,23 +320,25 @@ describe('model', () => { const post = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments + comments, }); await post.updateAssociations({ - comments: comments.map(item => ({ + comments: comments.map((item) => ({ ...item.get(), - content: `content${item.id}` - })) + content: `content${item.id}`, + })), }); const postComments = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id', 'content'] + attributes: ['id', 'content'], }); - expect(postComments.map(({ id, content }) => ({ id, content }))).toEqual([ + expect( + postComments.map(({ id, content }) => ({ id, content })), + ).toEqual([ { id: 1, content: 'content1' }, { id: 2, content: 'content2' }, { id: 3, content: 'content3' }, - { id: 4, content: 'content4' } + { id: 4, content: 'content4' }, ]); }); @@ -348,39 +348,43 @@ describe('model', () => { const post2 = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments + comments, }); const postComments = await Comment.findAll({ - where: { post_id: post.id } + where: { post_id: post.id }, }); - expect(postComments.map(({ id, post_id }) => ({ id, post_id }))).toEqual([ + expect( + postComments.map(({ id, post_id }) => ({ id, post_id })), + ).toEqual([ { id: 1, post_id: post.id }, { id: 2, post_id: post.id }, { id: 3, post_id: post.id }, - { id: 4, post_id: post.id } + { id: 4, post_id: post.id }, ]); await post2.updateAssociations({ - comments: postComments.map(item => ({ + comments: postComments.map((item) => ({ ...item.get(), - content: `content${item.id}` - })) + content: `content${item.id}`, + })), }); const updatedComments = await Comment.findAll(); const post1CommentsCount = await Comment.count({ - where: { post_id: post.id } + where: { post_id: post.id }, }); expect(post1CommentsCount).toBe(0); const post2Comments = await Comment.findAll({ where: { post_id: post2.id }, - attributes: ['id', 'content'] + attributes: ['id', 'content'], }); - expect(post2Comments.map(({ id, content }) => ({ id, content }))).toEqual([ + expect( + post2Comments.map(({ id, content }) => ({ id, content })), + ).toEqual([ { id: 1, content: 'content1' }, { id: 2, content: 'content2' }, { id: 3, content: 'content3' }, - { id: 4, content: 'content4' } + { id: 4, content: 'content4' }, ]); }); @@ -389,17 +393,17 @@ describe('model', () => { const post = await Post.create(); const comments = await Comment.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - comments + comments, }); await post.updateAssociations({ comments: comments .filter(({ id }) => Boolean(id % 2)) - .concat(...[await Comment.create()]) + .concat(...[await Comment.create()]), }); const postComments = await Comment.findAll({ where: { post_id: post.id }, - attributes: ['id'] + attributes: ['id'], }); expect(postComments.map(({ id }) => id)).toEqual([1, 3, 5]); }); @@ -407,37 +411,47 @@ describe('model', () => { describe('belongsToMany', () => { it('update with primary key', async () => { - const [Post, Tag, PostTag] = db.getModels(['posts', 'tags', 'posts_tags']); + const [Post, Tag, PostTag] = db.getModels([ + 'posts', + 'tags', + 'posts_tags', + ]); const post = await Post.create(); const tags = await Tag.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - tags: tags.map(item => item.id) + tags: tags.map((item) => item.id), }); const tagged = await PostTag.findAll({ where: { post_id: post.id }, - attributes: ['tag_id'] + attributes: ['tag_id'], }); - expect(tagged.map(item => item.tag_id)).toEqual([1, 2, 3, 4]); + expect(tagged.map((item) => item.tag_id)).toEqual([1, 2, 3, 4]); }); it('update with exist rows/primaryKeys', async () => { - const [Post, Tag, PostTag] = db.getModels(['posts', 'tags', 'posts_tags']); + const [Post, Tag, PostTag] = db.getModels([ + 'posts', + 'tags', + 'posts_tags', + ]); const post = await Post.create(); const tags = await Tag.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - tags: tags.map(item => item.id) + tags: tags.map((item) => item.id), }); await post.updateAssociations({ - tags: tags.map(item => item.id) + tags: tags.map((item) => item.id), }); await post.updateAssociations({ - tags + tags, }); const tagged = await PostTag.findAll({ where: { post_id: post.id }, - attributes: ['tag_id', 'post_id'] + attributes: ['tag_id', 'post_id'], }); - expect(tagged.map(({ post_id, tag_id }) => ({ post_id, tag_id }))).toEqual([ + expect( + tagged.map(({ post_id, tag_id }) => ({ post_id, tag_id })), + ).toEqual([ { tag_id: 1, post_id: 1 }, { tag_id: 2, post_id: 1 }, { tag_id: 3, post_id: 1 }, @@ -446,35 +460,47 @@ describe('model', () => { }); it('update with exist rows/primaryKeys and new objects', async () => { - const [Post, Tag, PostTag] = db.getModels(['posts', 'tags', 'posts_tags']); + const [Post, Tag, PostTag] = db.getModels([ + 'posts', + 'tags', + 'posts_tags', + ]); const post = await Post.create(); const tags = await Tag.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - tags: tags.map(item => item.id) + tags: tags.map((item) => item.id), }); await post.updateAssociations({ - tags: tags.filter(({ id }) => Boolean(id % 2)).concat(await Tag.create({})) + tags: tags + .filter(({ id }) => Boolean(id % 2)) + .concat(await Tag.create({})), }); const tagged = await PostTag.findAll({ where: { post_id: post.id }, - attributes: ['tag_id'] + attributes: ['tag_id'], }); expect(tagged.map(({ tag_id }) => tag_id)).toEqual([1, 3, 5]); }); it('update other with exist rows/primaryKeys', async () => { - const [Post, Tag, PostTag] = db.getModels(['posts', 'tags', 'posts_tags']); + const [Post, Tag, PostTag] = db.getModels([ + 'posts', + 'tags', + 'posts_tags', + ]); const post = await Post.create(); const post2 = await Post.create(); const tags = await Tag.bulkCreate([{}, {}, {}, {}]); await post.updateAssociations({ - tags: tags.map(item => item.id) + tags: tags.map((item) => item.id), }); await post2.updateAssociations({ - tags + tags, }); const tagged = await PostTag.findAll(); - expect(tagged.map(({ post_id, tag_id }) => ({ post_id, tag_id }))).toEqual([ + expect( + tagged.map(({ post_id, tag_id }) => ({ post_id, tag_id })), + ).toEqual([ { tag_id: 1, post_id: 1 }, { tag_id: 2, post_id: 1 }, { tag_id: 3, post_id: 1 }, @@ -492,17 +518,20 @@ describe('model', () => { const post = await Post.create(); const tag = await Tag.create(); await post.updateAssociations({ - tags: [{ - name: 'xxx', - posts_tags: { - name: 'name134', - } - }, { - id: tag.id, - posts_tags: { - name: 'name234', - } - }], + tags: [ + { + name: 'xxx', + posts_tags: { + name: 'name134', + }, + }, + { + id: tag.id, + posts_tags: { + name: 'name234', + }, + }, + ], }); const PostTag = db.getModel('posts_tags'); const [t1, t2] = await PostTag.findAll({ @@ -518,7 +547,11 @@ describe('model', () => { describe('scope', () => { it('scope', async () => { - const [User, Post, Comment] = db.getModels(['users', 'posts', 'comments']); + const [User, Post, Comment] = db.getModels([ + 'users', + 'posts', + 'comments', + ]); const user1 = await User.create(); const user2 = await User.create(); const user3 = await User.create(); @@ -565,8 +598,8 @@ describe('model', () => { return { where: { name: name, - } - } + }, + }; }); const [User, Post] = db.getModels(['users', 'posts']); @@ -589,29 +622,22 @@ describe('model', () => { posts: post, }); await post.updateAssociations({ - tags: [ - { name: 'tag1' }, - { name: 'tag2' }, - { name: 'tag3' }, - ], + tags: [{ name: 'tag1' }, { name: 'tag2' }, { name: 'tag3' }], }); // where & include const options = Post.parseApiJson({ filter: { title: 'title112233', - user: { // belongsTo + user: { + // belongsTo name: 'name112233', }, - tags: { // belongsToMany + tags: { + // belongsToMany scopeName: 'tag3', }, }, - fields: [ - 'title', - 'tags_count', - 'tags.name', - 'user.name' - ], + fields: ['title', 'tags_count', 'tags.name', 'user.name'], sort: '-tags_count,tags.name,user.posts_count', context: { scopeName: 'tag3', @@ -631,7 +657,7 @@ describe('model', () => { // console.log(JSON.stringify(rows[0].toJSON(), null, 2)); - rows.forEach(row => { + rows.forEach((row) => { // expect(row.toJSON()).toEqual({ title: 'title112233', 'tags_count': 3, user: { name: 'name112233', posts_count: 1 } }); expect(row.get('title')).toBe('title112233'); expect(row.user.get('name')).toBe('name112233'); @@ -694,7 +720,7 @@ describe('model', () => { include: [ User.withCountAttribute({ association: 'posts', - alias: 'posts2_count' + alias: 'posts2_count', }), ], }, @@ -736,7 +762,9 @@ describe('model', () => { include: [ { association: 'user', - attributes: ['id', 'name', + attributes: [ + 'id', + 'name', User.withCountAttribute({ sourceAlias: 'user', association: 'posts', @@ -752,7 +780,7 @@ describe('model', () => { expect(post.get('tags_count')).toBe(5); expect(post.get('tags_name1_count')).toBe(1); expect(post.user.get('posts_count')).toBe(1); - post.tags.forEach(tag => { + post.tags.forEach((tag) => { expect(tag.get('posts_count')).toBe(1); }); }); @@ -904,9 +932,7 @@ describe('model', () => { name: 'examples', }); await table.updateAssociations({ - fields: [ - { name: 'name' }, - ] + fields: [{ name: 'name' }], }); const field = await Field.findOne({ where: { @@ -924,9 +950,7 @@ describe('model', () => { name: 'examples', }); await row.updateAssociations({ - columns: [ - { name: 'name' }, - ] + columns: [{ name: 'name' }], }); const column = await Column.findOne({ where: { @@ -950,7 +974,7 @@ describe('model', () => { id: field.id, name: 'nam1234', }, - ] + ], }); const f = await Field.findOne({ @@ -973,7 +997,6 @@ describe('model', () => { }); describe('blongsTo', () => { - it('shoud associated id when association is integer', async () => { const [User, Post] = db.getModels(['users', 'posts']); const user = await User.create(); @@ -1143,7 +1166,7 @@ describe('model', () => { const post = await Post.create(); await post.updateAssociations({ tags: { - name: 'tag1' + name: 'tag1', }, }); const count = await post.countTags(); @@ -1156,10 +1179,10 @@ describe('model', () => { await post.updateAssociations({ tags: [ { - name: 'tag2' + name: 'tag2', }, { - name: 'tag3' + name: 'tag3', }, ], }); @@ -1239,9 +1262,11 @@ describe('belongsToMany', () => { }); it('update with new object', async () => { await post.updateAssociations({ - tags: [{ - name: 'tag3', - }], + tags: [ + { + name: 'tag3', + }, + ], }); expect(await post.countTags()).toBe(1); }); diff --git a/packages/database/src/__tests__/model/updateAssociations2.test.ts b/packages/database/src/__tests__/model/updateAssociations2.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..4294bd49ce7841e652a3faefe1cab6b1a21aea3e --- /dev/null +++ b/packages/database/src/__tests__/model/updateAssociations2.test.ts @@ -0,0 +1,58 @@ +import { getDatabase } from '..'; +import Database from '../..'; + +let db: Database; + +beforeEach(async () => { + db = getDatabase(); + db.table({ + name: 'routes', + fields: [ + { + type: 'uid', + name: 'key', + prefix: 'r_', + primaryKey: true, + }, + { + type: 'belongsTo', + name: 'uiSchema', + target: 'ui_schemas', + }, + ], + }); + db.table({ + name: 'ui_schemas', + fields: [ + { + type: 'uid', + name: 'key', + primaryKey: true, + }, + { + type: 'string', + name: 'name', + }, + ], + }); + await db.sync(); +}); + +afterEach(async () => { + await db.close(); +}); + +describe('updateAssociations', () => { + it('belongsTo', async () => { + const [Route, Schema] = db.getModels(['routes', 'ui_schemas']); + const route = await Route.create(); + await route.updateAssociations({ + uiSchema: { + key: '6kyo0t1jnpw', + // name: '6kyo0t1jnpw' + }, + }); + const schema = await Schema.findByPk('6kyo0t1jnpw'); + expect(schema).toBeDefined(); + }); +}); diff --git a/packages/database/src/__tests__/op.test.ts b/packages/database/src/__tests__/op.test.ts index 0e27a404182dea7c1bd389d0cbcda3d07995f632..24abc991670152db43502f23088291b0b65e63b5 100644 --- a/packages/database/src/__tests__/op.test.ts +++ b/packages/database/src/__tests__/op.test.ts @@ -29,6 +29,7 @@ afterEach(async () => { describe('op', () => { it('test', async () => { + if ((process.env.DB_DIALECT = 'sqlite')) return; const Test = db.getModel('tests'); await Test.bulkCreate([ { @@ -42,7 +43,7 @@ describe('op', () => { }, { arr: ['dd'], - } + }, ]); const options = Test.parseApiJson({ filter: { diff --git a/packages/database/src/database.ts b/packages/database/src/database.ts index dcf166189b0add7479571df65e12c49418f82c7f..af452566927199183d1f39d2509117f5faa93e26 100644 --- a/packages/database/src/database.ts +++ b/packages/database/src/database.ts @@ -8,6 +8,7 @@ import Table, { MergeOptions, TableOptions } from './table'; import { Model, ModelCtor } from './model'; import { requireModule } from './utils'; import _ from 'lodash'; +import { EventEmitter } from 'events'; export interface SyncOptions extends SequelizeSyncOptions { @@ -33,7 +34,7 @@ export interface ImportOptions { export interface DatabaseOptions extends Options { } -export type HookType = 'beforeTableInit' | 'afterTableInit' | 'beforeAddField' | 'afterAddField'; +// export type HookType = 'beforeTableInit' | 'afterTableInit' | 'beforeAddField' | 'afterAddField'; export class Extend { tableOptions: TableOptions; @@ -48,7 +49,41 @@ export function extend(tableOptions: TableOptions, mergeOptions: MergeOptions = return new Extend(tableOptions, mergeOptions); } -export default class Database { +type HookType = + 'beforeValidate' | + 'afterValidate' | + 'beforeCreate' | + 'afterCreate' | + 'beforeDestroy' | + 'afterDestroy' | + 'beforeRestore' | + 'afterRestore' | + 'beforeUpdate' | + 'afterUpdate' | + 'beforeSave' | + 'afterSave' | + 'beforeBulkCreate' | + 'afterBulkCreate' | + 'beforeBulkDestroy' | + 'afterBulkDestroy' | + 'beforeBulkRestore' | + 'afterBulkRestore' | + 'beforeBulkUpdate' | + 'afterBulkUpdate' | + 'beforeSync' | + 'afterSync' | + 'beforeBulkSync' | + 'afterBulkSync' | + 'beforeDefine' | + 'afterDefine' | + 'beforeInit' | + 'afterInit' | + 'beforeConnect' | + 'afterConnect' | + 'beforeDisconnect' | + 'afterDisconnect'; + + export default class Database extends EventEmitter { public readonly sequelize: Sequelize; @@ -70,11 +105,148 @@ export default class Database { protected extTableOptions = new Map(); - constructor(options: DatabaseOptions) { + protected hookTypes = new Map(Object.entries({ + beforeValidate: 1, + afterValidate: 1, + beforeCreate: 1, + afterCreate: 1, + beforeDestroy: 1, + afterDestroy: 1, + beforeRestore: 1, + afterRestore: 1, + beforeUpdate: 1, + afterUpdate: 1, + beforeSave: 1, + afterSave: 1, + + beforeBulkCreate: 2, + afterBulkCreate: 2, + + beforeBulkDestroy: 3, + afterBulkDestroy: 3, + beforeBulkRestore: 3, + afterBulkRestore: 3, + beforeBulkUpdate: 3, + afterBulkUpdate: 3, + + beforeSync: 4, + afterSync: 4, + beforeBulkSync: 4, + afterBulkSync: 4, + + beforeDefine: 0, + afterDefine: 0, + beforeInit: 0, + afterInit: 0, + beforeConnect: 0, + afterConnect: 0, + beforeDisconnect: 0, + afterDisconnect: 0, + })); + + constructor(options?: DatabaseOptions) { + super(); this.options = options; this.sequelize = new Sequelize(options); } + private _getHookType(event: any) { + if (typeof event === 'string') { + event = event.split('.'); + } + if (!Array.isArray(event)) { + return; + } + const hookType = [...event].pop(); + if (!this.hookTypes.has(hookType)) { + return; + } + return hookType; + } + + on(event: HookType | Omit | symbol, listener: (...args: any[]) => void) { + const hookType = this._getHookType(event); + if (hookType) { + const state = this.hookTypes.get(hookType); + + this.sequelize.addHook(hookType, async (...args: any[]) => { + let modelName: string; + switch (state) { + case 1: + modelName = args?.[0]?.constructor?.name; + break; + case 2: + modelName = args?.[1]?.model?.name; + break; + case 3: + modelName = args?.[0]?.model?.name; + break; + } + // console.log({ modelName, args }); + if (modelName) { + await this.emitAsync(`${modelName}.${hookType}`, ...args); + } + await this.emitAsync(hookType, ...args); + }); + this.hookTypes.delete(hookType); + } + return super.on(event as any, listener); + } + + async emitAsync(event: string | symbol, ...args: any[]): Promise { + // @ts-ignore + const events = this._events; + let callbacks = events?.[event]; + if (!callbacks) { + return false; + } + // helper function to reuse as much code as possible + const run = (cb) => { + switch (args.length) { + // fast cases + case 0: + cb = cb.call(this); + break; + case 1: + cb = cb.call(this, args[0]); + break; + case 2: + cb = cb.call(this, args[0], args[1]); + break; + case 3: + cb = cb.call(this, args[0], args[1], args[2]); + break; + // slower + default: + cb = cb.apply(this, args); + } + + if ( + cb && ( + cb instanceof Promise || + typeof cb.then === 'function' + ) + ) { + return cb; + } + + return Promise.resolve(true); + }; + + if (typeof callbacks === 'function') { + await run(callbacks); + } else if (typeof callbacks === 'object') { + callbacks = callbacks.slice().filter(Boolean); + await callbacks.reduce((prev, next) => { + return prev.then((res) => { + return run(next).then((result) => Promise.resolve(res.concat(result))); + }); + }, Promise.resolve([])); + } + + return true; + } + /** * 载入指定目录下 tables 配置(配置的文件驱动) * @@ -289,6 +461,7 @@ export default class Database { * 关闭数据库连接 */ public async close() { + this.removeAllListeners(); return this.sequelize.close(); } @@ -298,7 +471,7 @@ export default class Database { * @param hookType * @param fn */ - public addHook(hookType: HookType | string, fn: Function) { + public addHook(hookType: HookType | string, fn: Function) { const hooks = this.hooks[hookType] || []; hooks.push(fn); this.hooks[hookType] = hooks; diff --git a/packages/database/src/fields/field-types.ts b/packages/database/src/fields/field-types.ts index 3583292e3ff0444b5a5d87454566c4687f20f1a0..8cbe7c34a9b9e8ebe8f31209065c9dc9c899248e 100644 --- a/packages/database/src/fields/field-types.ts +++ b/packages/database/src/fields/field-types.ts @@ -18,7 +18,7 @@ import { getDataTypeKey } from '.'; import Table from '../table'; import Database from '../database'; import Model, { ModelCtor } from '../model'; -import { whereCompare, isNumber } from '../utils'; +import { whereCompare, isNumber, uid } from '../utils'; export interface IField { @@ -298,9 +298,10 @@ export class PASSWORD extends STRING { constructor(options: Options.StringOptions, context: FieldContext) { super(options, context); - const Model = context.sourceTable.getModel(); - Model.addHook('beforeCreate', PASSWORD.hash.bind(this)); - Model.addHook('beforeUpdate', PASSWORD.hash.bind(this)); + const { database, sourceTable } = context; + const name = sourceTable.getName(); + database.on(`${name}.beforeCreate`, PASSWORD.hash.bind(this)); + database.on(`${name}.beforeUpdate`, PASSWORD.hash.bind(this)); } public static async hash(this: PASSWORD, model) { @@ -344,14 +345,47 @@ export class ARRAY extends Column { export class JSON extends Column { public getDataType() { - return DataTypes.JSONB; + return DataTypes.JSON; } } export class JSONB extends Column { + public getDataType() { + if (this.context.database.sequelize.getDialect() === 'postgres') { + return DataTypes.JSONB; + } + return DataTypes.JSON; + } } export class UUID extends Column { + public getDataType() { + return DataTypes.UUID; + } +} + +export class UID extends Column { + + constructor(options: Options.StringOptions, context: FieldContext) { + super(options, context); + const { sourceTable, database } = context; + const { name, prefix = '' } = options; + database.on(`${sourceTable.getName()}.beforeCreate`, (model) => { + if (!model.get(name)) { + model.set(name, `${prefix}${uid()}`); + } + }); + } + + public getDataType() { + return DataTypes.STRING; + } +} + +export class UUIDV4 extends Column { + public getDataType() { + return DataTypes.UUIDV4; + } } export interface HasOneAccessors { @@ -396,10 +430,11 @@ export abstract class Relation extends Field { public targetTableInit() { const { target, fields = [] } = this.options; - if (target && fields.length) { + const children = fields.concat(this.options.children || []); + if (target && children.length) { this.context.database.table({ name: target, - fields, + fields: children, }); } } @@ -791,10 +826,14 @@ export class SORT extends NUMBER { constructor(options: Options.SortOptions, context: FieldContext) { super(options, context); - const Model = context.sourceTable.getModel(); + // const Model = context.sourceTable.getModel(); // TODO(feature): 可考虑策略模式,以在需要时对外提供接口 - Model.addHook('beforeCreate', SORT.beforeCreateHook.bind(this)); - Model.addHook('beforeBulkCreate', SORT.beforeBulkCreateHook.bind(this)); + const { database, sourceTable } = context; + const name = sourceTable.getName(); + database.on(`${name}.beforeCreate`, SORT.beforeCreateHook.bind(this)); + database.on(`${name}.beforeBulkCreate`, SORT.beforeBulkCreateHook.bind(this)); + // Model.addHook('beforeCreate', SORT.beforeCreateHook.bind(this)); + // Model.addHook('beforeBulkCreate', SORT.beforeBulkCreateHook.bind(this)); } public getDataType(): Function { @@ -873,15 +912,20 @@ export class Radio extends BOOLEAN { } constructor({ type, ...options }: Options.RadioOptions, context: FieldContext) { - super({ ...options, type: 'boolean' }, context); - const Model = context.sourceTable.getModel(); + super({ ...options, type: 'radio' }, context); + // const Model = context.sourceTable.getModel(); // TODO(feature): 可考虑策略模式,以在需要时对外提供接口 - Model.addHook('beforeCreate', Radio.beforeCreateHook.bind(this)); - Model.addHook('beforeUpdate', Radio.beforeUpdateHook.bind(this)); - // Model.addHook('beforeUpsert', beforeSaveHook); - Model.addHook('beforeBulkCreate', Radio.beforeBulkCreateHook.bind(this)); + // Model.addHook('beforeCreate', Radio.beforeCreateHook.bind(this)); + // Model.addHook('beforeUpdate', Radio.beforeUpdateHook.bind(this)); + // // Model.addHook('beforeUpsert', beforeSaveHook); + // Model.addHook('beforeBulkCreate', Radio.beforeBulkCreateHook.bind(this)); // TODO(optimize): bulkUpdate 的 hooks 参数不一样,没有对象列表,考虑到很少用,暂时不实现 // Model.addHook('beforeBulkUpdate', beforeBulkCreateHook); + const { database, sourceTable } = context; + const name = sourceTable.getName(); + database.on(`${name}.beforeCreate`, Radio.beforeCreateHook.bind(this)); + database.on(`${name}.beforeUpdate`, Radio.beforeUpdateHook.bind(this)); + database.on(`${name}.beforeBulkCreate`, Radio.beforeBulkCreateHook.bind(this)); } public getDataType() { diff --git a/packages/database/src/fields/option-types.ts b/packages/database/src/fields/option-types.ts index 69519a843029104d11af02240a63805564008379..2db7e558d6a6e9bf3b5e9305ad938393c05ee7e3 100644 --- a/packages/database/src/fields/option-types.ts +++ b/packages/database/src/fields/option-types.ts @@ -221,7 +221,8 @@ export type ColumnOptions = AbstractFieldOptions | JsonOptions | VirtualOptions | FormulaOptions - | ReferenceOptions; + | ReferenceOptions + | SortOptions; export type ElementOptions = BooleanOptions | IntegerOptions @@ -236,7 +237,8 @@ export type ElementOptions = BooleanOptions | DateOnlyOptions | ArrayOptions | JsonOptions - | VirtualOptions; + | VirtualOptions + | SortOptions; export type RelationOptions = HasOneOptions | HasManyOptions | BelongsToOptions | BelongsToManyOptions; diff --git a/packages/database/src/model.ts b/packages/database/src/model.ts index ac430852213a3f56e42974794b5c63b151cc98f7..4bbf08244a1cfc610be58a5b5bb758c7d300b367 100644 --- a/packages/database/src/model.ts +++ b/packages/database/src/model.ts @@ -1,5 +1,10 @@ import { - Model as SequelizeModel, Op, Sequelize, ProjectionAlias, Utils, SaveOptions + Model as SequelizeModel, + Op, + Sequelize, + ProjectionAlias, + Utils, + SaveOptions, } from 'sequelize'; import Database from './database'; import { @@ -12,48 +17,50 @@ import { import { toInclude } from './utils'; export interface ApiJsonOptions { - /** * 字段 - * + * * 数组式: * ['col', 'association.col1', 'association_count'], - * + * * 白名单: * { * only: ['col1'], * appends: ['association_count'], * } - * + * * 黑名单: * { * except: ['col1'], * appends: ['association_count'], * } */ - fields?: string[] | { - only?: string[]; - appends?: string[]; - } | { - except?: string[]; - appends?: string[]; - }; + fields?: + | string[] + | { + only?: string[]; + appends?: string[]; + } + | { + except?: string[]; + appends?: string[]; + }; /** * 过滤 - * + * * 常规用法: * { * col1: { * $eq: 'val1' * }, * } - * + * * scope 的用法(如果 scope 与 col 同名,只会执行 scope): * { * scope1: value * } - * + * * json 数据 & 关系数据,可以用点号: * { * 'association.col1': { @@ -67,7 +74,7 @@ export interface ApiJsonOptions { * $eq: 'val1' * }, * } - * + * * json 数据 & 关系数据的查询也可以不用点号: * { * association: { @@ -81,9 +88,9 @@ export interface ApiJsonOptions { /** * 排序 - * + * * TODO - * + * * ['col1', '-col2', 'association.col1', '-association.col2'] */ sort?: any; @@ -100,7 +107,6 @@ export interface ApiJsonOptions { } export interface WithCountAttributeOptions { - /** * 关系名 */ @@ -108,9 +114,9 @@ export interface WithCountAttributeOptions { /** * SourceModel 别名 - * + * * 在 include 里使用时,需要指定,一般与 include 的 association 同名 - * + * * include: { * association: 'user', // Post.belongsTo(User) * attributes: [ @@ -143,12 +149,11 @@ export interface UpdateAssociationOptions extends SaveOptions { /** * Model 相关 - * + * * TODO: 自定义 model 时的提示问题 */ // @ts-ignore export abstract class Model extends SequelizeModel { - /** * 防止 ts 报错提示 */ @@ -156,7 +161,7 @@ export abstract class Model extends SequelizeModel { /** * 当前 Model 的 database - * + * * 与 Model.sequelize 对应,database 也用了 public static readonly */ public static database: Database; @@ -171,17 +176,25 @@ export abstract class Model extends SequelizeModel { /** * sub query 关联数据的数量 - * + * * TODO: 关联字段暂不支持主键以外的字段 - * - * @param options + * + * @param options */ - static withCountAttribute(options?: string | WithCountAttributeOptions): (string | ProjectionAlias) { + static withCountAttribute( + options?: string | WithCountAttributeOptions, + ): string | ProjectionAlias { if (typeof options === 'string') { options = { association: options }; } - const { sourceAlias, association, where = {}, alias, ...restOptions } = options; + const { + sourceAlias, + association, + where = {}, + alias, + ...restOptions + } = options; const associator = this.associations[association]; const table = this.database.getTable(this.name); const field = table.getField(association); @@ -193,17 +206,20 @@ export abstract class Model extends SequelizeModel { }; } else if (associator.associationType === 'BelongsToMany') { where[targetKey] = { - // @ts-ignore - [Op.in]: Sequelize.literal(`(${associator.through.model.selectQuery({ - attributes: [otherKey], - where: { - [foreignKey]: { - [Op.eq]: Sequelize.col(`${sourceAlias || this.name}.${sourceKey}`), + [Op.in]: Sequelize.literal( + `(${(associator as any).through.model.selectQuery({ + attributes: [otherKey], + where: { + [foreignKey]: { + [Op.eq]: Sequelize.col( + `${sourceAlias || this.name}.${sourceKey}`, + ), + }, + // @ts-ignore + ...(associator.through.scope || {}), }, - // @ts-ignore - ...(associator.through.scope || {}), - }, - })})`), + })})`, + ), }; } @@ -221,41 +237,47 @@ export abstract class Model extends SequelizeModel { attributes: [[Sequelize.literal(countLiteral), 'count']], where: { // @ts-ignore - ...where, ...(associator.scope || {}), + ...where, + ...((associator as any).scope || {}), }, - })})` + })})`, ), - alias || Utils.underscoredIf(`${association}Count`, this.options.underscored), + alias || + Utils.underscoredIf(`${association}Count`, this.options.underscored), ].filter(Boolean); - return attribute as unknown as ProjectionAlias; + return (attribute as unknown) as ProjectionAlias; } /** * 当前 Model 的 SQL - * - * @param options + * + * @param options */ static selectQuery(options = {}): string { // @ts-ignore - return this.queryGenerator.selectQuery( - this.getTableName(), - options, - this, - ).replace(/;$/, ''); + return this.queryGenerator + .selectQuery(this.getTableName(), options, this) + .replace(/;$/, ''); } static parseApiJson(options: ApiJsonOptions) { const { fields, filter, sort, context, page, perPage } = options; - const data = toInclude({ fields, filter, sort }, { - model: this, - associations: this.associations, - dialect: this.sequelize.getDialect(), - ctx: context, - database: this.database, - }); + const data = toInclude( + { fields, filter, sort }, + { + model: this, + associations: this.associations, + dialect: this.sequelize.getDialect(), + ctx: context, + database: this.database, + }, + ); if (page || perPage) { - data.limit = perPage === -1 ? MAX_LIMIT : Math.min(perPage || DEFAULT_LIMIT, MAX_LIMIT); + data.limit = + perPage === -1 + ? MAX_LIMIT + : Math.min(perPage || DEFAULT_LIMIT, MAX_LIMIT); data.offset = data.limit * (page > 0 ? page - 1 : DEFAULT_OFFSET); } if (data.attributes && data.attributes.length === 0) { @@ -269,11 +291,12 @@ export abstract class Model extends SequelizeModel { const Model = table.getModel(); const associations = table.getAssociations(); const where = {}; - scope.forEach(col => { + scope.forEach((col) => { const association = associations.get(col); - const dataKey = association && association instanceof BELONGSTO - ? association.options.foreignKey - : col; + const dataKey = + association && association instanceof BELONGSTO + ? association.options.foreignKey + : col; if (!Model.rawAttributes[dataKey]) { return; } @@ -285,7 +308,11 @@ export abstract class Model extends SequelizeModel { return where; } - async updateSingleAssociation(key: string, data: any, options: UpdateAssociationOptions = {}) { + async updateSingleAssociation( + key: string, + data: any, + options: UpdateAssociationOptions = {}, + ) { const { fields, transaction = await this.sequelize.transaction(), @@ -302,25 +329,35 @@ export abstract class Model extends SequelizeModel { return; } - if (typeof data === 'number' || typeof data === 'string' || data instanceof SequelizeModel) { + if ( + typeof data === 'number' || + typeof data === 'string' || + data instanceof SequelizeModel + ) { await this[accessors.set](data, opts); } else if (typeof data === 'object') { const Target = association.getTargetModel(); - const targetAttribute = association instanceof BELONGSTO - ? association.options.targetKey - : association.options.sourceKey; + const targetAttribute = + association instanceof BELONGSTO + ? association.options.targetKey + : association.options.sourceKey; if (data[targetAttribute]) { - await this[accessors.set](data[targetAttribute], opts); - if (Object.keys(data).length > 1) { + if (Object.keys(data).length > 0) { const target = await Target.findOne({ where: { [targetAttribute]: data[targetAttribute], }, - transaction + transaction, }); - await target.update(data, opts); - // @ts-ignore - await target.updateAssociations(data, opts); + if (target) { + await this[accessors.set](data[targetAttribute], opts); + await target.update(data, opts); + // @ts-ignore + await target.updateAssociations(data, opts); + } else { + const t = await this[accessors.create](data, opts); + await t.updateAssociations(data, opts); + } } } else { const t = await this[accessors.create](data, opts); @@ -332,7 +369,11 @@ export abstract class Model extends SequelizeModel { } } - async updateMultipleAssociation(associationName: string, data: any, options: UpdateAssociationOptions = {}) { + async updateMultipleAssociation( + associationName: string, + data: any, + options: UpdateAssociationOptions = {}, + ) { const items = Array.isArray(data) ? data : data == null ? [] : [data]; const { @@ -366,7 +407,7 @@ export abstract class Model extends SequelizeModel { const toUpsertObjects = []; // 遍历所有值成员准备数据 - items.forEach(item => { + items.forEach((item) => { if (item instanceof SequelizeModel) { if (targetKeyIsPk) { toSetPks.add(item.getDataValue(targetPk)); @@ -376,14 +417,18 @@ export abstract class Model extends SequelizeModel { return; } if (typeof item === 'number' || typeof item === 'string') { - let targetKeyType = getDataTypeKey(Target.rawAttributes[targetKey].type).toLocaleLowerCase(); + let targetKeyType = getDataTypeKey( + Target.rawAttributes[targetKey].type, + ).toLocaleLowerCase(); if (targetKeyType === 'integer') { targetKeyType = 'number'; } // 如果传值类型与之前在 Model 上定义的 targetKey 不同,则报错。 // 不应兼容定义的 targetKey 不是 primaryKey 却传了 primaryKey 的值的情况。 if (typeof item !== targetKeyType) { - throw new Error(`target key type [${typeof item}] does not match to [${targetKeyType}]`); + throw new Error( + `target key type [${typeof item}] does not match to [${targetKeyType}]`, + ); } if (targetKeyIsPk) { toSetPks.add(item); @@ -399,31 +444,35 @@ export abstract class Model extends SequelizeModel { /* 仅传关联键处理开始 */ // 查找已存在的数据 - const byPkExistItems = toSetPks.size ? await Target.findAll({ - ...opts, - // @ts-ignore - where: { - [targetPk]: { - [Op.in]: Array.from(toSetPks) - } - }, - attributes: [targetPk] - }) : []; - byPkExistItems.forEach(item => { + const byPkExistItems = toSetPks.size + ? await Target.findAll({ + ...opts, + // @ts-ignore + where: { + [targetPk]: { + [Op.in]: Array.from(toSetPks), + }, + }, + attributes: [targetPk], + }) + : []; + byPkExistItems.forEach((item) => { toSetItems.add(item); }); - const byUkExistItems = toSetUks.size ? await Target.findAll({ - ...opts, - // @ts-ignore - where: { - [targetKey]: { - [Op.in]: Array.from(toSetUks) - } - }, - attributes: [targetPk, targetKey] - }) : []; - byUkExistItems.forEach(item => { + const byUkExistItems = toSetUks.size + ? await Target.findAll({ + ...opts, + // @ts-ignore + where: { + [targetKey]: { + [Op.in]: Array.from(toSetUks), + }, + }, + attributes: [targetPk, targetKey], + }) + : []; + byUkExistItems.forEach((item) => { toSetItems.add(item); }); /* 仅传关联键处理结束 */ @@ -453,7 +502,7 @@ export abstract class Model extends SequelizeModel { if (association instanceof BELONGSTOMANY) { belongsToManyList.push({ item, - target + target, }); } @@ -469,7 +518,6 @@ export abstract class Model extends SequelizeModel { const ThroughModel = (association as BELONGSTOMANY).getThroughModel(); const throughName = (association as BELONGSTOMANY).getThroughName(); - for (const { item, target } of belongsToManyList) { const throughValues = item[throughName]; if (throughValues && typeof throughValues === 'object') { @@ -479,7 +527,7 @@ export abstract class Model extends SequelizeModel { [foreignKey]: this.get(sourceKey), [otherKey]: target.get(targetKey), }, - transaction + transaction, }); await through.update(throughValues, opts); // TODO:有 BUG,未知 @@ -493,7 +541,11 @@ export abstract class Model extends SequelizeModel { } } - async updateAssociation(key: string, data: any, options: UpdateAssociationOptions = {}) { + async updateAssociation( + key: string, + data: any, + options: UpdateAssociationOptions = {}, + ) { const table = this.database.getTable(this.constructor.name); const association = table.getAssociations().get(key); switch (true) { @@ -508,29 +560,27 @@ export abstract class Model extends SequelizeModel { /** * 关联数据的更新 - * + * * @param data */ async updateAssociations(data: any, options: UpdateAssociationOptions = {}) { const { transaction = await this.sequelize.transaction() } = options; - const table = this.database.getTable(this.constructor.name); - for (const key of table.getAssociations().keys()) { + // @ts-ignore 判断 Model.associations 更准确 + for (const key of Object.keys(this.constructor.associations)) { // 如果 key 不存在才跳过 if (!Object.keys(data).includes(key)) { continue; } await this.updateAssociation(key, data[key], { ...options, - transaction + transaction, }); } - await this.database.runHooks('afterUpdateAssociations', this, { + await this.database.emitAsync('afterUpdateAssociations', this, { ...options, transaction, }); - // @ts-ignore - // await this.sequelize.runHooks('afterUpdateAssociations', this, options); if (!options.transaction) { await transaction.commit(); @@ -541,6 +591,8 @@ export abstract class Model extends SequelizeModel { /** * ModelCtor 需要为当前 Model 的 */ -export type ModelCtor = typeof Model & { new(): M } & { [key: string]: any }; +export type ModelCtor = typeof Model & { new (): M } & { + [key: string]: any; +}; export default Model; diff --git a/packages/database/src/op.ts b/packages/database/src/op.ts index 5d77bfaab10fac6dae20c1489132659c84283ac5..dd288034959d6c003b9fbc53e43914998da83603 100644 --- a/packages/database/src/op.ts +++ b/packages/database/src/op.ts @@ -53,36 +53,58 @@ op.set('$isFalsy', () => ({ // 字符串 // 包含:指对应字段的值包含某个子串 -op.set('$includes', (value: string) => ({ [Op.iLike]: `%${value}%` })); +op.set('$includes', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}%`, +})); // 不包含:指对应字段的值不包含某个子串(慎用:性能问题) -op.set('$notIncludes', (value: string) => ({ [Op.notILike]: `%${value}%` })); +op.set('$notIncludes', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}%`, +})); // 以之起始 -op.set('$startsWith', (value: string) => ({ [Op.iLike]: `${value}%` })); +op.set('$startsWith', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.iLike : Op.like]: `${value}%`, +})); // 不以之起始 -op.set('$notStartsWith', (value: string) => ({ [Op.notILike]: `${value}%` })); +op.set('$notStartsWith', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.notILike : Op.notLike]: `${value}%`, +})); // 以之结束 -op.set('$endsWith', (value: string) => ({ [Op.iLike]: `%${value}` })); +op.set('$endsWith', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.iLike : Op.like]: `%${value}`, +})); // 不以之结束 -op.set('$notEndsWith', (value: string) => ({ [Op.notILike]: `%${value}` })); +op.set('$notEndsWith', (value: string, { dialect }) => ({ + [dialect === 'postgres' ? Op.notILike : Op.notLike]: `%${value}`, +})); // 仅日期 // 在某日 -op.set('$dateOn', (value: string) => ({ [Op.and]: [{ [Op.gte]: stringToDate(value) }, { [Op.lt]: getNextDay(value) }] })); +op.set('$dateOn', (value: string) => ({ + [Op.and]: [{ [Op.gte]: stringToDate(value) }, { [Op.lt]: getNextDay(value) }], +})); // 不在某日 -op.set('$dateNotOn', (value: string) => ({ [Op.or]: [{ [Op.lt]: stringToDate(value) }, { [Op.gte]: getNextDay(value) }] })); +op.set('$dateNotOn', (value: string) => ({ + [Op.or]: [{ [Op.lt]: stringToDate(value) }, { [Op.gte]: getNextDay(value) }], +})); // 某日前 op.set('$dateBefore', (value: string) => ({ [Op.lt]: stringToDate(value) })); // 某日后 op.set('$dateAfter', (value: string) => ({ [Op.gte]: getNextDay(value) })); // 不早于(含当天) -op.set('$dateNotBefore', (value: string) => ({ [Op.gte]: stringToDate(value) })); +op.set('$dateNotBefore', (value: string) => ({ + [Op.gte]: stringToDate(value), +})); // 不晚于(含当天) op.set('$dateNotAfter', (value: string) => ({ [Op.lt]: getNextDay(value) })); // 在期间 -op.set('$dateBetween', ([from, to]: string[]) => ({ [Op.and]: [{ [Op.gte]: stringToDate(from) }, { [Op.lt]: getNextDay(to) }] })); +op.set('$dateBetween', ([from, to]: string[]) => ({ + [Op.and]: [{ [Op.gte]: stringToDate(from) }, { [Op.lt]: getNextDay(to) }], +})); // 不在期间 -op.set('$dateNotBetween', ([from, to]: string[]) => ({ [Op.or]: [{ [Op.lt]: stringToDate(from) }, { [Op.gte]: getNextDay(to) }] })); +op.set('$dateNotBetween', ([from, to]: string[]) => ({ + [Op.or]: [{ [Op.lt]: stringToDate(from) }, { [Op.gte]: getNextDay(to) }], +})); // 多选(JSON)类型 @@ -96,9 +118,13 @@ op.set('$anyOf', (values: any[], options) => { return Sequelize.literal(''); } const { field, fieldPath } = options; - const column = fieldPath.split('.').map(name => `"${name}"`).join('.'); - const sql = values.map(value => `(${column})::jsonb @> '${JSON.stringify(value)}'`).join(' OR '); - console.log(sql); + const column = fieldPath + .split('.') + .map((name) => `"${name}"`) + .join('.'); + const sql = values + .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`) + .join(' OR '); return Sequelize.literal(sql); }); // 包含组中所有值 @@ -113,9 +139,13 @@ op.set('$noneOf', (values: any[], options) => { return Sequelize.literal(''); } const { field, fieldPath } = options; - const column = fieldPath.split('.').map(name => `"${name}"`).join('.'); - const sql = values.map(value => `(${column})::jsonb @> '${JSON.stringify(value)}'`).join(' OR '); - console.log(sql); + const column = fieldPath + .split('.') + .map((name) => `"${name}"`) + .join('.'); + const sql = values + .map((value) => `(${column})::jsonb @> '${JSON.stringify(value)}'`) + .join(' OR '); return Sequelize.literal(`not (${sql})`); }); // 与组中值匹配 @@ -125,8 +155,13 @@ op.set('$match', (values: any[], options) => { return Sequelize.literal(''); } const { field, fieldPath } = options; - const column = fieldPath.split('.').map(name => `"${name}"`).join('.'); - const sql = `(${column})::jsonb @> '${JSON.stringify(array)}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'` + const column = fieldPath + .split('.') + .map((name) => `"${name}"`) + .join('.'); + const sql = `(${column})::jsonb @> '${JSON.stringify( + array, + )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`; return Sequelize.literal(sql); }); op.set('$notMatch', (values: any[], options) => { @@ -135,8 +170,13 @@ op.set('$notMatch', (values: any[], options) => { return Sequelize.literal(''); } const { field, fieldPath } = options; - const column = fieldPath.split('.').map(name => `"${name}"`).join('.'); - const sql = `(${column})::jsonb @> '${JSON.stringify(array)}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'` + const column = fieldPath + .split('.') + .map((name) => `"${name}"`) + .join('.'); + const sql = `(${column})::jsonb @> '${JSON.stringify( + array, + )}' AND (${column})::jsonb <@ '${JSON.stringify(array)}'`; return Sequelize.literal(`not (${sql})`); // return Sequelize.literal(`(not (${sql})) AND ${column} IS NULL`); }); @@ -153,4 +193,4 @@ export default class Operator { public static register(key: string, fn: Function) { op.set(key, fn); } -}; +} diff --git a/packages/database/src/table.ts b/packages/database/src/table.ts index c61aba397c8184b4024562dcf591dc23b7fd6106..823ea117995f0d49d7e88701420fa46f86cdf0b9 100644 --- a/packages/database/src/table.ts +++ b/packages/database/src/table.ts @@ -12,16 +12,14 @@ import { Relation, BELONGSTO, BELONGSTOMANY, - SORT + SORT, } from './fields'; import Database from './database'; import { Model, ModelCtor } from './model'; import _ from 'lodash'; import merge from 'deepmerge'; -export interface MergeOptions extends merge.Options { - -} +export interface MergeOptions extends merge.Options {} const registeredModels = new Map(); @@ -45,15 +43,15 @@ export function getRegisteredModel(key) { return key; } -export interface TableOptions extends Omit, 'name' | 'modelName'> { - +export interface TableOptions + extends Omit, 'name' | 'modelName'> { /** * 唯一标识,与 ModelOptions 的 name 有区别 - * + * * 注意:name 可用于初始化 tableName、modelName,但是 tableName 和 modelName 可能有所不同 * name 主要用于获取指定的 tables 和 models * 如果没有特殊指定 tableName 时,name、tableName、modelName 都是一个值 - * + * * TODO: name, tableName, modelName,freezeTableName,underscored,单复数等等情况还比较混乱 */ name: string; @@ -77,7 +75,7 @@ export interface TableOptions extends Omit, 'name' | 'modelN /** * 上下文,Tabel 配置需要的其他变量 */ -export interface TabelContext { +export interface TableContext { database: Database; } @@ -92,11 +90,10 @@ export type Reinitialize = boolean | 'modelOnly'; /** * 表配置 - * + * * 用于处理相关 Model 的配置 */ export class Table { - protected database: Database; protected options: TableOptions; @@ -134,17 +131,16 @@ export class Table { public relationTables = new Set(); get sortable(): boolean { - return Array.from(this.fields.values()).some(field => field instanceof SORT); + return Array.from(this.fields.values()).some( + (field) => field instanceof SORT, + ); } - constructor(options: TableOptions, context: TabelContext) { + constructor(options: TableOptions, context: TableContext) { const { database } = context; database.runHooks('beforeTableInit', options); - const { - model, - fields = [], - indexes = [], - } = options; + database.emit('beforeTableInit', options); + const { model, fields = [], indexes = [], sortable } = options; this.options = options; this.database = database; // 初始化的时候获取 @@ -155,12 +151,35 @@ export class Table { this.addIndexes(indexes, 'modelOnly'); // this.modelInit('modelOnly'); this.setFields(fields); + this.initSortable(); + database.emit('afterTableInit', this); database.runHooks('afterTableInit', this); } + public initSortable() { + const { sortable } = this.options; + if (!sortable) { + return; + } + if (typeof sortable === 'string') { + this.addField({ + type: 'sort', + name: sortable, + }); + } else if (typeof sortable === 'object') { + this.addField({ + ...sortable, + type: 'sort', + }); + } + } + public modelInit(reinitialize: Reinitialize = false) { if (reinitialize || !this.Model) { - this.Model = this.defaultModel || class extends Model { }; + let DefaultModel = this.defaultModel; + this.Model = DefaultModel + ? class extends DefaultModel {} + : class extends Model {}; this.Model.database = this.database; // 关系的建立是在 model.init 之后,在配置中表字段(Column)和关系(Relation)都在 fields, // 所以需要单独提炼出 associations 字段,并在 Model.init 之后执行 Model.associate @@ -171,7 +190,10 @@ export class Table { if (this.database.isDefined(target)) { const TargetModel = this.database.getModel(target); // 如果关系表在之后才定义,未设置 targetKey 时,targetKey 默认值需要在 target model 初始化之后才能取到 - if (association instanceof BELONGSTO || association instanceof BELONGSTOMANY) { + if ( + association instanceof BELONGSTO || + association instanceof BELONGSTOMANY + ) { association.updateOptionsAfterTargetModelBeDefined(); } this.Model[type](TargetModel, association.getAssociationOptions()); @@ -179,7 +201,7 @@ export class Table { this.associating.delete(key); } } - } + }; } this.Model.init(this.getModelAttributes(), this.getModelOptions()); @@ -206,7 +228,7 @@ export class Table { } /** - * + * * @param key 获取数据表配置,也可以指定 key */ public getOptions(key?: any): TableOptions { @@ -222,12 +244,9 @@ export class Table { } public getModelOptions(): InitOptions { - const { - name, - underscored = true, - ...restOptions - } = this.options; - const hooks = _.get(this.getModel(), 'options.hooks') || this.options.hooks || {}; + const { name, underscored = true, ...restOptions } = this.options; + const hooks = + _.get(this.getModel(), 'options.hooks') || this.options.hooks || {}; return { underscored, modelName: name, @@ -271,9 +290,11 @@ export class Table { this.fields.clear(); this.associating.clear(); this.associations.clear(); - for (const key in fields) { - this.addField(fields[key], false); + + for (const filed of fields) { + this.addField(filed, false); } + this.modelInit(true); } @@ -287,12 +308,13 @@ export class Table { /** * 添加字段 - * - * @param options - * @param reinitialize + * + * @param options + * @param reinitialize */ public addField(options: FieldOptions, reinitialize: Reinitialize = true) { this.database.runHooks('beforeAddField', options, this); + this.database.emit('beforeAddField', options, this); const { name, index } = options; const field = buildField(options, { sourceTable: this, @@ -303,7 +325,9 @@ export class Table { if (!this.options.fields) { this.options.fields = []; } - const existIndex = this.options.fields.findIndex(field => field.name === name); + const existIndex = this.options.fields.findIndex( + (field) => field.name === name, + ); if (existIndex !== -1) { this.options.fields.splice(existIndex, 1, options); } else { @@ -320,28 +344,38 @@ export class Table { if (index === true) { this.addIndex(name, false); } else if (typeof index === 'object') { - this.addIndex({ - fields: [name], - ...index, - }, false); + this.addIndex( + { + fields: [name], + ...index, + }, + false, + ); } this.modelAttributes[name] = field.getAttributeOptions(); } this.modelInit(reinitialize); + this.database.emit('afterAddField', field, this); this.database.runHooks('afterAddField', field, this); return field; } /** * 添加索引 - * - * @param indexOptions - * @param reinitialize + * + * @param indexOptions + * @param reinitialize */ - public addIndex(indexOptions: string | ModelIndexesOptions, reinitialize: Reinitialize = true) { - const options = typeof indexOptions === 'string' ? { - fields: [indexOptions], - } : indexOptions; + public addIndex( + indexOptions: string | ModelIndexesOptions, + reinitialize: Reinitialize = true, + ) { + const options = + typeof indexOptions === 'string' + ? { + fields: [indexOptions], + } + : indexOptions; // @ts-ignore const index = Utils.nameIndex(options, this.options.name); console.log(this.options, { index, options }); @@ -355,11 +389,14 @@ export class Table { /** * 批量添加索引 - * - * @param indexes - * @param reinitialize + * + * @param indexes + * @param reinitialize */ - public addIndexes(indexes: Array, reinitialize: Reinitialize = true) { + public addIndexes( + indexes: Array, + reinitialize: Reinitialize = true, + ) { for (const index in indexes) { this.addIndex(indexes[index], false); } @@ -368,20 +405,16 @@ export class Table { /** * 扩展(实验性 API) - * - * @param options + * + * @param options */ public extend(options: TableOptions, mergeOptions: MergeOptions = {}) { - const { - fields = [], - indexes = [], - model, - ...restOptions - } = options; + const { fields = [], indexes = [], model, ...restOptions } = options; if (model) { this.defaultModel = getRegisteredModel(model); } - const { arrayMerge = (target: any[], source: any[]) => source } = mergeOptions; + const { arrayMerge = (target: any[], source: any[]) => source } = + mergeOptions; this.options = merge(this.options, restOptions, { arrayMerge, ...mergeOptions, @@ -389,6 +422,7 @@ export class Table { for (const key in fields) { this.addField(fields[key], false); } + this.initSortable(); // @ts-ignore this.addIndexes(indexes, false); this.modelInit(true); @@ -396,8 +430,8 @@ export class Table { /** * 相关表字段更新 - * - * @param options + * + * @param options */ public async sync(options: SyncOptions = {}) { const tables = []; diff --git a/packages/database/src/utils.ts b/packages/database/src/utils.ts index 537763874234c56b0a53f9bc9b30ffd300affa00..70452262b0fe68702e50eb8e5fb8829f63577270 100644 --- a/packages/database/src/utils.ts +++ b/packages/database/src/utils.ts @@ -58,6 +58,7 @@ export function toWhere(options: any, context: ToWhereContext = {}) { ctx, model, database, + dialect: database.sequelize.getDialect(), fieldPath: name ? `${name}.${prefix}` : prefix, }); if (result.constructor.name === 'Literal') { @@ -336,3 +337,14 @@ export function isNumber(num) { } return false; }; + +let IDX = 36, + HEX = '' +while (IDX--) HEX += IDX.toString(36) + +export function uid(len?: number) { + let str = '', + num = len || 11 + while (num--) str += HEX[(Math.random() * 36) | 0] + return str +} diff --git a/packages/father-build/.local b/packages/father-build/.local new file mode 100755 index 0000000000000000000000000000000000000000..9cbae257c37950eb19d33189f3c68d3706e376f8 --- /dev/null +++ b/packages/father-build/.local @@ -0,0 +1 @@ +Used in bin/father.js to determine if it is in the local debug state. diff --git a/packages/father-build/.npmignore b/packages/father-build/.npmignore new file mode 100755 index 0000000000000000000000000000000000000000..75230a7a63ce2f0e69b141e5d25779251640dd54 --- /dev/null +++ b/packages/father-build/.npmignore @@ -0,0 +1,4 @@ +/src/fixtures +/src/**/*.test.ts +/lib/**/*.test.js +/.local diff --git a/packages/father-build/README.md b/packages/father-build/README.md new file mode 100755 index 0000000000000000000000000000000000000000..181a2fceb17f165aac97654b388da9cad6a5609a --- /dev/null +++ b/packages/father-build/README.md @@ -0,0 +1,4 @@ +# father-build + +See our [main repo](https://github.com/umijs/father) for more information. + diff --git a/packages/father-build/bin/father-build.js b/packages/father-build/bin/father-build.js new file mode 100755 index 0000000000000000000000000000000000000000..f201b7350e189a9be90a18e3290e56881d6c6ba8 --- /dev/null +++ b/packages/father-build/bin/father-build.js @@ -0,0 +1,61 @@ +#!/usr/bin/env node + +const { existsSync } = require('fs'); +const { join } = require('path'); +const yParser = require('yargs-parser'); +const chalk = require('chalk'); +const signale = require('signale'); + +// print version and @local +const args = yParser(process.argv.slice(2)); +if (args.v || args.version) { + console.log(require('../package').version); + if (existsSync(join(__dirname, '../.local'))) { + console.log(chalk.cyan('@local')); + } + process.exit(0); +} + +// Notify update when process exits +const updater = require('update-notifier'); +const pkg = require('../package.json'); +updater({ pkg }).notify({ defer: true }); + +function stripEmptyKeys(obj) { + Object.keys(obj).forEach((key) => { + if (!obj[key] || (Array.isArray(obj[key]) && !obj[key].length)) { + delete obj[key]; + } + }); + return obj; +} + +function build() { + // Parse buildArgs from cli + const buildArgs = stripEmptyKeys({ + esm: args.esm && { type: args.esm === true ? 'rollup' : args.esm }, + cjs: args.cjs && { type: args.cjs === true ? 'rollup' : args.cjs }, + umd: args.umd && { name: args.umd === true ? undefined : args.umd }, + file: args.file, + target: args.target, + entry: args._, + }); + + if (buildArgs.file && buildArgs.entry && buildArgs.entry.length > 1) { + signale.error(new Error( + `Cannot specify file when have multiple entries (${buildArgs.entry.join(', ')})` + )); + process.exit(1); + } + + require('../lib/build').default({ + cwd: args.root || process.cwd(), + watch: args.w || args.watch, + buildArgs, + }).catch(e => { + signale.error(e); + process.exit(1); + }); +} + +build(); diff --git a/packages/father-build/package.json b/packages/father-build/package.json new file mode 100755 index 0000000000000000000000000000000000000000..57ea9ce85501ef5f555266b1a72bb5c0557a93bf --- /dev/null +++ b/packages/father-build/package.json @@ -0,0 +1,83 @@ +{ + "name": "father-build", + "private": true, + "version": "1.19.5-alpha.23", + "description": "Library build tool based on rollup.", + "main": "lib/index.js", + "bin": { + "father-build": "./bin/father-build.js" + }, + "typings": "./index.d.ts", + "scripts": { + "build": "umi-tools build" + }, + "dependencies": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-do-expressions": "7.12.1", + "@babel/plugin-proposal-export-default-from": "7.12.1", + "@babel/plugin-proposal-export-namespace-from": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-syntax-dynamic-import": "7.8.3", + "@babel/plugin-transform-modules-commonjs": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/register": "7.12.1", + "@lerna/project": "^3.21.0", + "@rollup/plugin-babel": "5.2.1", + "@rollup/plugin-commonjs": "16.0.0", + "@rollup/plugin-inject": "4.0.2", + "@rollup/plugin-json": "4.1.0", + "@rollup/plugin-node-resolve": "10.0.0", + "@rollup/plugin-replace": "2.3.4", + "@rollup/plugin-url": "5.0.1", + "@svgr/rollup": "5.4.0", + "ajv": "6.10.0", + "autoprefixer": "9.6.0", + "babel-plugin-istanbul": "^5.2.0", + "babel-plugin-react-require": "3.1.1", + "chalk": "2.4.2", + "chokidar": "^3.0.2", + "glob": "^7.1.4", + "gulp-if": "2.0.2", + "gulp-less": "^4.0.1", + "gulp-plumber": "^1.2.1", + "gulp-sourcemaps": "2.6.5", + "gulp-typescript": "5.0.1", + "less": "3.9.0", + "less-plugin-npm-import": "2.1.0", + "lodash": "^4.17.21", + "rimraf": "2.6.3", + "rollup": "2.33.3", + "rollup-plugin-postcss": "3.1.8", + "rollup-plugin-terser": "7.0.2", + "rollup-plugin-typescript2": "0.29.0", + "signale": "1.4.0", + "slash2": "2.0.0", + "temp-dir": "2.0.0", + "through2": "3.0.1", + "ts-loader": "^8.0.7", + "typescript": "4.1.5", + "update-notifier": "3.0.0", + "vinyl-fs": "3.0.3", + "yargs-parser": "13.1.2" + }, + "repository": { + "type": "git", + "url": "http://github.com/umijs/father" + }, + "homepage": "http://github.com/umijs/father", + "bugs": "http://github.com/umijs/father/issues", + "authors": [ + "chencheng (https://github.com/sorrycc)" + ], + "license": "MIT", + "devDependencies": { + "@types/gulp-plumber": "^0.0.32", + "umi-tools": "^0.4.0" + } +} diff --git a/packages/father-build/src/babel.ts b/packages/father-build/src/babel.ts new file mode 100755 index 0000000000000000000000000000000000000000..f932c793496b238d847b2877f10ad592cce6d1f8 --- /dev/null +++ b/packages/father-build/src/babel.ts @@ -0,0 +1,257 @@ +import { join, extname, relative } from "path"; +import { existsSync, readFileSync, statSync } from "fs"; +import vfs from "vinyl-fs"; +import signale from "signale"; +import { debounce, merge } from "lodash"; +import rimraf from "rimraf"; +import through from "through2"; +import slash from "slash2"; +import * as chokidar from "chokidar"; +import * as babel from "@babel/core"; +import gulpTs from "gulp-typescript"; +import gulpLess from "gulp-less"; +import gulpPlumber from 'gulp-plumber'; +import gulpIf from "gulp-if"; +import chalk from "chalk"; +import getBabelConfig from "./getBabelConfig"; +import { Dispose, IBundleOptions } from "./types"; +import * as ts from "typescript"; +import sourcemaps from 'gulp-sourcemaps'; + +interface IBabelOpts { + cwd: string; + rootPath?: string; + type: "esm" | "cjs"; + target?: "browser" | "node"; + log?: (string) => void; + watch?: boolean; + dispose?: Dispose[]; + importLibToEs?: boolean; + bundleOpts: IBundleOptions; +} + +interface ITransformOpts { + file: { + contents: string; + path: string; + }; + type: "esm" | "cjs"; +} + +export default async function(opts: IBabelOpts) { + const { + cwd, + rootPath, + type, + watch, + dispose, + importLibToEs, + log, + bundleOpts: { + target = "browser", + runtimeHelpers, + extraBabelPresets = [], + extraBabelPlugins = [], + browserFiles = [], + nodeFiles = [], + nodeVersion, + disableTypeCheck, + cjs, + lessInBabelMode + } + } = opts; + const srcPath = join(cwd, "src"); + const targetDir = type === "esm" ? "es" : "lib"; + const targetPath = join(cwd, targetDir); + + log(chalk.gray(`Clean ${targetDir} directory`)); + rimraf.sync(targetPath); + + function transform(opts: ITransformOpts) { + const { file, type } = opts; + const { opts: babelOpts, isBrowser } = getBabelConfig({ + target, + type, + typescript: true, + runtimeHelpers, + filePath: slash(relative(cwd, file.path)), + browserFiles, + nodeFiles, + nodeVersion, + // @ts-ignore + lazy: cjs && cjs.lazy, + lessInBabelMode + }); + if (importLibToEs && type === "esm") { + babelOpts.plugins.push(require.resolve("../lib/importLibToEs")); + } + babelOpts.presets.push(...extraBabelPresets); + babelOpts.plugins.push(...extraBabelPlugins); + + const relFile = slash(file.path).replace(`${cwd}/`, ""); + log( + `Transform to ${type} for ${chalk[isBrowser ? "yellow" : "blue"]( + relFile + )}` + ); + + return babel.transform(file.contents, { + ...babelOpts, + sourceMaps: true, + filename: file.path, + // 不读取外部的babel.config.js配置文件,全采用babelOpts中的babel配置来构建 + configFile: false, + }).code; + } + + /** + * tsconfig.json is not valid json file + * https://github.com/Microsoft/TypeScript/issues/20384 + */ + function parseTsconfig(path: string) { + + const readFile = (path: string) => readFileSync(path, "utf-8"); + const result = ts.readConfigFile(path, readFile); + if (result.error) { + return; + } + return result.config; + } + + function getTsconfigCompilerOptions(path: string) { + const config = parseTsconfig(path); + + if (config && config.extends) { + const exts = parseTsconfig(join(cwd, config.extends)); + const compilerOptions = exts ? exts.compilerOptions : {}; + return merge(compilerOptions, config.compilerOptions || {}); + } + + return config ? config.compilerOptions : undefined; + } + + function getTSConfig() { + + const tsconfigPath = join(cwd, "tsconfig.json"); + const templateTsconfigPath = join(__dirname, "../template/tsconfig.json"); + + if (existsSync(tsconfigPath)) { + return getTsconfigCompilerOptions(tsconfigPath) || {}; + } + if (rootPath && existsSync(join(rootPath, "tsconfig.json"))) { + return getTsconfigCompilerOptions(join(rootPath, "tsconfig.json")) || {}; + } + return getTsconfigCompilerOptions(templateTsconfigPath) || {}; + } + + function createStream(src) { + const tsConfig = getTSConfig(); + const babelTransformRegexp = disableTypeCheck ? /\.(t|j)sx?$/ : /\.jsx?$/; + + function isTsFile(path) { + return /\.tsx?$/.test(path) && !path.endsWith(".d.ts"); + } + + function isTransform(path) { + return babelTransformRegexp.test(path) && !path.endsWith(".d.ts"); + } + + return vfs + .src(src, { + allowEmpty: true, + base: srcPath + }) + .pipe( + gulpIf(tsConfig.sourceMap, sourcemaps.init()) + ) + .pipe(watch ? gulpPlumber() : through.obj()) + .pipe( + gulpIf(f => !disableTypeCheck && isTsFile(f.path), gulpTs(tsConfig)) + ) + .pipe( + gulpIf( + f => lessInBabelMode && /\.less$/.test(f.path), + gulpLess(lessInBabelMode || {}) + ) + ) + .pipe( + gulpIf( + f => isTransform(f.path), + through.obj((file, env, cb) => { + try { + file.contents = Buffer.from( + transform({ + file, + type + }) + ); + // .jsx -> .js + file.path = file.path.replace(extname(file.path), ".js"); + cb(null, file); + } catch (e) { + signale.error(`Compiled faild: ${file.path}`); + console.log(e); + cb(null); + } + }) + ) + ) + .pipe( + gulpIf(tsConfig.sourceMap, sourcemaps.write('.')) + ) + .pipe(vfs.dest(targetPath)); + } + + return new Promise(resolve => { + const patterns = [ + join(srcPath, "**/*"), + `!${join(srcPath, "**/fixtures{,/**}")}`, + `!${join(srcPath, "**/demos{,/**}")}`, + `!${join(srcPath, "**/__test__{,/**}")}`, + `!${join(srcPath, "**/__tests__{,/**}")}`, + `!${join(srcPath, "**/*.mdx")}`, + `!${join(srcPath, "**/*.md")}`, + `!${join(srcPath, "**/*.+(test|e2e|spec).+(js|jsx|ts|tsx)")}` + ]; + createStream(patterns).on("end", () => { + if (watch) { + log( + chalk.magenta( + `Start watching ${slash(srcPath).replace( + `${cwd}/`, + "" + )} directory...` + ) + ); + const watcher = chokidar.watch(patterns, { + ignoreInitial: true + }); + + const files = []; + function compileFiles() { + while (files.length) { + createStream(files.pop()); + } + } + + const debouncedCompileFiles = debounce(compileFiles, 1000); + watcher.on("all", (event, fullPath) => { + const relPath = fullPath.replace(srcPath, ""); + log( + `[${event}] ${slash(join(srcPath, relPath)).replace(`${cwd}/`, "")}` + ); + if (!existsSync(fullPath)) return; + if (statSync(fullPath).isFile()) { + if (!files.includes(fullPath)) files.push(fullPath); + debouncedCompileFiles(); + } + }); + process.once("SIGINT", () => { + watcher.close(); + }); + dispose?.push(() => watcher.close()); + } + resolve(null); + }); + }); +} diff --git a/packages/father-build/src/build.test.ts b/packages/father-build/src/build.test.ts new file mode 100755 index 0000000000000000000000000000000000000000..254b28abf00f3239d080851678d6fbc923a29c9e --- /dev/null +++ b/packages/father-build/src/build.test.ts @@ -0,0 +1,52 @@ +import { join, basename, sep } from 'path'; +import { getPackagesSync } from '@lerna/project'; +import { existsSync, readdirSync, renameSync, statSync } from 'fs'; +import mkdirp from 'mkdirp'; +import rimraf from 'rimraf'; +import build from './build'; + +function moveEsLibToDist(cwd) { + ['es', 'lib'].forEach(dir => { + const absDirPath = join(cwd, dir); + const absDistPath = join(cwd, 'dist'); + if (existsSync(absDirPath)) { + mkdirp.sync(absDistPath); + renameSync(absDirPath, join(absDistPath, dir)); + } + }); +} + +describe('father build', () => { + const rootConfigMapping = { + 'lerna-root-config-override': { cjs: 'rollup', esm: false }, + }; + + require('test-build-result')({ + root: join(__dirname, './fixtures/build'), + build({ cwd }) { + process.chdir(cwd); + rimraf.sync(join(cwd, 'dist')); + return build({ cwd, rootConfig: rootConfigMapping[basename(cwd)] }).then(() => { + // babel + moveEsLibToDist(cwd); + + // lerna + if (existsSync(join(cwd, 'lerna.json'))) { + mkdirp.sync(join(cwd, 'dist')); + const pkgs = getPackagesSync(cwd) + for (let pkg of pkgs) { + + const pkgPath = pkg.contents; + + if (!statSync(pkgPath).isDirectory()) continue; + moveEsLibToDist(pkgPath); + renameSync( + join(pkgPath, 'dist'), + join(cwd, 'dist', pkgPath.split(sep).pop()) + ); + } + } + }); + }, + }); +}); diff --git a/packages/father-build/src/build.ts b/packages/father-build/src/build.ts new file mode 100755 index 0000000000000000000000000000000000000000..084bb9a1442b51c806bd20371ce141ac6a90c394 --- /dev/null +++ b/packages/father-build/src/build.ts @@ -0,0 +1,242 @@ +import { existsSync, readFileSync } from 'fs'; +import { join } from 'path'; +import rimraf from 'rimraf'; +import * as assert from 'assert'; +import { merge } from 'lodash'; +import signale from 'signale'; +import chalk from 'chalk'; +import { getPackages } from '@lerna/project'; +import { IOpts, IBundleOptions, IBundleTypeOutput, ICjs, IEsm, Dispose } from './types'; +import babel from './babel'; +import rollup from './rollup'; +import registerBabel from './registerBabel'; +import { getExistFile } from './utils'; +import getUserConfig, { CONFIG_FILES } from './getUserConfig'; +import randomColor from "./randomColor"; + +export function getBundleOpts(opts: IOpts): IBundleOptions[] { + const { cwd, buildArgs = {}, rootConfig = {} } = opts; + const entry = getExistFile({ + cwd, + files: ['src/index.tsx', 'src/index.ts', 'src/index.jsx', 'src/index.js'], + returnRelative: true, + }); + const userConfig = getUserConfig({ cwd }); + const userConfigs = Array.isArray(userConfig) ? userConfig : [userConfig]; + return (userConfigs as any).map(userConfig => { + const bundleOpts = merge( + { + entry, + }, + rootConfig, + userConfig, + buildArgs, + ); + + // Support config esm: 'rollup' and cjs: 'rollup' + if (typeof bundleOpts.esm === 'string') { + bundleOpts.esm = { type: bundleOpts.esm }; + } + if (typeof bundleOpts.cjs === 'string') { + bundleOpts.cjs = { type: bundleOpts.cjs }; + } + + return bundleOpts; + }); +} + +function validateBundleOpts(bundleOpts: IBundleOptions, { cwd, rootPath }) { + if (bundleOpts.runtimeHelpers) { + const pkgPath = join(cwd, 'package.json'); + assert.ok(existsSync(pkgPath), `@babel/runtime dependency is required to use runtimeHelpers`); + const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')); + assert.ok( + (pkg.dependencies || {})['@babel/runtime'], + `@babel/runtime dependency is required to use runtimeHelpers`, + ); + } + if (bundleOpts.cjs && (bundleOpts.cjs as ICjs).lazy && (bundleOpts.cjs as ICjs).type === 'rollup') { + throw new Error(` +cjs.lazy don't support rollup. + `.trim()); + } + if (!bundleOpts.esm && !bundleOpts.cjs && !bundleOpts.umd) { + throw new Error( + ` +None format of ${chalk.cyan( + 'cjs | esm | umd', + )} is configured, checkout https://github.com/umijs/father for usage details. +`.trim(), + ); + } + if (bundleOpts.entry) { + const tsConfigPath = join(cwd, 'tsconfig.json'); + const tsConfig = existsSync(tsConfigPath) + || (rootPath && existsSync(join(rootPath, 'tsconfig.json'))); + if ( + !tsConfig && ( + (Array.isArray(bundleOpts.entry) && bundleOpts.entry.some(isTypescriptFile)) || + (!Array.isArray(bundleOpts.entry) && isTypescriptFile(bundleOpts.entry)) + ) + ) { + signale.info( + `Project using ${chalk.cyan('typescript')} but tsconfig.json not exists. Use default config.` + ); + } + } +} + +function isTypescriptFile(filePath) { + return filePath.endsWith('.ts') || filePath.endsWith('.tsx') +} + +interface IExtraBuildOpts { + pkg?: string | { name?: string }; +} + +export async function build(opts: IOpts, extraOpts: IExtraBuildOpts = {}) { + const { cwd, rootPath, watch } = opts; + const { pkg } = extraOpts; + + const dispose: Dispose[] = []; + + // register babel for config files + registerBabel({ + cwd, + only: CONFIG_FILES, + }); + + const pkgName = (typeof pkg === 'string' ? pkg : pkg?.name) || 'unknown'; + + function log(msg) { + console.log(`${pkg ? `${randomColor(`${pkgName}`)}: ` : ''}${msg}`); + } + + // Get user config + const bundleOptsArray = getBundleOpts(opts); + + for (const bundleOpts of bundleOptsArray) { + validateBundleOpts(bundleOpts, { cwd, rootPath }); + + // Clean dist + log(chalk.gray(`Clean dist directory`)); + rimraf.sync(join(cwd, 'dist')); + + // Build umd + if (bundleOpts.umd) { + log(`Build umd`); + await rollup({ + cwd, + rootPath, + log, + type: 'umd', + entry: bundleOpts.entry, + watch, + dispose, + bundleOpts, + }); + } + + // Build cjs + if (bundleOpts.cjs) { + const cjs = bundleOpts.cjs as IBundleTypeOutput; + log(`Build cjs with ${cjs.type}`); + if (cjs.type === 'babel') { + await babel({ cwd, rootPath, watch, dispose, type: 'cjs', log, bundleOpts }); + } else { + await rollup({ + cwd, + rootPath, + log, + type: 'cjs', + entry: bundleOpts.entry, + watch, + dispose, + bundleOpts, + }); + } + } + + // Build esm + if (bundleOpts.esm) { + const esm = bundleOpts.esm as IEsm; + log(`Build esm with ${esm.type}`); + const importLibToEs = esm && esm.importLibToEs; + if (esm && esm.type === 'babel') { + await babel({ cwd, rootPath, watch, dispose, type: 'esm', importLibToEs, log, bundleOpts }); + } else { + await rollup({ + cwd, + rootPath, + log, + type: 'esm', + entry: bundleOpts.entry, + importLibToEs, + watch, + dispose, + bundleOpts, + }); + } + } + } + + return dispose; +} + +export async function buildForLerna(opts: IOpts) { + const { cwd } = opts; + + // register babel for config files + registerBabel({ + cwd, + only: CONFIG_FILES, + }); + + const userConfig = merge(getUserConfig({ cwd }), opts.rootConfig || {}); + + let pkgs = await getPackages(cwd); + + // support define pkgs in lerna + // TODO: 使用lerna包解决依赖编译问题 + if (userConfig.pkgs) { + pkgs = userConfig.pkgs + .map((item) => { + return pkgs.find(pkg => pkg.contents.endsWith(item)) + }) + .filter(Boolean); + } + + const dispose: Dispose[] = []; + for (const pkg of pkgs) { + if (process.env.PACKAGE && pkg !== process.env.PACKAGE) continue; + // build error when .DS_Store includes in packages root + const pkgPath = pkg.contents; + assert.ok( + existsSync(join(pkgPath, 'package.json')), + `package.json not found in packages/${pkg}`, + ); + process.chdir(pkgPath); + dispose.push(...await build( + { + // eslint-disable-line + ...opts, + buildArgs: opts.buildArgs, + rootConfig: userConfig, + cwd: pkgPath, + rootPath: cwd, + }, + { + pkg, + }, + )); + } + return dispose; +} + +export default async function(opts: IOpts) { + const useLerna = existsSync(join(opts.cwd, 'lerna.json')); + const isLerna = useLerna && process.env.LERNA !== 'none'; + + const dispose = isLerna ? await buildForLerna(opts) : await build(opts); + return () => dispose.forEach(e => e()); +} diff --git a/packages/father-build/src/fixtures/build/babel-browser-files/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-browser-files/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..3cd11ad83662d49d57f13e616de4fe1e55cf48e9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-browser-files/.fatherrc.js @@ -0,0 +1,8 @@ + +export default { + esm: 'babel', + target: 'node', + browserFiles: [ + 'src/browser.js', + ], +} diff --git a/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/browser.js b/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/browser.js new file mode 100755 index 0000000000000000000000000000000000000000..22dc0e15f0820fb6f77bd5086d1a7d596adb0126 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/browser.js @@ -0,0 +1 @@ +var b = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/node.js b/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/node.js new file mode 100755 index 0000000000000000000000000000000000000000..ed389c02326792f83d3cc849666bf63d53c3ec53 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-browser-files/expected/es/node.js @@ -0,0 +1 @@ +const a = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-browser-files/src/browser.js b/packages/father-build/src/fixtures/build/babel-browser-files/src/browser.js new file mode 100755 index 0000000000000000000000000000000000000000..a3677a7e4d7cfd6206240920edce1bb21f9254c3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-browser-files/src/browser.js @@ -0,0 +1,2 @@ + +const b = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-browser-files/src/node.js b/packages/father-build/src/fixtures/build/babel-browser-files/src/node.js new file mode 100755 index 0000000000000000000000000000000000000000..528eb6b5a232dc7c79c6ef026dc853fa1d26cce1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-browser-files/src/node.js @@ -0,0 +1,2 @@ + +const a = 'foo'; diff --git a/packages/plugin-pages/.fatherrc.ts b/packages/father-build/src/fixtures/build/babel-cjs-lazy/.fatherrc.js similarity index 64% rename from packages/plugin-pages/.fatherrc.ts rename to packages/father-build/src/fixtures/build/babel-cjs-lazy/.fatherrc.js index 86bce87c0e869ec20bc98733ca2be0db1ffde2f6..37192c105d0decd256d40d6881c96bf513457d05 100755 --- a/packages/plugin-pages/.fatherrc.ts +++ b/packages/father-build/src/fixtures/build/babel-cjs-lazy/.fatherrc.js @@ -1,5 +1,8 @@ + export default { target: 'node', cjs: { type: 'babel', lazy: true }, - disableTypeCheck: true, + browserFiles: [ + 'src/foo.js', + ], }; diff --git a/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/foo.js b/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..fafe4ba5f8f91bf52c1f5e1e4a35ffd0ebfdd413 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/foo.js @@ -0,0 +1,3 @@ +import bar from 'bar'; + +bar(); diff --git a/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/index.js b/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..fafe4ba5f8f91bf52c1f5e1e4a35ffd0ebfdd413 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-cjs-lazy/src/index.js @@ -0,0 +1,3 @@ +import bar from 'bar'; + +bar(); diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..b90b773fa1aa3b8ab01e71220922d9c44ca52ed7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/.fatherrc.js @@ -0,0 +1,10 @@ + +export default { + esm: { type: 'babel' }, + extraBabelPresets: [ + require.resolve('./preset'), + ], + extraBabelPlugins: [ + require.resolve('./p2'), + ], +}; diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..dd712d79efc82a924aacb0e16993788bd2a0660f --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/expected/es/index.js @@ -0,0 +1,2 @@ +console.log("p1", "p2", 1); +alert(2); \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p1.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p1.js new file mode 100755 index 0000000000000000000000000000000000000000..a3a3e24e183d95a18752c3704da5114e1432c25c --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p1.js @@ -0,0 +1,20 @@ + +module.exports = function ({ types: t }) { + function isConsoleLog(node) { + const { callee, callee: { object, property } } = node; + return t.isMemberExpression(callee) + && t.isIdentifier(object) && object.name === 'console' + && t.isIdentifier(property) && property.name === 'log'; + } + + return { + visitor: { + CallExpression(path, state) { + const { node, node: { callee, callee: { object, property } } } = path; + if (isConsoleLog(node)) { + node.arguments.unshift(t.stringLiteral('p1')); + } + }, + }, + }; +} diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p2.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p2.js new file mode 100755 index 0000000000000000000000000000000000000000..297ac66d1a572d4ddc8d543612375dfeb5f60ac6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/p2.js @@ -0,0 +1,20 @@ + +module.exports = function ({ types: t }) { + function isConsoleLog(node) { + const { callee, callee: { object, property } } = node; + return t.isMemberExpression(callee) + && t.isIdentifier(object) && object.name === 'console' + && t.isIdentifier(property) && property.name === 'log'; + } + + return { + visitor: { + CallExpression(path, state) { + const { node, node: { callee, callee: { object, property } } } = path; + if (isConsoleLog(node)) { + node.arguments.unshift(t.stringLiteral('p2')); + } + }, + }, + }; +} diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/preset.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/preset.js new file mode 100755 index 0000000000000000000000000000000000000000..07ccbb29c5e0e2bc072426cd312d1436de6995ef --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/preset.js @@ -0,0 +1,8 @@ + +module.exports = function () { + return { + plugins: [ + require.resolve('./p1'), + ], + }; +} diff --git a/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/src/index.js b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..923799068e9727034da827fbc993b2d5c0dfcfcf --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-extra-babel-presets-and-plugins/src/index.js @@ -0,0 +1,3 @@ + +console.log(1); +alert(2); diff --git a/packages/father-build/src/fixtures/build/babel-importLibToEs/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-importLibToEs/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..f1ef9292b1e26b7c278293be40dc5162410b4fa3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-importLibToEs/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel', importLibToEs: true }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-importLibToEs/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-importLibToEs/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..d10ef2731176c0643cb0183e88c699aa1edecaf0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-importLibToEs/expected/es/index.js @@ -0,0 +1,2 @@ +import foo from "foo/es/foo"; +console.log(foo()); \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-importLibToEs/src/index.js b/packages/father-build/src/fixtures/build/babel-importLibToEs/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..a8105c428f343174a8ac46f8e9f6c2817036ddcd --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-importLibToEs/src/index.js @@ -0,0 +1,3 @@ +import foo from 'foo/lib/foo'; + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..ead5605aa670f7db66b1099d7a57fd2282389609 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, + lessInBabelMode: false, +}; diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.js b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..85ffde22745f6175c2cd77a7c978ef5e2dfb75ca --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.js @@ -0,0 +1,6 @@ + +import "./index.less"; +import "./foo.module.less"; +export default function () { + return 'foo'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.module.less b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.module.less new file mode 100755 index 0000000000000000000000000000000000000000..213d0676ac6af3b978f6d11a7760b4b6edb6fd98 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/foo.module.less @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/index.less b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/index.less new file mode 100755 index 0000000000000000000000000000000000000000..f151aa5e7f12ca223962203791891c4f982112cb --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/expected/es/index.less @@ -0,0 +1,6 @@ + +@link-color: green; + +.foo { + color: @link-color; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.js b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..e1cab23eade6c58e91758d0f210a38e376c2dd93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.js @@ -0,0 +1,6 @@ +import "./index.less"; +import "./foo.module.less"; + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.module.less b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.module.less new file mode 100755 index 0000000000000000000000000000000000000000..213d0676ac6af3b978f6d11a7760b4b6edb6fd98 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/foo.module.less @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/index.less b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/index.less new file mode 100755 index 0000000000000000000000000000000000000000..f151aa5e7f12ca223962203791891c4f982112cb --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css-forbid/src/index.less @@ -0,0 +1,6 @@ + +@link-color: green; + +.foo { + color: @link-color; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-less-to-css/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..c2ed104b4a8dd2e022e5f49a7a0d2830856cafd3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, + lessInBabelMode: true, +}; diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.js b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..a70263317d9fa5b6ff92bbd2768311ee2ed609b9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.js @@ -0,0 +1,6 @@ + +import "./index.css"; +import "./foo.module.css"; +export default function () { + return 'foo'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.module.css b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.module.css new file mode 100755 index 0000000000000000000000000000000000000000..213d0676ac6af3b978f6d11a7760b4b6edb6fd98 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/foo.module.css @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/index.css b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/index.css new file mode 100755 index 0000000000000000000000000000000000000000..213d0676ac6af3b978f6d11a7760b4b6edb6fd98 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/expected/es/index.css @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.js b/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..e1cab23eade6c58e91758d0f210a38e376c2dd93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.js @@ -0,0 +1,6 @@ +import "./index.less"; +import "./foo.module.less"; + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.module.less b/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.module.less new file mode 100755 index 0000000000000000000000000000000000000000..213d0676ac6af3b978f6d11a7760b4b6edb6fd98 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/src/foo.module.less @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/packages/father-build/src/fixtures/build/babel-less-to-css/src/index.less b/packages/father-build/src/fixtures/build/babel-less-to-css/src/index.less new file mode 100755 index 0000000000000000000000000000000000000000..f151aa5e7f12ca223962203791891c4f982112cb --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-less-to-css/src/index.less @@ -0,0 +1,6 @@ + +@link-color: green; + +.foo { + color: @link-color; +} diff --git a/packages/father-build/src/fixtures/build/babel-node-files/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-node-files/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..ea494d59f804f2f68f1b02449ee49705e10f4737 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-files/.fatherrc.js @@ -0,0 +1,8 @@ + +export default { + esm: 'babel', + target: 'browser', + nodeFiles: [ + 'src/node.js', + ], +} diff --git a/packages/father-build/src/fixtures/build/babel-node-files/expected/es/browser.js b/packages/father-build/src/fixtures/build/babel-node-files/expected/es/browser.js new file mode 100755 index 0000000000000000000000000000000000000000..22dc0e15f0820fb6f77bd5086d1a7d596adb0126 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-files/expected/es/browser.js @@ -0,0 +1 @@ +var b = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-node-files/expected/es/node.js b/packages/father-build/src/fixtures/build/babel-node-files/expected/es/node.js new file mode 100755 index 0000000000000000000000000000000000000000..ed389c02326792f83d3cc849666bf63d53c3ec53 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-files/expected/es/node.js @@ -0,0 +1 @@ +const a = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-node-files/src/browser.js b/packages/father-build/src/fixtures/build/babel-node-files/src/browser.js new file mode 100755 index 0000000000000000000000000000000000000000..a3677a7e4d7cfd6206240920edce1bb21f9254c3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-files/src/browser.js @@ -0,0 +1,2 @@ + +const b = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-node-files/src/node.js b/packages/father-build/src/fixtures/build/babel-node-files/src/node.js new file mode 100755 index 0000000000000000000000000000000000000000..528eb6b5a232dc7c79c6ef026dc853fa1d26cce1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-files/src/node.js @@ -0,0 +1,2 @@ + +const a = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..d59f3211741d0642bd61b7f6d567105579e1fecb --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + esm: 'babel', + target: 'node', +} diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.d.ts b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..2ef04fb2328af9df691e7af609797fdbbea5265c --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.d.ts @@ -0,0 +1 @@ +declare const b = "foo"; diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.js b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.js new file mode 100755 index 0000000000000000000000000000000000000000..22dc0e15f0820fb6f77bd5086d1a7d596adb0126 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/B.js @@ -0,0 +1 @@ +var b = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/C.js b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/C.js new file mode 100755 index 0000000000000000000000000000000000000000..22dc0e15f0820fb6f77bd5086d1a7d596adb0126 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/C.js @@ -0,0 +1 @@ +var b = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/node.js b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/node.js new file mode 100755 index 0000000000000000000000000000000000000000..ed389c02326792f83d3cc849666bf63d53c3ec53 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/expected/es/node.js @@ -0,0 +1 @@ +const a = 'foo'; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/B.tsx b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/B.tsx new file mode 100755 index 0000000000000000000000000000000000000000..a3677a7e4d7cfd6206240920edce1bb21f9254c3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/B.tsx @@ -0,0 +1,2 @@ + +const b = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/C.jsx b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/C.jsx new file mode 100755 index 0000000000000000000000000000000000000000..a3677a7e4d7cfd6206240920edce1bb21f9254c3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/C.jsx @@ -0,0 +1,2 @@ + +const b = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/node.js b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/node.js new file mode 100755 index 0000000000000000000000000000000000000000..528eb6b5a232dc7c79c6ef026dc853fa1d26cce1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/src/node.js @@ -0,0 +1,2 @@ + +const a = 'foo'; diff --git a/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/tsconfig.json b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..6db6275c3b6e3402f96cb156969da21e2b5b8112 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-node-tsx-jsx/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "node", + "jsx": "preserve", + "esModuleInterop": true, + "declaration": true + } +} diff --git a/packages/father-build/src/fixtures/build/babel-normal/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-normal/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..19390b36be3652d1a4865413e465090287e791da --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-normal/expected/es/foo.js b/packages/father-build/src/fixtures/build/babel-normal/expected/es/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..29a891a23775f817ddec6eed40fe182da7a273bb --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/expected/es/foo.js @@ -0,0 +1,3 @@ +export default function () { + return 'foo'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-normal/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-normal/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8b2cbd724a689f8d16b4945cfc1dba4c6eb0ca9b --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/expected/es/index.js @@ -0,0 +1,3 @@ +import 'bar'; +import foo from './foo'; +console.log(foo()); \ No newline at end of file diff --git a/packages/app/src/components/fields/form-text-box/style.ts b/packages/father-build/src/fixtures/build/babel-normal/expected/es/types.d.ts old mode 100644 new mode 100755 similarity index 100% rename from packages/app/src/components/fields/form-text-box/style.ts rename to packages/father-build/src/fixtures/build/babel-normal/expected/es/types.d.ts diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/__test__/__snapshots__/index.test.js.snap b/packages/father-build/src/fixtures/build/babel-normal/src/__test__/__snapshots__/index.test.js.snap new file mode 100755 index 0000000000000000000000000000000000000000..7c645e42fb75c2cb63a74ee7081fba37f511818e --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/__test__/__snapshots__/index.test.js.snap @@ -0,0 +1 @@ +export default {}; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/__test__/index.test.js b/packages/father-build/src/fixtures/build/babel-normal/src/__test__/index.test.js new file mode 100755 index 0000000000000000000000000000000000000000..ff8b4c56321a3362fc00224b01800f62466f9a1f --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/__test__/index.test.js @@ -0,0 +1 @@ +export default {}; diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/bar.md b/packages/father-build/src/fixtures/build/babel-normal/src/bar.md new file mode 100755 index 0000000000000000000000000000000000000000..d93e603dcdc15cc92c2d9f415df938e3975efb7e --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/bar.md @@ -0,0 +1 @@ +# bar diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/bar.mdx b/packages/father-build/src/fixtures/build/babel-normal/src/bar.mdx new file mode 100755 index 0000000000000000000000000000000000000000..d93e603dcdc15cc92c2d9f415df938e3975efb7e --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/bar.mdx @@ -0,0 +1 @@ +# bar diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/demos/foo.js b/packages/father-build/src/fixtures/build/babel-normal/src/demos/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..eb59b1b29b30e88bd5212b931304188e002be5d3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/demos/foo.js @@ -0,0 +1,3 @@ +export default function() { + return "foo"; +} diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/fixtures/example/package.json b/packages/father-build/src/fixtures/build/babel-normal/src/fixtures/example/package.json new file mode 100755 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/fixtures/example/package.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/packages/create-nocobase-app/src/fixtures/.gitkeep b/packages/father-build/src/fixtures/build/babel-normal/src/foo.e2e.ts similarity index 100% rename from packages/create-nocobase-app/src/fixtures/.gitkeep rename to packages/father-build/src/fixtures/build/babel-normal/src/foo.e2e.ts diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/foo.js b/packages/father-build/src/fixtures/build/babel-normal/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/foo.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/create-nocobase-app/templates/AppGenerator/mock/.gitkeep b/packages/father-build/src/fixtures/build/babel-normal/src/foo.spec.ts similarity index 100% rename from packages/create-nocobase-app/templates/AppGenerator/mock/.gitkeep rename to packages/father-build/src/fixtures/build/babel-normal/src/foo.spec.ts diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.js b/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.js new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.jsx b/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.jsx new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.ts b/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.ts new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.tsx b/packages/father-build/src/fixtures/build/babel-normal/src/foo.test.tsx new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/index.js b/packages/father-build/src/fixtures/build/babel-normal/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9d80d06dcd668a9b63ef304d70a4d1b6e701b49a --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-normal/src/index.js @@ -0,0 +1,4 @@ +import 'bar'; +import foo from './foo'; + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/babel-normal/src/types.d.ts b/packages/father-build/src/fixtures/build/babel-normal/src/types.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/father-build/src/fixtures/build/babel-runtimeHelpers/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..6d1ce8487426fbcbc204cc6ff7d47c8c5361fbca --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + runtimeHelpers: true, + esm: { type: 'babel' }, + cjs: { type: 'babel' }, +} diff --git a/packages/father-build/src/fixtures/build/babel-runtimeHelpers/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9a5518f11ff3ef058d5b1862fe91595525df3c9f --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/expected/es/index.js @@ -0,0 +1,21 @@ +import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; +import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; +import _createClass from "@babel/runtime/helpers/esm/createClass"; + +var A = /*#__PURE__*/function () { + function A() { + _classCallCheck(this, A); + } + + _createClass(A, [{ + key: "foo", + value: function foo() {} + }]); + + return A; +}(); + +new A().foo(); +var a = {}; + +var b = _objectSpread({}, a); \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-runtimeHelpers/package.json b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/package.json new file mode 100755 index 0000000000000000000000000000000000000000..9c4a098464c41dd6eb3812a84b45711f9df240bd --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@babel/runtime": "7.10.4" + } +} diff --git a/packages/father-build/src/fixtures/build/babel-runtimeHelpers/src/index.js b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..5f0d5578c99bf74fc247575a0d490c797f1c762b --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-runtimeHelpers/src/index.js @@ -0,0 +1,9 @@ + +class A { + foo() {} +} + +(new A()).foo(); + +const a = {}; +const b = {...a}; \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-syntax/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-syntax/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..8b9450222eff5fd383e79e231afcb430c20a93c7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-syntax/expected/index.esm.js b/packages/father-build/src/fixtures/build/babel-syntax/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..c74948696ed309c12b93eaa6bc2a85d05eb03e8f --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/expected/index.esm.js @@ -0,0 +1,84 @@ +import React from 'react'; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; +} + +function a () { + alert('a'); +} + +function b1() { + alert('b1'); +} +function b2() { + alert('b2'); +} + +var b = /*#__PURE__*/Object.freeze({ + __proto__: null, + b1: b1, + b2: b2 +}); + +var _class; +// babel-plugin-react-require +var Foo = function Foo() { + return /*#__PURE__*/React.createElement("div", null); +}; // Don't support multiple chunks for now +// @babel/plugin-syntax-dynamic-import +// import('./a'); +// object-rest-spread + +var _bar = bar, + foo = _bar.foo, + z = _objectWithoutProperties(_bar, ["foo"]); + +console.log(z); // @babel/plugin-proposal-decorators + class + +var A = foo(_class = function A() { + _classCallCheck(this, A); +}) || _class; // export default from + +var a$1 = x > 10 ? 'big' : 'small'; +console.log(a$1); // export namespace from + +export { A, Foo, a, b }; diff --git a/packages/father-build/src/fixtures/build/babel-syntax/package.json b/packages/father-build/src/fixtures/build/babel-syntax/package.json new file mode 100755 index 0000000000000000000000000000000000000000..1368588bd16f05b184d8ee5f2581223dae97c8b1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "^16.8.4" + } +} diff --git a/packages/father-build/src/fixtures/build/babel-syntax/src/a.js b/packages/father-build/src/fixtures/build/babel-syntax/src/a.js new file mode 100755 index 0000000000000000000000000000000000000000..4e005dbee5f4c6634e0101dcdb65cf55411f74f6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/src/a.js @@ -0,0 +1,4 @@ + +export default function () { + alert('a'); +} diff --git a/packages/father-build/src/fixtures/build/babel-syntax/src/b.js b/packages/father-build/src/fixtures/build/babel-syntax/src/b.js new file mode 100755 index 0000000000000000000000000000000000000000..c03767c13e055bb5bd6be2204846eb24b6e61938 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/src/b.js @@ -0,0 +1,8 @@ + +export function b1() { + alert('b1'); +} + +export function b2() { + alert('b2'); +} diff --git a/packages/father-build/src/fixtures/build/babel-syntax/src/index.js b/packages/father-build/src/fixtures/build/babel-syntax/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..aec1e847bfd996c4da2cfbe7d6c6d21979700767 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-syntax/src/index.js @@ -0,0 +1,32 @@ + +// babel-plugin-react-require +export const Foo = () =>
; + +// Don't support multiple chunks for now +// @babel/plugin-syntax-dynamic-import +// import('./a'); + +// object-rest-spread +const { foo, ...z } = bar; +console.log(z); + +// @babel/plugin-proposal-decorators + class +@foo +export class A {} + +// export default from +export a from './a'; + +// do expression +let a = do { + if(x > 10) { + 'big'; + } else { + 'small'; + } +}; +console.log(a); + +// export namespace from +export * as b from './b'; + diff --git a/packages/father-build/src/fixtures/build/babel-ts-3.7-features/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..0637dcfc584236ae4988fa0b358d2f38f509c13b --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/.fatherrc.js @@ -0,0 +1,4 @@ +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.d.ts b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..daaf9ca4663e7a74b41f2566fe4016a19f175119 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.d.ts @@ -0,0 +1,2 @@ +export declare const optionalChaining: string; +export declare const nullishCoalescing: string | boolean; diff --git a/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..640b9525a4f7e0fdf3ee38ae8aeafc6dbab85794 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/expected/es/index.js @@ -0,0 +1,6 @@ +var _foo$test; + +var foo = {}; +export var optionalChaining = foo === null || foo === void 0 ? void 0 : (_foo$test = foo.test) === null || _foo$test === void 0 ? void 0 : _foo$test.abc; +var bar = false; +export var nullishCoalescing = bar !== null && bar !== void 0 ? bar : 'default'; diff --git a/packages/father-build/src/fixtures/build/babel-ts-3.7-features/src/index.ts b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..5ed0adeb7d5cbf4b0bfb70a463366a16b294612d --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-ts-3.7-features/src/index.ts @@ -0,0 +1,11 @@ +type Foo = { + test?: { + abc?: string; + } +} +const foo: Foo = {}; + +export const optionalChaining = foo?.test?.abc; + +const bar = false; +export const nullishCoalescing = bar ?? 'default'; diff --git a/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..166359112e3f85d4913d5dfa39e43670ed01fef0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, + disableTypeCheck: true, +}; diff --git a/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..da1c4ebf5a06385cdee41db8276d23e255cec8b5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/expected/es/index.js @@ -0,0 +1,3 @@ +export default function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/src/index.ts b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..3a0363ce2a05cc9273d59fe5c0fe97b623638af8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/src/index.ts @@ -0,0 +1,7 @@ +interface IOpts { + foo: boolean; +} + +export default function foo(opts: IOpts): string { + return opts.foo ? 'foo' : 'bar'; +} diff --git a/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/tsconfig.json b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..d322bf935abea0a37cd0acd671d2a5438fb3fa0e --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-disable-typecheck/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "node", + "jsx": "preserve", + "esModuleInterop": true + } +} diff --git a/packages/father-build/src/fixtures/build/babel-typescript-template/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-typescript-template/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..19390b36be3652d1a4865413e465090287e791da --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-template/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.d.ts b/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..9f688a7e2465ae38cb5ae3aec14cac3d8b022058 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.d.ts @@ -0,0 +1,5 @@ +interface IOpts { + foo: boolean; +} +export default function foo(opts: IOpts): string; +export {}; diff --git a/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..da1c4ebf5a06385cdee41db8276d23e255cec8b5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-template/expected/es/index.js @@ -0,0 +1,3 @@ +export default function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-typescript-template/src/index.ts b/packages/father-build/src/fixtures/build/babel-typescript-template/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..3a0363ce2a05cc9273d59fe5c0fe97b623638af8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript-template/src/index.ts @@ -0,0 +1,7 @@ +interface IOpts { + foo: boolean; +} + +export default function foo(opts: IOpts): string { + return opts.foo ? 'foo' : 'bar'; +} diff --git a/packages/father-build/src/fixtures/build/babel-typescript/.fatherrc.js b/packages/father-build/src/fixtures/build/babel-typescript/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..19390b36be3652d1a4865413e465090287e791da --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + cjs: { type: 'babel' }, + esm: { type: 'babel' }, +}; diff --git a/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.d.ts b/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..9f688a7e2465ae38cb5ae3aec14cac3d8b022058 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.d.ts @@ -0,0 +1,5 @@ +interface IOpts { + foo: boolean; +} +export default function foo(opts: IOpts): string; +export {}; diff --git a/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.js b/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..da1c4ebf5a06385cdee41db8276d23e255cec8b5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript/expected/es/index.js @@ -0,0 +1,3 @@ +export default function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/babel-typescript/src/index.ts b/packages/father-build/src/fixtures/build/babel-typescript/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..3a0363ce2a05cc9273d59fe5c0fe97b623638af8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript/src/index.ts @@ -0,0 +1,7 @@ +interface IOpts { + foo: boolean; +} + +export default function foo(opts: IOpts): string { + return opts.foo ? 'foo' : 'bar'; +} diff --git a/packages/father-build/src/fixtures/build/babel-typescript/tsconfig.json b/packages/father-build/src/fixtures/build/babel-typescript/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..fd3ce93b7f7d5f8da4d3561439a79c195176c26c --- /dev/null +++ b/packages/father-build/src/fixtures/build/babel-typescript/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + // tsconfig is not valid josn file + "target": "esnext", + "moduleResolution": "node", + "jsx": "preserve", + "esModuleInterop": true, + "declaration": true + } +} diff --git a/packages/father-build/src/fixtures/build/config-array/.fatherrc.js b/packages/father-build/src/fixtures/build/config-array/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..695d856f12ac030f611ea85a44c31917ddef5c6b --- /dev/null +++ b/packages/father-build/src/fixtures/build/config-array/.fatherrc.js @@ -0,0 +1,13 @@ + +export default [ + { + cjs: 'babel', + }, + { + entry: 'ui/index.js', + umd: { + name: 'foo', + minFile: false, + }, + }, +]; diff --git a/packages/father-build/src/fixtures/build/config-array/expected/index.umd.js b/packages/father-build/src/fixtures/build/config-array/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..f610a7710a03276c16cdee0df062cee8e23bb022 --- /dev/null +++ b/packages/father-build/src/fixtures/build/config-array/expected/index.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.foo = factory()); +}(this, (function () { 'use strict'; + + var index = (function () { + return 1; + }); + + return index; + +}))); diff --git a/packages/father-build/src/fixtures/build/config-array/src/index.js b/packages/father-build/src/fixtures/build/config-array/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..be26f6ddab3648b7ce13dbd4789fe68b0b73bae9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/config-array/src/index.js @@ -0,0 +1,2 @@ + +export default () => 1; diff --git a/packages/father-build/src/fixtures/build/config-array/ui/index.js b/packages/father-build/src/fixtures/build/config-array/ui/index.js new file mode 100755 index 0000000000000000000000000000000000000000..807a7975a83689f87f723722d12adb9c6c38a2c7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/config-array/ui/index.js @@ -0,0 +1 @@ +export default () => 1; diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-pkgs/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..391752f4df91b410a65accd3bcc43e1046088675 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/.fatherrc.js @@ -0,0 +1,8 @@ + +export default { + esm: { type: 'rollup' }, + pkgs: [ + 'foo', + 'bar' + ] +} diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/package.json b/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/core/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/package.json b/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/core/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/expected/bar/index.esm.js b/packages/father-build/src/fixtures/build/lerna-pkgs/expected/bar/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/expected/bar/index.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/expected/foo/index.esm.js b/packages/father-build/src/fixtures/build/lerna-pkgs/expected/foo/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/expected/foo/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-pkgs/lerna.json b/packages/father-build/src/fixtures/build/lerna-pkgs/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..e85dc989a55014953d43250f2ffdc831da98c697 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-pkgs/lerna.json @@ -0,0 +1,5 @@ +{ + "packages": [ + "core/*" + ] +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-config-override/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/bar/index.js b/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/bar/index.js new file mode 100755 index 0000000000000000000000000000000000000000..2b1938520eaac2ad6857844a5b68c0a81d54b44d --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/bar/index.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/foo/index.js b/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/foo/index.js new file mode 100755 index 0000000000000000000000000000000000000000..aece69e8bb291857d6876c7134a5553da7412249 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/expected/foo/index.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/lerna.json b/packages/father-build/src/fixtures/build/lerna-root-config-override/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/package.json b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config-override/packages/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-config/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/expected/bar/index.esm.js b/packages/father-build/src/fixtures/build/lerna-root-config/expected/bar/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/expected/bar/index.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/expected/foo/index.esm.js b/packages/father-build/src/fixtures/build/lerna-root-config/expected/foo/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/expected/foo/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/lerna.json b/packages/father-build/src/fixtures/build/lerna-root-config/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/package.json b/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/packages/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-config/packages/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-scope/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..5c4c510bf12d58530af692a0c9bb44f9fb03ba0d --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/.fatherrc.js @@ -0,0 +1,3 @@ +export default { + esm: { type: 'babel' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/expected/bar/index.esm.js b/packages/father-build/src/fixtures/build/lerna-root-scope/expected/bar/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/expected/bar/index.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/expected/foo/index.esm.js b/packages/father-build/src/fixtures/build/lerna-root-scope/expected/foo/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/expected/foo/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/lerna.json b/packages/father-build/src/fixtures/build/lerna-root-scope/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..030fee174ef5c47e5108660f99ac7fab32cf3055 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/.fatherrc.js @@ -0,0 +1,3 @@ +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/package.json b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..030fee174ef5c47e5108660f99ac7fab32cf3055 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/.fatherrc.js @@ -0,0 +1,3 @@ +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-scope/packages/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2875def12e169c8fe06eab61f84e6b5e03a97c64 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'babel' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/bar/es/index.js b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/bar/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..11f6ee783c3f8d74cafd11e33eee7b16d1fff15b --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/bar/es/index.js @@ -0,0 +1,3 @@ +export default (function () { + console.log('bar'); +}); \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/foo/es/index.js b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/foo/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..1f28f54e82b143962b047426f7d2de01d3319380 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/expected/foo/es/index.js @@ -0,0 +1,3 @@ +export default (function () { + console.log('foo'); +}); \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/lerna.json b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/package.json b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/src/index.ts b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..f053c5b210df030930e231fccba51baa15038699 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/bar/src/index.ts @@ -0,0 +1,4 @@ + +export default () => { + console.log('bar'); +}; diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/src/index.ts b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..32ecfb320e414b3c21bbc521ac305e63da841534 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/packages/foo/src/index.ts @@ -0,0 +1,4 @@ + +export default () => { + console.log('foo'); +}; diff --git a/packages/father-build/src/fixtures/build/lerna-root-tsconfig/tsconfig.json b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..38fe9e8143954fea8c085956b367362379aec715 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-root-tsconfig/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "declaration": false, + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "jsx": "react", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "exclude": ["node_modules", "es", "lib", "dist"] +} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/bar/index.esm.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/bar/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/bar/index.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/foo/index.esm.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/foo/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/expected/foo/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/lerna.json b/packages/father-build/src/fixtures/build/lerna-scope-packages/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/package.json b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/@hoo/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna-scope-packages/packages/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna/expected/bar/index.esm.js b/packages/father-build/src/fixtures/build/lerna/expected/bar/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/expected/bar/index.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna/expected/foo/index.esm.js b/packages/father-build/src/fixtures/build/lerna/expected/foo/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/expected/foo/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/lerna/lerna.json b/packages/father-build/src/fixtures/build/lerna/lerna.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/lerna.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna/packages/bar/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna/packages/bar/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/bar/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna/packages/bar/package.json b/packages/father-build/src/fixtures/build/lerna/packages/bar/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/bar/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna/packages/bar/src/index.js b/packages/father-build/src/fixtures/build/lerna/packages/bar/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/bar/src/index.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/lerna/packages/foo/.fatherrc.js b/packages/father-build/src/fixtures/build/lerna/packages/foo/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/foo/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/lerna/packages/foo/package.json b/packages/father-build/src/fixtures/build/lerna/packages/foo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/foo/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/father-build/src/fixtures/build/lerna/packages/foo/src/index.js b/packages/father-build/src/fixtures/build/lerna/packages/foo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/lerna/packages/foo/src/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/.fatherrc.js b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..6e6bd69f59c1de0817c42a4a0cf32faa95b9c829 --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + umd: { + minFile: false, + }, +}; diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/expected/index.umd.js b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..3819aa8e9da2dac49febdb8be94110a7f05e081f --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/expected/index.umd.js @@ -0,0 +1,43 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.foo = factory()); +}(this, (function () { 'use strict'; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var lib = createCommonjsModule(function (module) { + (function (root, factory) { + if ( module.exports) { + module.exports = factory(); + } else { + root.timing2 = factory(); + } + }(typeof self !== 'undefined' ? self : commonjsGlobal, function () { + return { + timing2: 'timing2', + }; + })); + }); + + function index () { + console.log(lib); + } + + return index; + +}))); diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/package.json b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/package.json new file mode 100755 index 0000000000000000000000000000000000000000..bde99de9287a49c3e6618f0b908dffdebdcaa369 --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/package.json @@ -0,0 +1,3 @@ +{ + "name": "foo" +} diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/package.json b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/package.json new file mode 100755 index 0000000000000000000000000000000000000000..de662967ec725a8f06a5c99c57ea9b843857d6cd --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/package.json @@ -0,0 +1,9 @@ +{ + "name": "fooo", + "dependencies": { + "timing2": "^0.3.3" + }, + "scripts": { + "build": "father build --umd" + } +} diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/src/index.js b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..ce3b69ab576bf16330c19e41f887ebbabf583ef1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/packages/fooo/src/index.js @@ -0,0 +1,5 @@ +import timing2 from 'timing2'; + +export default function() { + console.log(timing2); +}; diff --git a/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/src/index.js b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..4785cef5701c63ccbf13a255289daf0a1007bb39 --- /dev/null +++ b/packages/father-build/src/fixtures/build/require-node_modules-in-sub-directory/src/index.js @@ -0,0 +1 @@ +export default from '../packages/fooo/src/index'; diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..6e6bd69f59c1de0817c42a4a0cf32faa95b9c829 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + umd: { + minFile: false, + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..1a43aefbc44f3c6512d04cbd518c598476cf7cd3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/expected/index.umd.js @@ -0,0 +1,34 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var foo_1 = createCommonjsModule(function (module, exports) { + var foo = exports; + + foo.a = function () { + return 'a'; + }; + foo.b = function () { + return 'b'; + }; + }); + + console.log(foo_1.a()); + console.log(foo_1.b()); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/package.json b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/package.json new file mode 100755 index 0000000000000000000000000000000000000000..040bc3a1eb645d6cd39cff0942912d839d611997 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/src/index.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fa897e84bf2cbe3ab940fe5eaa79c08a9bf755b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps-auto-named-exports/src/index.js @@ -0,0 +1,4 @@ +import { a, b } from 'foo'; + +console.log(a()); +console.log(b()); diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..6e6bd69f59c1de0817c42a4a0cf32faa95b9c829 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + umd: { + minFile: false, + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..2c1ff18cee70a8daba32715b5f096aba259b41a2 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/expected/index.umd.js @@ -0,0 +1,18 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + var foo = { + a: function () { + return 'a'; + }, + b: function () { + return 'b'; + }, + }; + + console.log(foo.a()); + console.log(foo.b()); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps/package.json b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/package.json new file mode 100755 index 0000000000000000000000000000000000000000..040bc3a1eb645d6cd39cff0942912d839d611997 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-commonjs-deps/src/index.js b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fa897e84bf2cbe3ab940fe5eaa79c08a9bf755b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-commonjs-deps/src/index.js @@ -0,0 +1,4 @@ +import { a, b } from 'foo'; + +console.log(a()); +console.log(b()); diff --git a/packages/father-build/src/fixtures/build/rollup-config-alias/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-config-alias/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..85815c788f714fa483908c94e2e28d5c9e1fe0ed --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-config-alias/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: 'rollup', +} diff --git a/packages/father-build/src/fixtures/build/rollup-config-alias/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-config-alias/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..586fcf9a5a33b31ec402f9a182b9e1393404510d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-config-alias/expected/index.esm.js @@ -0,0 +1,6 @@ +var foo = 'a'; +function index () { + console.log(foo); +} + +export default index; diff --git a/packages/father-build/src/fixtures/build/rollup-config-alias/src/index.js b/packages/father-build/src/fixtures/build/rollup-config-alias/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..80c65e1f0a4e068bd6ecff7b87e790742abebabb --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-config-alias/src/index.js @@ -0,0 +1,6 @@ + +const foo = 'a'; + +export default function () { + console.log(foo); +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..5f43af600839b66cdf7c14df70cf06bc82176b0a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/.fatherrc.js @@ -0,0 +1,10 @@ + +export default { + esm: { type: 'rollup' }, + autoprefixer: { + overrideBrowserslist: [ + 'ie>8', + 'Safari >= 6', + ], + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..7724570dabc407309a22f4635c7b118db9548350 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/expected/index.esm.js @@ -0,0 +1,31 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = "\n.a {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n}\n"; +styleInject(css_248z); + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/foo.css b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..b4d332f68dba01dfcc7bbe87e54b93e7d2cdc2fe --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/foo.css @@ -0,0 +1,4 @@ + +.a { + display: flex; +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/index.js b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9a761d97aac83e3efad1a6f27b1b45ccf8d34dd0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-autoprefixer/src/index.js @@ -0,0 +1,3 @@ +import './foo.css'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-css-extract/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-css-extract/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..c01e2a255389b53ffb2068d68293b32077a7ab5f --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-extract/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + extractCSS: true, + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.css b/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-extract/expected/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-css-extract/src/foo.css b/packages/father-build/src/fixtures/build/rollup-css-extract/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-extract/src/foo.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-css-extract/src/index.js b/packages/father-build/src/fixtures/build/rollup-css-extract/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9a761d97aac83e3efad1a6f27b1b45ccf8d34dd0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-extract/src/index.js @@ -0,0 +1,3 @@ +import './foo.css'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-css-inject/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-css-inject/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..c39568546c05cbd854391f81e65340bfe902c0be --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-inject/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + injectCSS: false, + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-inject/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-css-inject/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..d5522693b6b2627b9e914dc68390a37315935108 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-inject/expected/index.esm.js @@ -0,0 +1,3 @@ +var css_248z = "\n.a { color: green; }\n"; + +console.log(css_248z); diff --git a/packages/father-build/src/fixtures/build/rollup-css-inject/src/foo.css b/packages/father-build/src/fixtures/build/rollup-css-inject/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-inject/src/foo.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-css-inject/src/index.js b/packages/father-build/src/fixtures/build/rollup-css-inject/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..b2bb60ab0d779b4fb284213aef360690e342a691 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-inject/src/index.js @@ -0,0 +1,3 @@ +import style from './foo.css'; + +console.log(style); diff --git a/packages/father-build/src/fixtures/build/rollup-css-modules/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-css-modules/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..d75347b75949d2398746f1c4af62d7a36e1ebd4c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-modules/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + esm: { type: 'rollup' }, + cssModules: true, +} diff --git a/packages/father-build/src/fixtures/build/rollup-css-modules/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-css-modules/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..7e6569e189667b17b7cc78a6e1c203e4ef5b5b72 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-modules/expected/index.esm.js @@ -0,0 +1,32 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = "\n.foo_a__3z5g- { color: green; }\n"; +var styles = {"a":"foo_a__3z5g-"}; +styleInject(css_248z); + +console.log('foo', styles.a); diff --git a/packages/father-build/src/fixtures/build/rollup-css-modules/src/foo.css b/packages/father-build/src/fixtures/build/rollup-css-modules/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-modules/src/foo.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-css-modules/src/index.js b/packages/father-build/src/fixtures/build/rollup-css-modules/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..0ebd23438db86f59b6dba886d2cff08de959e93c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css-modules/src/index.js @@ -0,0 +1,3 @@ +import styles from './foo.css'; + +console.log('foo', styles.a); diff --git a/packages/father-build/src/fixtures/build/rollup-css/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-css/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-css/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-css/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..f7e62e7a85f4e328ad1bb2b6fe83b1132eeb0200 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css/expected/index.esm.js @@ -0,0 +1,31 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = "\n.a {\n color: green;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-box-align: stretch;\n}\n"; +styleInject(css_248z); + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-css/src/foo.css b/packages/father-build/src/fixtures/build/rollup-css/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..ca6e9cd5d7d182ad898286233fd6ea2482008b33 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css/src/foo.css @@ -0,0 +1,7 @@ + +.a { + color: green; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-box-align: stretch; +} diff --git a/packages/father-build/src/fixtures/build/rollup-css/src/index.js b/packages/father-build/src/fixtures/build/rollup-css/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9a761d97aac83e3efad1a6f27b1b45ccf8d34dd0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-css/src/index.js @@ -0,0 +1,3 @@ +import './foo.css'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-esm-minify/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-esm-minify/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..25ded9459a22ad2d17502f795746e02bf3f5a35f --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-minify/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup', minify: true }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-esm-minify/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-esm-minify/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..f05f55286740264cb0e2384db7b3e5daeef43282 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-minify/expected/index.esm.js @@ -0,0 +1 @@ +function o(){console.log("foo")}export default o; diff --git a/packages/father-build/src/fixtures/build/rollup-esm-minify/package.json b/packages/father-build/src/fixtures/build/rollup-esm-minify/package.json new file mode 100755 index 0000000000000000000000000000000000000000..81bb2b631466508f034b8db545ae4de3ab69472a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-minify/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "bar": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-esm-minify/src/foo.js b/packages/father-build/src/fixtures/build/rollup-esm-minify/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-minify/src/foo.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-esm-minify/src/index.js b/packages/father-build/src/fixtures/build/rollup-esm-minify/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..079e99f5adebe1f4c6398be216cedaffad1566ba --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-minify/src/index.js @@ -0,0 +1,5 @@ +import foo from './foo'; + +export default function () { + console.log(foo()); +} diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-esm-mjs/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..ed89f5d34aac8fe2dfe1d4db2aa80199b6cc7430 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup', mjs: true }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..6890cce5b5857068e3720e300e04d262faf10016 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.esm.js @@ -0,0 +1,6 @@ +import 'bar'; + +function index () { +} + +export default index; diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.mjs b/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.mjs new file mode 100755 index 0000000000000000000000000000000000000000..8f73bfe1b6e7ad51d4e7b3d91b973ac3a3c0e0ef --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/expected/index.mjs @@ -0,0 +1 @@ +function o(){}console.log("bar");export default o; diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/package.json b/packages/father-build/src/fixtures/build/rollup-esm-mjs/package.json new file mode 100755 index 0000000000000000000000000000000000000000..81bb2b631466508f034b8db545ae4de3ab69472a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "bar": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/foo.js b/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/foo.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/index.js b/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..01d696690c74bcfce3115ca0a5dae1de56052305 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-esm-mjs/src/index.js @@ -0,0 +1,6 @@ +import 'bar'; +import foo from './foo'; + +export default function () { + foo(); +} diff --git a/packages/father-build/src/fixtures/build/rollup-externalsExclude/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-externalsExclude/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..8ab27f0f1e7bba1ce6d4da355aa56d6187437299 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-externalsExclude/.fatherrc.js @@ -0,0 +1,11 @@ + +export default { + esm: { type: 'rollup' }, + cjs: { type: 'rollup' }, + extraExternals: [ + 'foo', + ], + externalsExclude: [ + 'foo/bar', + ], +}; diff --git a/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..60d2ac22156e6a894e9f3fa0c0d2c4bab3a56081 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.esm.js @@ -0,0 +1,5 @@ +import 'foo'; + +(() => { + console.log('bar'); +})(); diff --git a/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.js b/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..98f72615c52f86d3b760c31ffdfe9a34fe22c5d0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-externalsExclude/expected/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('foo'); + +(() => { + console.log('bar'); +})(); diff --git a/packages/father-build/src/fixtures/build/rollup-externalsExclude/package.json b/packages/father-build/src/fixtures/build/rollup-externalsExclude/package.json new file mode 100755 index 0000000000000000000000000000000000000000..6a3252ea8dfb45eb34284a133945256ab8979e74 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-externalsExclude/package.json @@ -0,0 +1,3 @@ +{ + "version": "0.1.0" +} diff --git a/packages/father-build/src/fixtures/build/rollup-externalsExclude/src/index.js b/packages/father-build/src/fixtures/build/rollup-externalsExclude/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..40d29331c28a2d06bdc7a56097f0b08bb534c806 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-externalsExclude/src/index.js @@ -0,0 +1,2 @@ +import 'foo'; +import 'foo/bar'; diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..0dfd93f4b2cb17a858721c738caff218ea7a3558 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/.fatherrc.js @@ -0,0 +1,10 @@ + +export default { + esm: { type: 'rollup' }, + extraBabelPresets: [ + require.resolve('./preset'), + ], + extraBabelPlugins: [ + require.resolve('./p2'), + ], +}; diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..0b60c0ede6000798346aaf14d1e22f10f0ee1cd1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/expected/index.esm.js @@ -0,0 +1,2 @@ +console.log("p1", "p2", 1); +alert(2); diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p1.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p1.js new file mode 100755 index 0000000000000000000000000000000000000000..a3a3e24e183d95a18752c3704da5114e1432c25c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p1.js @@ -0,0 +1,20 @@ + +module.exports = function ({ types: t }) { + function isConsoleLog(node) { + const { callee, callee: { object, property } } = node; + return t.isMemberExpression(callee) + && t.isIdentifier(object) && object.name === 'console' + && t.isIdentifier(property) && property.name === 'log'; + } + + return { + visitor: { + CallExpression(path, state) { + const { node, node: { callee, callee: { object, property } } } = path; + if (isConsoleLog(node)) { + node.arguments.unshift(t.stringLiteral('p1')); + } + }, + }, + }; +} diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p2.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p2.js new file mode 100755 index 0000000000000000000000000000000000000000..297ac66d1a572d4ddc8d543612375dfeb5f60ac6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/p2.js @@ -0,0 +1,20 @@ + +module.exports = function ({ types: t }) { + function isConsoleLog(node) { + const { callee, callee: { object, property } } = node; + return t.isMemberExpression(callee) + && t.isIdentifier(object) && object.name === 'console' + && t.isIdentifier(property) && property.name === 'log'; + } + + return { + visitor: { + CallExpression(path, state) { + const { node, node: { callee, callee: { object, property } } } = path; + if (isConsoleLog(node)) { + node.arguments.unshift(t.stringLiteral('p2')); + } + }, + }, + }; +} diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/preset.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/preset.js new file mode 100755 index 0000000000000000000000000000000000000000..07ccbb29c5e0e2bc072426cd312d1436de6995ef --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/preset.js @@ -0,0 +1,8 @@ + +module.exports = function () { + return { + plugins: [ + require.resolve('./p1'), + ], + }; +} diff --git a/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/src/index.js b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..923799068e9727034da827fbc993b2d5c0dfcfcf --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extra-babel-presets-and-plugins/src/index.js @@ -0,0 +1,3 @@ + +console.log(1); +alert(2); diff --git a/packages/father-build/src/fixtures/build/rollup-extraExternals/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-extraExternals/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..409af0a2c88585da53082881d9f6cf3c528f0291 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraExternals/.fatherrc.js @@ -0,0 +1,9 @@ + +export default { + esm: { type: 'rollup' }, + extraExternals: [ + '@ali/foo', + '@tmp', + 'foo', + ] +}; diff --git a/packages/father-build/src/fixtures/build/rollup-extraExternals/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-extraExternals/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..1a8c84dab5bb01e1a8e57c32ddf716c0fabf7449 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraExternals/expected/index.esm.js @@ -0,0 +1,5 @@ +import 'foo'; +import '@ali/foo'; +import '@ali/foo/bar'; +import '@tmp/foo'; +import '@tmp/foo/bar'; diff --git a/packages/father-build/src/fixtures/build/rollup-extraExternals/package.json b/packages/father-build/src/fixtures/build/rollup-extraExternals/package.json new file mode 100755 index 0000000000000000000000000000000000000000..6a3252ea8dfb45eb34284a133945256ab8979e74 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraExternals/package.json @@ -0,0 +1,3 @@ +{ + "version": "0.1.0" +} diff --git a/packages/father-build/src/fixtures/build/rollup-extraExternals/src/index.js b/packages/father-build/src/fixtures/build/rollup-extraExternals/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..3e307458fb6f36e1d68086a240b12203914472a4 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraExternals/src/index.js @@ -0,0 +1,6 @@ + +import 'foo'; +import '@ali/foo'; +import '@ali/foo/bar'; +import '@tmp/foo'; +import '@tmp/foo/bar'; diff --git a/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..f3438f39bd637eb0bede5911eca231fc7d253367 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/.fatherrc.js @@ -0,0 +1,10 @@ +import replace from 'rollup-plugin-replace'; + +export default { + esm: { type: 'rollup' }, + extraRollupPlugins: [ + replace({ + VERSION: JSON.stringify('1.0.0'), + }), + ], +}; diff --git a/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..22c71e692addbca546431bdd7d684865a979894b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/expected/index.esm.js @@ -0,0 +1 @@ +console.log("1.0.0"); diff --git a/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/package.json b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/package.json new file mode 100755 index 0000000000000000000000000000000000000000..6a3252ea8dfb45eb34284a133945256ab8979e74 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/package.json @@ -0,0 +1,3 @@ +{ + "version": "0.1.0" +} diff --git a/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/src/index.js b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..2c9bf555984846f7ee51468ad7a7c51a63d09fa9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-extraRollupPlugins/src/index.js @@ -0,0 +1,2 @@ + +console.log(VERSION); diff --git a/packages/father-build/src/fixtures/build/rollup-import-directory/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-import-directory/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..8b9450222eff5fd383e79e231afcb430c20a93c7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-import-directory/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-import-directory/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-import-directory/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-import-directory/expected/index.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-import-directory/src/foo/index.js b/packages/father-build/src/fixtures/build/rollup-import-directory/src/foo/index.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-import-directory/src/foo/index.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-import-directory/src/index.js b/packages/father-build/src/fixtures/build/rollup-import-directory/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..ead12a719a8121ee247156f4275fdf04230acbc7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-import-directory/src/index.js @@ -0,0 +1 @@ +import './foo'; diff --git a/packages/father-build/src/fixtures/build/rollup-importLibToEs/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-importLibToEs/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2881eb5847aeec513c4198bd7f8218bbb378b60b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-importLibToEs/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + cjs: { type: 'rollup' }, + esm: { type: 'rollup', importLibToEs: true }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..ae0559b15b3aead85df99bd8023cc55999bc5d5d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.esm.js @@ -0,0 +1,5 @@ +function foo () { + return 'es/foo'; +} + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.js b/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..c4e33e77154889836431c1101d679b39bd8ab37b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-importLibToEs/expected/index.js @@ -0,0 +1,7 @@ +'use strict'; + +function foo () { + return 'lib/foo'; +} + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-importLibToEs/src/index.js b/packages/father-build/src/fixtures/build/rollup-importLibToEs/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..a8105c428f343174a8ac46f8e9f6c2817036ddcd --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-importLibToEs/src/index.js @@ -0,0 +1,3 @@ +import foo from 'foo/lib/foo'; + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-inject/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-inject/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..cc0759d337260b834f797fc4c80a9d457bcf9b77 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-inject/.fatherrc.js @@ -0,0 +1,7 @@ + +export default { + esm: { type: 'rollup' }, + inject: { + 'window.foo': 'foo', + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-inject/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-inject/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..2f87bded3fda7e98fa48454e8bb62c8245b1d1a6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-inject/expected/index.esm.js @@ -0,0 +1,3 @@ +import $inject_window_foo from 'foo'; + +console.log($inject_window_foo); diff --git a/packages/father-build/src/fixtures/build/rollup-inject/package.json b/packages/father-build/src/fixtures/build/rollup-inject/package.json new file mode 100755 index 0000000000000000000000000000000000000000..040bc3a1eb645d6cd39cff0942912d839d611997 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-inject/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-inject/src/index.js b/packages/father-build/src/fixtures/build/rollup-inject/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..4f632e0dee9de9ec6275a3a511c83d2c202d4743 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-inject/src/index.js @@ -0,0 +1 @@ +console.log(window.foo); diff --git a/packages/father-build/src/fixtures/build/rollup-json/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-json/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..8b9450222eff5fd383e79e231afcb430c20a93c7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-json/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-json/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-json/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..6ee3aced8fe20dc33e8daaa3db6194845bcd2ed9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-json/expected/index.esm.js @@ -0,0 +1,6 @@ +var foo = "bar"; +var pkg = { + foo: foo +}; + +console.log(pkg); diff --git a/packages/father-build/src/fixtures/build/rollup-json/src/index.js b/packages/father-build/src/fixtures/build/rollup-json/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..3ce7d4a366334d6f976ab9cb4e14a55b50c9a27a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-json/src/index.js @@ -0,0 +1,3 @@ +import pkg from './pkg.json'; + +console.log(pkg); diff --git a/packages/father-build/src/fixtures/build/rollup-json/src/pkg.json b/packages/father-build/src/fixtures/build/rollup-json/src/pkg.json new file mode 100755 index 0000000000000000000000000000000000000000..c8c4105eb57cdab7bc5d282693d81a75794d0b6e --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-json/src/pkg.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} diff --git a/packages/father-build/src/fixtures/build/rollup-less-modules/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-less-modules/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..d75347b75949d2398746f1c4af62d7a36e1ebd4c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-modules/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + esm: { type: 'rollup' }, + cssModules: true, +} diff --git a/packages/father-build/src/fixtures/build/rollup-less-modules/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-less-modules/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..964691ea99960c0ff247215a82d310289e1ca2e6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-modules/expected/index.esm.js @@ -0,0 +1,32 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = ".foo_a__1JvkR {\n color: green;\n}\n"; +var styles = {"a":"foo_a__1JvkR"}; +styleInject(css_248z); + +console.log('foo', styles.a); diff --git a/packages/father-build/src/fixtures/build/rollup-less-modules/src/foo.less b/packages/father-build/src/fixtures/build/rollup-less-modules/src/foo.less new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-modules/src/foo.less @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-less-modules/src/index.js b/packages/father-build/src/fixtures/build/rollup-less-modules/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9c442740f3e7298a4080a888e8a6ec502e61f091 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-modules/src/index.js @@ -0,0 +1,3 @@ +import styles from './foo.less'; + +console.log('foo', styles.a); diff --git a/packages/father-build/src/fixtures/build/rollup-less-node-modules/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-less-node-modules/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-node-modules/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-less-node-modules/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-less-node-modules/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..bea7558e710aad36a08491e8031fbb3a3219b767 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-node-modules/expected/index.esm.js @@ -0,0 +1,31 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = ".bar {\n color: red;\n}\n.a {\n color: green;\n}\n"; +styleInject(css_248z); + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/foo.less b/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/foo.less new file mode 100755 index 0000000000000000000000000000000000000000..f49f40a454ff46c9a88ecdc341af1eeac9587fb5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/foo.less @@ -0,0 +1,3 @@ +@import '~foo/bar.less'; + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/index.js b/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..eb9155cfcf2bb412803a269ddee3f10a62a0218a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less-node-modules/src/index.js @@ -0,0 +1,3 @@ +import './foo.less'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-less/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-less/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-less/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-less/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..47e82c7fc1d13b102b545b190e3e8401532c1c99 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less/expected/index.esm.js @@ -0,0 +1,31 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = ".a {\n color: green;\n}\n"; +styleInject(css_248z); + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-less/src/foo.less b/packages/father-build/src/fixtures/build/rollup-less/src/foo.less new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less/src/foo.less @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-less/src/index.js b/packages/father-build/src/fixtures/build/rollup-less/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..eb9155cfcf2bb412803a269ddee3f10a62a0218a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-less/src/index.js @@ -0,0 +1,3 @@ +import './foo.less'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-multiple-entry/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-multiple-entry/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..c49c9b152627cb0338444ff60d770d00e4b1e8d5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-multiple-entry/.fatherrc.js @@ -0,0 +1,8 @@ + +export default { + entry: [ + './src/foo.js', + './src/bar.js', + ], + esm: { type: 'rollup' }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/bar.esm.js b/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/bar.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/bar.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/foo.esm.js b/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/foo.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-multiple-entry/expected/foo.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/bar.js b/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/bar.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/bar.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/foo.js b/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-multiple-entry/src/foo.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-node-resolve/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-node-resolve/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..5d6b9128ee5ba5bbaf3adf9c63407e22ee10c559 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-node-resolve/.fatherrc.js @@ -0,0 +1,9 @@ + +export default { + umd: { + minFile: false, + }, + nodeResolveOpts: { + browser: true, + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-node-resolve/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-node-resolve/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..5e9006d51920ef32b6bc35588e52dfa3db331925 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-node-resolve/expected/index.umd.js @@ -0,0 +1,10 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + var browser = 'hello browser'; + + console.log(browser); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-node-resolve/package.json b/packages/father-build/src/fixtures/build/rollup-node-resolve/package.json new file mode 100755 index 0000000000000000000000000000000000000000..040bc3a1eb645d6cd39cff0942912d839d611997 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-node-resolve/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-node-resolve/src/index.js b/packages/father-build/src/fixtures/build/rollup-node-resolve/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9096879303779bfb70c57c772d73a7d5e6326e1a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-node-resolve/src/index.js @@ -0,0 +1,3 @@ +import hello from 'foo'; + +console.log(hello); diff --git a/packages/father-build/src/fixtures/build/rollup-normal/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-normal/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2ae3de8e24826170dda6c5ea32ac4bde6dfa67cc --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + cjs: { type: 'rollup' }, + esm: { type: 'rollup' }, + umd: {}, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-normal/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..ea63e10f290aba549e314098173677c72a3d6b81 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.esm.js @@ -0,0 +1,7 @@ +import 'bar'; + +function foo () { + return 'foo'; +} + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-normal/expected/index.js b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..c50247820a743002f511bbba3e48ac94e10551d0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.js @@ -0,0 +1,9 @@ +'use strict'; + +require('bar'); + +function foo () { + return 'foo'; +} + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..ca82ca23f7eb12c93d22a9f6f565bab250103fbe --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.js @@ -0,0 +1,12 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(['bar'], factory) : + factory(); +}((function () { 'use strict'; + + function foo () { + return 'foo'; + } + + console.log(foo()); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.min.js b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.min.js new file mode 100755 index 0000000000000000000000000000000000000000..c654cc12fe80a2df7f233754d271a4c1b7b29504 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/expected/index.umd.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(["bar"],n):n()}((function(){"use strict";console.log("foo")})); diff --git a/packages/father-build/src/fixtures/build/rollup-normal/package.json b/packages/father-build/src/fixtures/build/rollup-normal/package.json new file mode 100755 index 0000000000000000000000000000000000000000..5ca44beaa2c51bc10fc30b85a871bc2ef512c61f --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/package.json @@ -0,0 +1,5 @@ +{ + "peerDependencies": { + "bar": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-normal/src/foo.js b/packages/father-build/src/fixtures/build/rollup-normal/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/src/foo.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-normal/src/index.js b/packages/father-build/src/fixtures/build/rollup-normal/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9d80d06dcd668a9b63ef304d70a4d1b6e701b49a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-normal/src/index.js @@ -0,0 +1,4 @@ +import 'bar'; +import foo from './foo'; + +console.log(foo()); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..1bc453016d9f949e2fe72474b5d01af24e1477d9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/.fatherrc.js @@ -0,0 +1,29 @@ + +export default { + entry: [ + 'src/index.js', + 'src/foo.js', + 'src/bar.js', + ], + umd: { + }, + cjs: { type: 'rollup' }, + esm: { type: 'rollup' }, + file: 'dva', + overridesByEntry: { + 'src/foo.js': { + file: 'dva.foo', + cjs: { type: 'rollup', file: 'dva.foo.cjs' }, + esm: { type: 'rollup', file: 'dva.foo.esm' }, + }, + 'src/bar.js': { + cjs: false, + esm: false, + umd: { file: 'dva.bar' }, + }, + 'src/index.js': { + cjs: false, + esm: false, + }, + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.js new file mode 100755 index 0000000000000000000000000000000000000000..70ba81f61dd3cafafe7cd4d31c528dd29fd338a2 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + console.log('bar'); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.min.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.min.js new file mode 100755 index 0000000000000000000000000000000000000000..7f57ce5a8d635cdb0fe4904929ee1ce50aae1f70 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.bar.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){"use strict";console.log("bar")})); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.esm.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..8cc7aa3e902fcabc3cf77936b3c8efb864d40c97 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.esm.js @@ -0,0 +1 @@ +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.cjs.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.cjs.js new file mode 100755 index 0000000000000000000000000000000000000000..aece69e8bb291857d6876c7134a5553da7412249 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.cjs.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.esm.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..81afa3157c18b0093ea76e6faae703945254f2d7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.esm.js @@ -0,0 +1 @@ +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..62e3a909f0cfdf6bc390d2bedfe0c1b196fa3041 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + console.log('foo'); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.min.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.min.js new file mode 100755 index 0000000000000000000000000000000000000000..e383c2dd0e81fc7dc50ce59e18be132048a0360a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.foo.umd.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){"use strict";console.log("foo")})); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.js new file mode 100755 index 0000000000000000000000000000000000000000..2b1938520eaac2ad6857844a5b68c0a81d54b44d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..fd2bf1e894ba4cfe1c1e49a23b56977eccfe780b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + console.log('index'); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.min.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.min.js new file mode 100755 index 0000000000000000000000000000000000000000..a15d21f33b46bd2f4ab0cb9ad72a1b744753e7f2 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/expected/dva.umd.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){"use strict";console.log("index")})); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/bar.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/bar.js new file mode 100755 index 0000000000000000000000000000000000000000..9638d025d9eed6a861887c637fef36cfd490b7c9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/bar.js @@ -0,0 +1,2 @@ + +console.log('bar'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/foo.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/foo.js new file mode 100755 index 0000000000000000000000000000000000000000..695557eab3c4ea5de1934487cb776646ed978ca5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/foo.js @@ -0,0 +1,2 @@ + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/index.js b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..112a16294a98168dad6c8b958ec2e818bee35bb3 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-outputFilename-with-overrides/src/index.js @@ -0,0 +1,2 @@ + +console.log('index'); diff --git a/packages/father-build/src/fixtures/build/rollup-replace/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-replace/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..5be9fca42837f574be14ece115634d9f7532f87d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-replace/.fatherrc.js @@ -0,0 +1,7 @@ + +export default { + esm: { type: 'rollup' }, + replace: { + VERSION: JSON.stringify(require('./package').version), + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-replace/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-replace/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..3bbfad94d5ea55bbed31a08ff06cf223f60617ef --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-replace/expected/index.esm.js @@ -0,0 +1 @@ +console.log("0.1.0"); diff --git a/packages/father-build/src/fixtures/build/rollup-replace/package.json b/packages/father-build/src/fixtures/build/rollup-replace/package.json new file mode 100755 index 0000000000000000000000000000000000000000..6a3252ea8dfb45eb34284a133945256ab8979e74 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-replace/package.json @@ -0,0 +1,3 @@ +{ + "version": "0.1.0" +} diff --git a/packages/father-build/src/fixtures/build/rollup-replace/src/index.js b/packages/father-build/src/fixtures/build/rollup-replace/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..2c9bf555984846f7ee51468ad7a7c51a63d09fa9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-replace/src/index.js @@ -0,0 +1,2 @@ + +console.log(VERSION); diff --git a/packages/father-build/src/fixtures/build/rollup-resolve-jsx/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..8b9450222eff5fd383e79e231afcb430c20a93c7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-resolve-jsx/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..949fb857ba82ddc446a90585c4734c71af549503 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/expected/index.esm.js @@ -0,0 +1,11 @@ +import React from 'react'; + +var Foo = (function () { + return /*#__PURE__*/React.createElement("h1", null, "Foo"); +}); + +var index = (function () { + return /*#__PURE__*/React.createElement(Foo, null); +}); + +export default index; diff --git a/packages/father-build/src/fixtures/build/rollup-resolve-jsx/package.json b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/package.json new file mode 100755 index 0000000000000000000000000000000000000000..55ef290f19b10aae33d6bb31dd64fd3e6d9dd338 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "16" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/Foo.jsx b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/Foo.jsx new file mode 100755 index 0000000000000000000000000000000000000000..b518bbcb20962ba2f19fd3797cbfe79b08ce2bbb --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/Foo.jsx @@ -0,0 +1,2 @@ + +export default () =>

Foo

; diff --git a/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/index.js b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..f61210cf6b4f96c0d5cbc7b3f4b72e9809617e2c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-resolve-jsx/src/index.js @@ -0,0 +1,3 @@ +import Foo from './Foo'; + +export default () => ; diff --git a/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..b3cf647243a248f6f1c4b69da7bf048b7da85c61 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + runtimeHelpers: true, + esm: { type: 'rollup' }, + cjs: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..1814cb26f369f72241562fe35cc6cb585e458086 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.esm.js @@ -0,0 +1,17 @@ +import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck'; +import _createClass from '@babel/runtime/helpers/esm/createClass'; + +var A = /*#__PURE__*/function () { + function A() { + _classCallCheck(this, A); + } + + _createClass(A, [{ + key: "foo", + value: function foo() {} + }]); + + return A; +}(); + +new A().foo(); diff --git a/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.js b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..73d0a72df6d3218947ed0dfc17976b47ae278a5c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/expected/index.js @@ -0,0 +1,38 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +var A = /*#__PURE__*/function () { + function A() { + _classCallCheck(this, A); + } + + _createClass(A, [{ + key: "foo", + value: function foo() {} + }]); + + return A; +}(); + +new A().foo(); diff --git a/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/package.json b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/package.json new file mode 100755 index 0000000000000000000000000000000000000000..689bf9cfb757f89078bf9de16f249d291886b870 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@babel/runtime": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/src/index.js b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..0cff149b2f0ebfc30dfe27748691c07093124b83 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-runtimeHelpers/src/index.js @@ -0,0 +1,6 @@ + +class A { + foo() {} +} + +(new A()).foo(); diff --git a/packages/father-build/src/fixtures/build/rollup-sass/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-sass/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..2f10183a37fc640a2ae9d8d473d629d03f6434b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-sass/.fatherrc.js @@ -0,0 +1,4 @@ + +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-sass/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-sass/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..12763bf9a7c1f3cb8ceb7705c400d7cfdde2e7dc --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-sass/expected/index.esm.js @@ -0,0 +1,31 @@ +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css_248z = ".a {\n color: green; }\n"; +styleInject(css_248z); + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-sass/src/foo.scss b/packages/father-build/src/fixtures/build/rollup-sass/src/foo.scss new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-sass/src/foo.scss @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-sass/src/index.js b/packages/father-build/src/fixtures/build/rollup-sass/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..28c5d8eb5b1dcdffe8ce6ea74c89ddcc58e52505 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-sass/src/index.js @@ -0,0 +1,3 @@ +import './foo.scss'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-svgr/.umirc.library.js b/packages/father-build/src/fixtures/build/rollup-svgr/.umirc.library.js new file mode 100755 index 0000000000000000000000000000000000000000..030fee174ef5c47e5108660f99ac7fab32cf3055 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-svgr/.umirc.library.js @@ -0,0 +1,3 @@ +export default { + esm: { type: 'rollup' }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-svgr/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-svgr/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..fbcd847e0c3cc3db5d866a22a6cda8b4ad707026 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-svgr/expected/index.esm.js @@ -0,0 +1,22 @@ +import React, { createElement } from 'react'; + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +var _ref = /*#__PURE__*/createElement("defs", null, /*#__PURE__*/createElement("style", null)); + +var _ref2 = /*#__PURE__*/createElement("path", { + d: "M656 512h160c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16H656c-8.8 0-16 7.2-16 16v22H346V320h86c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h86v378c0 17.7 14.3 32 32 32h314v22c0 8.8 7.2 16 16 16h160c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16H656c-8.8 0-16 7.2-16 16v22H346V474h294v22c0 8.8 7.2 16 16 16z" +}); + +function SvgMenu(props) { + return /*#__PURE__*/createElement("svg", _extends({ + className: "menu_svg__icon", + viewBox: "0 0 1024 1024", + width: 200, + height: 200 + }, props), _ref, _ref2); +} + +var svgUrl = "data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20standalone%3D%22no%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20t%3D%221558949630117%22%20class%3D%22icon%22%20style%3D%22%22%20viewBox%3D%220%200%201024%201024%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%20%20%20%20p-id%3D%2233994%22%20%20%20%20%20width%3D%22200%22%20height%3D%22200%22%3E%20%20%3Cdefs%3E%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%3C%2Fstyle%3E%20%20%3C%2Fdefs%3E%20%20%3Cpath%20%20%20%20d%3D%22M656%20512h160c8.8%200%2016-7.2%2016-16v-96c0-8.8-7.2-16-16-16H656c-8.8%200-16%207.2-16%2016v22H346V320h86c8.8%200%2016-7.2%2016-16v-96c0-8.8-7.2-16-16-16H208c-8.8%200-16%207.2-16%2016v96c0%208.8%207.2%2016%2016%2016h86v378c0%2017.7%2014.3%2032%2032%2032h314v22c0%208.8%207.2%2016%2016%2016h160c8.8%200%2016-7.2%2016-16v-96c0-8.8-7.2-16-16-16H656c-8.8%200-16%207.2-16%2016v22H346V474h294v22c0%208.8%207.2%2016%2016%2016z%22%20%20%20%20p-id%3D%2233995%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E"; + +console.log(svgUrl, /*#__PURE__*/React.createElement(SvgMenu, null)); diff --git a/packages/father-build/src/fixtures/build/rollup-svgr/package.json b/packages/father-build/src/fixtures/build/rollup-svgr/package.json new file mode 100755 index 0000000000000000000000000000000000000000..55ef290f19b10aae33d6bb31dd64fd3e6d9dd338 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-svgr/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "16" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-svgr/src/index.jsx b/packages/father-build/src/fixtures/build/rollup-svgr/src/index.jsx new file mode 100755 index 0000000000000000000000000000000000000000..769d90a58b62f44732bce873c9dfc2939a4afcc9 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-svgr/src/index.jsx @@ -0,0 +1,3 @@ +import svgUrl, { ReactComponent as MenuComponent } from './menu.svg'; + +console.log(svgUrl, ); diff --git a/packages/father-build/src/fixtures/build/rollup-svgr/src/menu.svg b/packages/father-build/src/fixtures/build/rollup-svgr/src/menu.svg new file mode 100755 index 0000000000000000000000000000000000000000..bd7bb1417e9d1d01df68cfc628773af94bdf5514 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-svgr/src/menu.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/.fatherrc.ts b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/.fatherrc.ts new file mode 100755 index 0000000000000000000000000000000000000000..35309e6f8de87c70abfa97b29174fd6a68508689 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/.fatherrc.ts @@ -0,0 +1,7 @@ +export default { + cjs: 'rollup', + esm: 'rollup', + typescriptOpts: { + useTsconfigDeclarationDir: true, + }, +}; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..a0ca5bfdffa7e1cccdfe7166f59fecfdb55371fa --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.esm.js @@ -0,0 +1,5 @@ +function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} + +export default foo; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.js b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..39a5ac9899d8bfb6c9517a500031287e2305181f --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/index.js @@ -0,0 +1,7 @@ +'use strict'; + +function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} + +module.exports = foo; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/type/index.d.ts b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/type/index.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..9eea9c0f15fb322e51027cd7e4cea68b1a11aea7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/expected/type/index.d.ts @@ -0,0 +1,5 @@ +interface IOpts { + foo: boolean; +} +export default function foo(opts: IOpts): string; +export {}; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/src/index.ts b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..3a0363ce2a05cc9273d59fe5c0fe97b623638af8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/src/index.ts @@ -0,0 +1,7 @@ +interface IOpts { + foo: boolean; +} + +export default function foo(opts: IOpts): string { + return opts.foo ? 'foo' : 'bar'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/tsconfig.json b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..59dd443861d9f04acd1359e9e2d587f5b2fcf130 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "node", + "jsx": "preserve", + "esModuleInterop": true, + "declarationDir": "dist/type" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/typings.d.ts b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/typings.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..211708df8c6803222df1ab728e16df65c7bb4536 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript-declarationDir/typings.d.ts @@ -0,0 +1,7 @@ +declare module '*.less' { + interface IClassNames { + [className: string]: string; + } + const classNames: IClassNames; + export = classNames; +} diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/.fatherrc.ts b/packages/father-build/src/fixtures/build/rollup-typescript/.fatherrc.ts new file mode 100755 index 0000000000000000000000000000000000000000..3e130204ea11b48ace9d5b8ad7e218756d5f164e --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/.fatherrc.ts @@ -0,0 +1,4 @@ +export default { + cjs: 'rollup', + esm: 'rollup', +}; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.d.ts b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..9eea9c0f15fb322e51027cd7e4cea68b1a11aea7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.d.ts @@ -0,0 +1,5 @@ +interface IOpts { + foo: boolean; +} +export default function foo(opts: IOpts): string; +export {}; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.esm.js b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..a0ca5bfdffa7e1cccdfe7166f59fecfdb55371fa --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.esm.js @@ -0,0 +1,5 @@ +function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} + +export default foo; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.js b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..39a5ac9899d8bfb6c9517a500031287e2305181f --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/expected/index.js @@ -0,0 +1,7 @@ +'use strict'; + +function foo(opts) { + return opts.foo ? 'foo' : 'bar'; +} + +module.exports = foo; diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/src/index.ts b/packages/father-build/src/fixtures/build/rollup-typescript/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..3a0363ce2a05cc9273d59fe5c0fe97b623638af8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/src/index.ts @@ -0,0 +1,7 @@ +interface IOpts { + foo: boolean; +} + +export default function foo(opts: IOpts): string { + return opts.foo ? 'foo' : 'bar'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/tsconfig.json b/packages/father-build/src/fixtures/build/rollup-typescript/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..d322bf935abea0a37cd0acd671d2a5438fb3fa0e --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "node", + "jsx": "preserve", + "esModuleInterop": true + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-typescript/typings.d.ts b/packages/father-build/src/fixtures/build/rollup-typescript/typings.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..211708df8c6803222df1ab728e16df65c7bb4536 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-typescript/typings.d.ts @@ -0,0 +1,7 @@ +declare module '*.less' { + interface IClassNames { + [className: string]: string; + } + const classNames: IClassNames; + export = classNames; +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-auto-name/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..da054b28720c42934452cda9ecafd11e1bb43a9e --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + umd: { + minFile: false + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-auto-name/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..07691b4fa8f29f6613c5fabcf5eab2924230a182 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/expected/index.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.fooBar = factory()); +}(this, (function () { 'use strict'; + + function index () { + return 'foo'; + } + + return index; + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-auto-name/package.json b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/package.json new file mode 100755 index 0000000000000000000000000000000000000000..a02a5e12d0bac115e30cc063dde7fd614662ade5 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/package.json @@ -0,0 +1,3 @@ +{ + "name": "@umi/foo-bar" +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-auto-name/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-auto-name/src/index.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..e1ea4fca3da2393094c6e566c07d0f51d90106bd --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/.fatherrc.js @@ -0,0 +1,5 @@ + +export default { + extractCSS: true, + umd: {}, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.css b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..62e3a909f0cfdf6bc390d2bedfe0c1b196fa3041 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + console.log('foo'); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.css b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.css new file mode 100755 index 0000000000000000000000000000000000000000..de2080200fad65720355f226b65003627343b9fb --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.css @@ -0,0 +1 @@ +.a{color:green} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.js b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.js new file mode 100755 index 0000000000000000000000000000000000000000..e383c2dd0e81fc7dc50ce59e18be132048a0360a --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/expected/index.umd.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){"use strict";console.log("foo")})); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/foo.css b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/foo.css new file mode 100755 index 0000000000000000000000000000000000000000..ec0af869aa8fbd51c652a8db9eb5845de5d84ee7 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/foo.css @@ -0,0 +1,2 @@ + +.a { color: green; } diff --git a/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..9a761d97aac83e3efad1a6f27b1b45ccf8d34dd0 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-css-extract-minFile/src/index.js @@ -0,0 +1,3 @@ +import './foo.css'; + +console.log('foo'); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-globals/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-globals/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..44cc7c4600f6964fb3da20edee8a8bfa9bf1d594 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-globals/.fatherrc.js @@ -0,0 +1,9 @@ + +export default { + umd: { + minFile: false, + globals: { + foo: '$', + }, + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-globals/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-globals/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..07054a168160df94d98b543e34bde756f841a1b4 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-globals/expected/index.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('foo')) : + typeof define === 'function' && define.amd ? define(['foo'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.$)); +}(this, (function (foo) { 'use strict'; + + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + + var foo__default = /*#__PURE__*/_interopDefaultLegacy(foo); + + foo__default['default'].bar(); + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-globals/package.json b/packages/father-build/src/fixtures/build/rollup-umd-globals/package.json new file mode 100755 index 0000000000000000000000000000000000000000..7390bd3d256b969f7e7c7a23bb27a93755c0edec --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-globals/package.json @@ -0,0 +1,5 @@ +{ + "peerDependencies": { + "foo": "0.1.0" + } +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-globals/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-globals/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..5a079bee1f36140d724c8647edb794b9db9a6f0d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-globals/src/index.js @@ -0,0 +1,3 @@ +import foo from 'foo'; + +foo.bar(); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-name/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-name/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..be174297f1c045c8d440d2b85f12a48f177e096d --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-name/.fatherrc.js @@ -0,0 +1,7 @@ + +export default { + umd: { + minFile: false, + name: 'foo', + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-name/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-name/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..0d2fbbcecc7004dc25d58070ba7819450fb6f6b1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-name/expected/index.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.foo = factory()); +}(this, (function () { 'use strict'; + + function index () { + return 'foo'; + } + + return index; + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-name/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-name/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-name/src/index.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-overrides/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-overrides/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..242848d420e29759281776d8340642455761ce8b --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-overrides/.fatherrc.js @@ -0,0 +1,18 @@ + +export default { + entry: [ + 'src/index.js', + 'src/fetch.js', + ], + umd: { + minFile: false, + name: 'foo', + }, + overridesByEntry: { + 'src/fetch.js': { + umd: { + name: 'foo.fetch', + }, + }, + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/fetch.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/fetch.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..42b7f10eeffb479c0224a5fbcc64f0bf7a5f6a52 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/fetch.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.foo = global.foo || {}, global.foo.fetch = factory())); +}(this, (function () { 'use strict'; + + function fetch () { + return 'foo.fetch'; + } + + return fetch; + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..0d2fbbcecc7004dc25d58070ba7819450fb6f6b1 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-overrides/expected/index.umd.js @@ -0,0 +1,13 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.foo = factory()); +}(this, (function () { 'use strict'; + + function index () { + return 'foo'; + } + + return index; + +}))); diff --git a/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/fetch.js b/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/fetch.js new file mode 100755 index 0000000000000000000000000000000000000000..3fdd6c676dd444b9f3b38edf82fedb13aef55f41 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/fetch.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo.fetch'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-overrides/src/index.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/.fatherrc.js b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..ff17b2079db55799fdcfabf956db50420870dcb8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/.fatherrc.js @@ -0,0 +1,8 @@ + +export default { + umd: { + minFile: false, + name: 'foo', + sourcemap: true, + }, +} diff --git a/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js new file mode 100755 index 0000000000000000000000000000000000000000..04e44df50b24dcc78e9fee8d337612cc51fd6a2e --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js @@ -0,0 +1,14 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.foo = factory()); +}(this, (function () { 'use strict'; + + function index () { + return 'foo'; + } + + return index; + +}))); +//# sourceMappingURL=index.umd.js.map diff --git a/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js.map b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js.map new file mode 100755 index 0000000000000000000000000000000000000000..bf6d50af43447d90450b7bc32fcfc76b6e199171 --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/expected/index.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.umd.js","sources":["../src/index.js"],"sourcesContent":["\nexport default function () {\n return 'foo';\n}\n"],"names":[],"mappings":";;;;;;EACe,kBAAY;EACzB,SAAO,KAAP;EACD;;;;;;;;"} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/src/index.js b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8fcf68e1bfa15c1c7aa64cc0c6c20ed0913f6b0c --- /dev/null +++ b/packages/father-build/src/fixtures/build/rollup-umd-sourcemap/src/index.js @@ -0,0 +1,4 @@ + +export default function () { + return 'foo'; +} diff --git a/packages/father-build/src/fixtures/build/target-node-version/.fatherrc.js b/packages/father-build/src/fixtures/build/target-node-version/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..41a0b59822092b5de3440938d3164c52ddb87046 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node-version/.fatherrc.js @@ -0,0 +1,7 @@ + +export default { + cjs: 'babel', + esm: 'babel', + target: 'node', + nodeVersion: 8, +} diff --git a/packages/father-build/src/fixtures/build/target-node-version/expected/es/index.js b/packages/father-build/src/fixtures/build/target-node-version/expected/es/index.js new file mode 100755 index 0000000000000000000000000000000000000000..ae6a5bdb29dfa408bf05eadf61dbdb502686f706 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node-version/expected/es/index.js @@ -0,0 +1,4 @@ +const foo = 'bar'; +export default async function () { + return foo; +} \ No newline at end of file diff --git a/packages/father-build/src/fixtures/build/target-node-version/src/index.js b/packages/father-build/src/fixtures/build/target-node-version/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..8ab0b3a2d773729e628d6c8f59ea2b50dd2b1ef2 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node-version/src/index.js @@ -0,0 +1,6 @@ + +const foo = 'bar'; + +export default async function() { + return foo; +} diff --git a/packages/father-build/src/fixtures/build/target-node/.fatherrc.js b/packages/father-build/src/fixtures/build/target-node/.fatherrc.js new file mode 100755 index 0000000000000000000000000000000000000000..a56516e629e9b60acb2fb9d27873f7fa24fc9558 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node/.fatherrc.js @@ -0,0 +1,6 @@ + +export default { + cjs: 'rollup', + esm: 'rollup', + target: 'node', +} diff --git a/packages/father-build/src/fixtures/build/target-node/expected/index.esm.js b/packages/father-build/src/fixtures/build/target-node/expected/index.esm.js new file mode 100755 index 0000000000000000000000000000000000000000..3199bfb849bb37eb50608279ab251acf9bcb07ed --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node/expected/index.esm.js @@ -0,0 +1,6 @@ +var foo = 'bar'; +function index () { + return foo; +} + +export default index; diff --git a/packages/father-build/src/fixtures/build/target-node/expected/index.js b/packages/father-build/src/fixtures/build/target-node/expected/index.js new file mode 100755 index 0000000000000000000000000000000000000000..b1ccfd8a2b48a15c64ddac025a093bac68c337b6 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node/expected/index.js @@ -0,0 +1,8 @@ +'use strict'; + +const foo = 'bar'; +function index () { + return foo; +} + +module.exports = index; diff --git a/packages/father-build/src/fixtures/build/target-node/src/index.js b/packages/father-build/src/fixtures/build/target-node/src/index.js new file mode 100755 index 0000000000000000000000000000000000000000..1354e696b0e937ee9d10038e6fce88fbfaad4ea8 --- /dev/null +++ b/packages/father-build/src/fixtures/build/target-node/src/index.js @@ -0,0 +1,6 @@ + +const foo = 'bar'; + +export default function() { + return foo; +} diff --git a/packages/father-build/src/getBabelConfig.ts b/packages/father-build/src/getBabelConfig.ts new file mode 100755 index 0000000000000000000000000000000000000000..57ce069493276f2dfd276df90e8425b98b6bb90c --- /dev/null +++ b/packages/father-build/src/getBabelConfig.ts @@ -0,0 +1,95 @@ +import { extname } from 'path'; +import { ModuleFormat } from 'rollup'; + +interface IGetBabelConfigOpts { + target: 'browser' | 'node'; + type?: ModuleFormat; + typescript?: boolean; + runtimeHelpers?: boolean; + filePath?: string; + browserFiles?: { + [value: string]: any; + }; + nodeVersion?: number; + nodeFiles?: { + [value: string]: any; + }; + lazy?: boolean; + lessInBabelMode?: boolean|{ + paths?: any[]; + plugins?: any[]; + }; +} + +function transformImportLess2Css() { + return { + name: 'transform-import-less-to-css', + visitor: { + ImportDeclaration(path, source) { + const re = /\.less$/; + if(re.test(path.node.source.value)){ + path.node.source.value = path.node.source.value.replace(re, '.css'); + } + } + } + } +} + +export default function(opts: IGetBabelConfigOpts) { + const { target, typescript, type, runtimeHelpers, filePath, browserFiles, nodeFiles, nodeVersion, lazy, lessInBabelMode } = opts; + let isBrowser = target === 'browser'; + // rollup 场景下不会传入 filePath + if (filePath) { + if (extname(filePath) === '.tsx' || extname(filePath) === '.jsx') { + isBrowser = true; + } else { + if (isBrowser) { + if (nodeFiles.includes(filePath)) isBrowser = false; + } else { + if (browserFiles.includes(filePath)) isBrowser = true; + } + } + } + const targets = isBrowser ? { browsers: ['last 2 versions', 'IE 10'] } : { node: nodeVersion || 6 }; + + return { + opts: { + presets: [ + ...(typescript ? [require.resolve('@babel/preset-typescript')] : []), + [require.resolve('@babel/preset-env'), { + targets, + modules: type === 'esm' ? false : 'auto' + }], + ...(isBrowser ? [require.resolve('@babel/preset-react')] : []), + ], + plugins: [ + ...((type === 'cjs' && lazy && !isBrowser) + ? [[require.resolve('@babel/plugin-transform-modules-commonjs'), { + lazy: true, + }]] + : []), + ...(lessInBabelMode ? [transformImportLess2Css] : []), + require.resolve('babel-plugin-react-require'), + require.resolve('@babel/plugin-syntax-dynamic-import'), + require.resolve('@babel/plugin-proposal-export-default-from'), + require.resolve('@babel/plugin-proposal-export-namespace-from'), + require.resolve('@babel/plugin-proposal-do-expressions'), + require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'), + require.resolve('@babel/plugin-proposal-optional-chaining'), + [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }], + [require.resolve('@babel/plugin-proposal-class-properties'), { loose: true }], + ...(runtimeHelpers + ? [[require.resolve('@babel/plugin-transform-runtime'), { + useESModules: isBrowser && (type === 'esm'), + version: require('@babel/runtime/package.json').version, + }]] + : []), + ...(process.env.COVERAGE + ? [require.resolve('babel-plugin-istanbul')] + : [] + ) + ], + }, + isBrowser, + }; +} diff --git a/packages/father-build/src/getRollupConfig.ts b/packages/father-build/src/getRollupConfig.ts new file mode 100755 index 0000000000000000000000000000000000000000..2544c32dc768516ada70f48f4690d03bd8b43019 --- /dev/null +++ b/packages/father-build/src/getRollupConfig.ts @@ -0,0 +1,318 @@ +import { existsSync } from 'fs' +import { basename, extname, join } from 'path'; +import { ModuleFormat, RollupOptions } from 'rollup'; +import url from '@rollup/plugin-url'; +import json from '@rollup/plugin-json'; +import replace from '@rollup/plugin-replace'; +import commonjs from '@rollup/plugin-commonjs'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import inject, { RollupInjectOptions } from '@rollup/plugin-inject'; +import babel, { RollupBabelInputPluginOptions } from '@rollup/plugin-babel'; +import postcss from 'rollup-plugin-postcss'; +import { terser } from 'rollup-plugin-terser'; +import typescript2 from 'rollup-plugin-typescript2'; +import { camelCase } from 'lodash'; +import tempDir from 'temp-dir'; +import autoprefixer from 'autoprefixer'; +import NpmImport from 'less-plugin-npm-import'; +import svgr from '@svgr/rollup'; +import getBabelConfig from './getBabelConfig'; +import { IBundleOptions } from './types'; + +interface IGetRollupConfigOpts { + cwd: string; + rootPath: string; + entry: string; + type: ModuleFormat; + importLibToEs?: boolean; + bundleOpts: IBundleOptions; +} + +interface IPkg { + dependencies?: Object; + peerDependencies?: Object; + name?: string; +} + +export default function(opts: IGetRollupConfigOpts): RollupOptions[] { + const { type, entry, cwd, rootPath, importLibToEs, bundleOpts } = opts; + const { + umd, + esm, + cjs, + file, + target = 'browser', + extractCSS = false, + injectCSS = true, + cssModules: modules, + extraPostCSSPlugins = [], + extraBabelPresets = [], + extraBabelPlugins = [], + extraRollupPlugins = [], + autoprefixer: autoprefixerOpts, + include = /node_modules/, + runtimeHelpers: runtimeHelpersOpts, + replace: replaceOpts, + inject: injectOpts, + extraExternals = [], + externalsExclude = [], + nodeVersion, + typescriptOpts, + nodeResolveOpts = {}, + disableTypeCheck, + lessInRollupMode = {}, + sassInRollupMode = {}, + } = bundleOpts; + const entryExt = extname(entry); + const name = file || basename(entry, entryExt); + const isTypeScript = entryExt === '.ts' || entryExt === '.tsx'; + const extensions = ['.js', '.jsx', '.ts', '.tsx', '.es6', '.es', '.mjs']; + + let pkg = {} as IPkg; + try { + pkg = require(join(cwd, 'package.json')); // eslint-disable-line + } catch (e) {} + + // cjs 不给浏览器用,所以无需 runtimeHelpers + const runtimeHelpers = type === 'cjs' ? false : runtimeHelpersOpts; + const babelOpts = { + ...(getBabelConfig({ + type, + target: type === 'esm' ? 'browser' : target, + // watch 模式下有几率走的 babel?原因未知。 + // ref: https://github.com/umijs/father/issues/158 + typescript: true, + runtimeHelpers, + nodeVersion, + }).opts), + // ref: https://github.com/rollup/plugins/tree/master/packages/babel#babelhelpers + babelHelpers: (runtimeHelpers ? 'runtime' : 'bundled') as RollupBabelInputPluginOptions['babelHelpers'], + exclude: /\/node_modules\//, + babelrc: false, + // ref: https://github.com/rollup/rollup-plugin-babel#usage + extensions, + }; + if (importLibToEs && type === 'esm') { + babelOpts.plugins.push(require.resolve('../lib/importLibToEs')); + } + babelOpts.presets.push(...extraBabelPresets); + babelOpts.plugins.push(...extraBabelPlugins); + + // rollup configs + const input = join(cwd, entry); + const format = type; + + // ref: https://rollupjs.org/guide/en#external + // 潜在问题:引用包的子文件时会报 warning,比如 @babel/runtime/helpers/esm/createClass + // 解决方案:可以用 function 处理 + const external = [ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ...extraExternals, + ]; + // umd 只要 external peerDependencies + const externalPeerDeps = [ + ...Object.keys(pkg.peerDependencies || {}), + ...extraExternals, + ]; + + function getPkgNameByid(id) { + const splitted = id.split('/'); + // @ 和 @tmp 是为了兼容 umi 的逻辑 + if (id.charAt(0) === '@' && splitted[0] !== '@' && splitted[0] !== '@tmp') { + return splitted + .slice(0, 2) + .join('/'); + } else { + return id.split('/')[0]; + } + } + + function testExternal(pkgs, excludes, id) { + if (excludes.includes(id)) { + return false; + } + return pkgs.includes(getPkgNameByid(id)); + } + + const terserOpts = { + compress: { + pure_getters: true, + unsafe: true, + unsafe_comps: true, + warnings: false, + }, + }; + + function getPlugins(opts = {} as { minCSS: boolean; }) { + const { minCSS } = opts; + return [ + url(), + svgr(), + postcss({ + extract: extractCSS, + inject: injectCSS, + modules, + // modules => all .less will convert into css modules + ...(modules ? { autoModules: false } : {}), + minimize: !!minCSS, + use: { + less: { + plugins: [new NpmImport({ prefix: '~' })], + javascriptEnabled: true, + ...lessInRollupMode + }, + sass: { + ...sassInRollupMode, + }, + stylus: false, + }, + plugins: [autoprefixer({ + // https://github.com/postcss/autoprefixer/issues/776 + remove: false, + ...autoprefixerOpts, + }), ...extraPostCSSPlugins], + }), + ...(injectOpts ? [inject(injectOpts as RollupInjectOptions)] : []), + ...(replaceOpts && Object.keys(replaceOpts || {}).length ? [replace(replaceOpts)] : []), + nodeResolve({ + mainFields: ['module', 'jsnext:main', 'main'], + extensions, + ...nodeResolveOpts, + }), + ...(isTypeScript + ? [ + typescript2({ + cwd, + // @see https://github.com/umijs/father/issues/61#issuecomment-544822774 + clean: true, + cacheRoot: `${tempDir}/.rollup_plugin_typescript2_cache`, + // 支持往上找 tsconfig.json + // 比如 lerna 的场景不需要每个 package 有个 tsconfig.json + tsconfig: [join(cwd, 'tsconfig.json'), join(rootPath, 'tsconfig.json')].find(existsSync), + tsconfigDefaults: { + compilerOptions: { + // Generate declaration files by default + declaration: true, + }, + }, + tsconfigOverride: { + compilerOptions: { + // Support dynamic import + target: 'esnext', + }, + }, + check: !disableTypeCheck, + ...(typescriptOpts || {}), + }), + ] + : []), + babel(babelOpts), + json(), + ...(extraRollupPlugins || []), + ]; + } + + switch (type) { + case 'esm': + return [ + { + input, + output: { + format, + file: join(cwd, `dist/${(esm && (esm as any).file) || `${name}.esm`}.js`), + }, + plugins: [...getPlugins(), ...(esm && (esm as any).minify ? [terser(terserOpts)] : [])], + external: testExternal.bind(null, external, externalsExclude), + }, + ...(esm && (esm as any).mjs + ? [ + { + input, + output: { + format, + file: join(cwd, `dist/${(esm && (esm as any).file) || `${name}`}.mjs`), + }, + plugins: [ + ...getPlugins(), + replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + terser(terserOpts), + ], + external: testExternal.bind(null, externalPeerDeps, externalsExclude), + }, + ] + : []), + ]; + + case 'cjs': + return [ + { + input, + output: { + format, + file: join(cwd, `dist/${(cjs && (cjs as any).file) || name}.js`), + }, + plugins: [...getPlugins(), ...(cjs && (cjs as any).minify ? [terser(terserOpts)] : [])], + external: testExternal.bind(null, external, externalsExclude), + }, + ]; + + case 'umd': + // Add umd related plugins + const extraUmdPlugins = [ + commonjs({ + include, + // namedExports options has been remove from https://github.com/rollup/plugins/pull/149 + }), + ]; + + return [ + { + input, + output: { + format, + sourcemap: umd && umd.sourcemap, + file: join(cwd, `dist/${(umd && umd.file) || `${name}.umd`}.js`), + globals: umd && umd.globals, + name: (umd && umd.name) || (pkg.name && camelCase(basename(pkg.name))), + }, + plugins: [ + ...getPlugins(), + ...extraUmdPlugins, + replace({ + 'process.env.NODE_ENV': JSON.stringify('development'), + }), + ], + external: testExternal.bind(null, externalPeerDeps, externalsExclude), + }, + ...(umd && umd.minFile === false + ? [] + : [ + { + input, + output: { + format, + sourcemap: umd && umd.sourcemap, + file: join(cwd, `dist/${(umd && umd.file) || `${name}.umd`}.min.js`), + globals: umd && umd.globals, + name: (umd && umd.name) || (pkg.name && camelCase(basename(pkg.name))), + }, + plugins: [ + ...getPlugins({ minCSS: true }), + ...extraUmdPlugins, + replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + terser(terserOpts), + ], + external: testExternal.bind(null, externalPeerDeps, externalsExclude), + }, + ]), + ]; + + default: + throw new Error(`Unsupported type ${type}`); + } +} diff --git a/packages/father-build/src/getUserConfig.ts b/packages/father-build/src/getUserConfig.ts new file mode 100755 index 0000000000000000000000000000000000000000..6846f1419935f36ab949954c7c9aa2cfd4cd26de --- /dev/null +++ b/packages/father-build/src/getUserConfig.ts @@ -0,0 +1,71 @@ +import AJV from 'ajv'; +import slash from 'slash2'; +import { relative } from 'path'; +import signale from 'signale'; +import schema from './schema'; +import { getExistFile } from './utils'; +import { IBundleOptions } from './types'; + +function testDefault(obj) { + return obj.default || obj; +} + +export const CONFIG_FILES = [ + '.fatherrc.js', + '.fatherrc.jsx', + '.fatherrc.ts', + '.fatherrc.tsx', + '.umirc.library.js', + '.umirc.library.jsx', + '.umirc.library.ts', + '.umirc.library.tsx', +]; +const CLASSES = { + Function: Function, +}; +const extendAjv = (ajv: AJV.Ajv) => { + ajv.addKeyword('instanceof', { + compile: function(schema: string) { + var Class = CLASSES[schema]; + return function(data: any) { + return data instanceof Class; + }; + } + }); + return ajv; +} +export default function({ cwd }): IBundleOptions { + const configFile = getExistFile({ + cwd, + files: CONFIG_FILES, + returnRelative: false, + }); + + if (configFile) { + if (configFile.includes('.umirc.library.')) { + signale.warn(`.umirc.library.js is deprecated, please use .fatherrc.js instead.`); + } + + const userConfig = testDefault(require(configFile)); // eslint-disable-line + const userConfigs = Array.isArray(userConfig) ? userConfig : [userConfig]; + userConfigs.forEach(userConfig => { + const ajv = extendAjv(new AJV({ allErrors: true })); + const isValid = ajv.validate(schema, userConfig); + if (!isValid) { + const errors = ajv.errors.map(({ dataPath, message }, index) => { + return `${index + 1}. ${dataPath}${dataPath ? ' ' : ''}${message}`; + }); + throw new Error( + ` +Invalid options in ${slash(relative(cwd, configFile))} + +${errors.join('\n')} +`.trim(), + ); + } + }); + return userConfig; + } else { + return {}; + } +} diff --git a/packages/father-build/src/importLibToEs.js b/packages/father-build/src/importLibToEs.js new file mode 100755 index 0000000000000000000000000000000000000000..e7d278a649c71bb53b5b2886513f539e12370813 --- /dev/null +++ b/packages/father-build/src/importLibToEs.js @@ -0,0 +1,26 @@ +import { join, dirname } from 'path'; +import fs from 'fs'; + +const cwd = process.cwd(); + +function replacePath(path) { + if (path.node.source && /\/lib\//.test(path.node.source.value)) { + const esModule = path.node.source.value.replace('/lib/', '/es/'); + const esPath = dirname(join(cwd, `node_modules/${esModule}`)); + if (fs.existsSync(esPath)) { + console.log(`[es build] replace ${path.node.source.value} with ${esModule}`); + path.node.source.value = esModule; + } + } +} + +function replaceLib() { + return { + visitor: { + ImportDeclaration: replacePath, + ExportNamedDeclaration: replacePath, + }, + }; +} + +export default replaceLib; diff --git a/packages/father-build/src/index.ts b/packages/father-build/src/index.ts new file mode 100755 index 0000000000000000000000000000000000000000..1bff2b7bfc0e84d95e48bc295ef706a259a6feec --- /dev/null +++ b/packages/father-build/src/index.ts @@ -0,0 +1,3 @@ + +import build from './build'; +export default build; diff --git a/packages/father-build/src/normalizeBundleOpts.test.ts b/packages/father-build/src/normalizeBundleOpts.test.ts new file mode 100755 index 0000000000000000000000000000000000000000..54bfdbe23d0549896ef963b67c030da231d13a05 --- /dev/null +++ b/packages/father-build/src/normalizeBundleOpts.test.ts @@ -0,0 +1,53 @@ +import normalizeBundleOpts from './normalizeBundleOpts'; + +test('normal', () => { + expect( + normalizeBundleOpts('a', { + umd: { name: 'foo' }, + overridesByEntry: { + a: { umd: { name: 'bar' } }, + }, + }), + ).toEqual({ + umd: { name: 'bar' }, + }); +}); + +test('ignore ./ prefix in entry', () => { + expect( + normalizeBundleOpts('./a', { + umd: { name: 'foo' }, + overridesByEntry: { + a: { umd: { name: 'bar' } }, + }, + }), + ).toEqual({ + umd: { name: 'bar' }, + }); +}); + +test('ignore ./ prefix in overridesByEntry', () => { + expect( + normalizeBundleOpts('a', { + umd: { name: 'foo' }, + overridesByEntry: { + './a': { umd: { name: 'bar' } }, + }, + }), + ).toEqual({ + umd: { name: 'bar' }, + }); +}); + +test('deep merge', () => { + expect( + normalizeBundleOpts('a', { + umd: { minFile: false, name: 'foo' }, + overridesByEntry: { + a: { umd: { name: 'bar' } }, + }, + }), + ).toEqual({ + umd: { minFile: false, name: 'bar' }, + }); +}); diff --git a/packages/father-build/src/normalizeBundleOpts.ts b/packages/father-build/src/normalizeBundleOpts.ts new file mode 100755 index 0000000000000000000000000000000000000000..1767ff9ce762f78ad5a2d6c51dcbd177ff4586e2 --- /dev/null +++ b/packages/father-build/src/normalizeBundleOpts.ts @@ -0,0 +1,24 @@ +import { cloneDeep, merge } from 'lodash'; +import { IBundleOptions } from './types'; + +function stripDotSlashPrefix(path) { + return path.replace(/^\.\//, ''); +} + +export default function(entry: string, opts: IBundleOptions): IBundleOptions { + let clone = cloneDeep(opts); + const stripedEntry = stripDotSlashPrefix(entry); + if (clone.overridesByEntry) { + Object.keys(clone.overridesByEntry).forEach(key => { + const stripedKey = stripDotSlashPrefix(key); + if (stripedKey !== key) { + clone.overridesByEntry[stripedKey] = clone.overridesByEntry[key]; + } + }); + if (clone.overridesByEntry[stripedEntry]) { + clone = merge(clone, clone.overridesByEntry[stripedEntry]); + } + delete clone.overridesByEntry; + } + return clone; +} diff --git a/packages/father-build/src/randomColor.ts b/packages/father-build/src/randomColor.ts new file mode 100755 index 0000000000000000000000000000000000000000..bf44d252796ccd7f83d0f09a79d962a0939c7ce7 --- /dev/null +++ b/packages/father-build/src/randomColor.ts @@ -0,0 +1,34 @@ +import chalk from 'chalk'; + +const colors = [ + 'red', + 'green', + 'yellow', + 'blue', + 'magenta', + 'cyan', + 'gray', + 'redBright', + 'greenBright', + 'yellowBright', + 'blueBright', + 'magentaBright', + 'cyanBright', +]; + +let index = 0; +const cache = {}; + +export default function (pkg) { + if (!cache[pkg]) { + const color = colors[index]; + let str = chalk[color].bold(pkg); + cache[pkg] = str; + if (index === colors.length - 1) { + index = 0; + } else { + index += 1; + } + } + return cache[pkg]; +} diff --git a/packages/father-build/src/registerBabel.ts b/packages/father-build/src/registerBabel.ts new file mode 100755 index 0000000000000000000000000000000000000000..b2db93e8042c50cd55d182e92088e64f5c919f52 --- /dev/null +++ b/packages/father-build/src/registerBabel.ts @@ -0,0 +1,23 @@ +import { join } from 'path'; +import slash from 'slash2'; +import getBabelConfig from './getBabelConfig'; + +interface IRegisterBabelOpts { + cwd: string; + only: string[]; +} + +export default function(opts: IRegisterBabelOpts) { + const { cwd, only } = opts; + const { opts: babelConfig } = getBabelConfig({ + target: 'node', + typescript: true, + }); + require('@babel/register')({ + ...babelConfig, + extensions: ['.es6', '.es', '.jsx', '.js', '.mjs', '.ts', '.tsx'], + only: only.map(file => slash(join(cwd, file))), + babelrc: false, + cache: false, + }); +} diff --git a/packages/father-build/src/rollup.ts b/packages/father-build/src/rollup.ts new file mode 100755 index 0000000000000000000000000000000000000000..6c24ca218beea8d89276d18d2b37193473f939b5 --- /dev/null +++ b/packages/father-build/src/rollup.ts @@ -0,0 +1,66 @@ +import { ModuleFormat, rollup, watch } from 'rollup'; +import signale from 'signale'; +import getRollupConfig from './getRollupConfig'; +import { Dispose, IBundleOptions } from './types'; +import normalizeBundleOpts from './normalizeBundleOpts'; + +interface IRollupOpts { + cwd: string; + rootPath?: string; + entry: string | string[]; + type: ModuleFormat; + log: (string) => void; + bundleOpts: IBundleOptions; + watch?: boolean; + dispose?: Dispose[]; + importLibToEs?: boolean; +} + +async function build(entry: string, opts: IRollupOpts) { + const { cwd, rootPath, type, log, bundleOpts, importLibToEs, dispose } = opts; + const rollupConfigs = getRollupConfig({ + cwd, + rootPath:rootPath || cwd, + type, + entry, + importLibToEs, + bundleOpts: normalizeBundleOpts(entry, bundleOpts), + }); + + for (const rollupConfig of rollupConfigs) { + if (opts.watch) { + const watcher = watch([ + { + ...rollupConfig, + watch: {}, + }, + ]); + watcher.on('event', event => { + if (event.error) { + signale.error(event.error); + } else if (event.code === 'START') { + log(`[${type}] Rebuild since file changed`); + } + }); + process.once('SIGINT', () => { + watcher.close(); + }); + dispose?.push(() => watcher.close()); + } else { + const { output, ...input } = rollupConfig; + const bundle = await rollup(input); // eslint-disable-line + await bundle.write(output); // eslint-disable-line + } + } +} + +export default async function(opts: IRollupOpts) { + if (Array.isArray(opts.entry)) { + const { entry: entries } = opts; + for (const entry of entries) { + await build(entry, opts); + } + } else { + await build(opts.entry, opts); + } +} diff --git a/packages/father-build/src/schema.test.ts b/packages/father-build/src/schema.test.ts new file mode 100755 index 0000000000000000000000000000000000000000..88ef8267cebacd72a4f7c037ac6d927f969ebfed --- /dev/null +++ b/packages/father-build/src/schema.test.ts @@ -0,0 +1,38 @@ +import AJV from 'ajv'; +import schema from './schema'; + +const ajv = new AJV(); + +const successValidates = { + entry: ['a', ['a']], + file: ['a'], + esm: [false, true, { type: 'rollup' }, { type: 'babel' }, { file: 'a' }, { mjs: true }], + cjs: [false, true, { type: 'rollup' }, { type: 'babel' }, { file: 'a' }], + umd: [{ globals: {} }, { file: 'a' }, { name: 'a' }, { minFile: false }, { minFile: true }, { sourcemap: true }], + extraBabelPlugins: [[]], + extraBabelPresets: [[]], + extraPostCSSPlugins: [[]], + lessInRollupMode: [{}], + cssModules: [true, false, {}], + autoprefixer: [{}], + include: ['node_modules', /node_modules/], + nodeResolveOpts: [{}], + runtimeHelpers: [true, false], + target: ['node', 'browser'], + overridesByEntry: [{}], + doc: [{}], + typescriptOpts: [{}], + pkgs: [[]], +}; + +Object.keys(successValidates).forEach(key => { + test(key, () => { + successValidates[key].forEach(item => { + expect( + ajv.validate(schema, { + [key]: item, + }), + ).toEqual(true); + }); + }); +}); diff --git a/packages/father-build/src/schema.ts b/packages/father-build/src/schema.ts new file mode 100755 index 0000000000000000000000000000000000000000..235faf05ef84b8c9939a9b5c854ee8fc296f6537 --- /dev/null +++ b/packages/father-build/src/schema.ts @@ -0,0 +1,168 @@ +const noEmptyStr = { type: 'string', minLength: 1 }; + +export default { + type: 'object', + additionalProperties: false, + properties: { + entry: { + oneOf: [noEmptyStr, { type: 'array', items: noEmptyStr }], + }, + file: { type: 'string' }, + esm: { + oneOf: [ + noEmptyStr, + { type: 'boolean' }, + { + type: 'object', + additionalProperties: false, + properties: { + type: { + type: 'string', + pattern: '^(rollup|babel)$', + }, + file: noEmptyStr, + mjs: { type: 'boolean' }, + minify: { type: 'boolean' }, + importLibToEs: { + type: 'boolean', + }, + }, + }, + ], + }, + cjs: { + oneOf: [ + noEmptyStr, + { type: 'boolean' }, + { + type: 'object', + additionalProperties: false, + properties: { + type: { + type: 'string', + pattern: '^(rollup|babel)$', + }, + file: noEmptyStr, + minify: { type: 'boolean' }, + lazy: { type: 'boolean' }, + }, + }, + ], + }, + umd: { + oneOf: [ + { type: 'boolean' }, + { + type: 'object', + additionalProperties: false, + properties: { + globals: { type: 'object' }, + file: noEmptyStr, + name: noEmptyStr, + minFile: { type: 'boolean' }, + sourcemap: { + oneOf: [ + { type: 'boolean' }, + { type: 'string', pattern: '^(inline|hidden)$', }, + ] + }, + }, + }, + ], + }, + extraBabelPlugins: { + type: 'array', + }, + extraBabelPresets: { + type: 'array', + }, + extraPostCSSPlugins: { + type: 'array', + }, + extraRollupPlugins: { + type: 'array', + }, + extraExternals: { + type: 'array', + }, + externalsExclude: { + type: 'array', + }, + cssModules: { + oneOf: [{ type: 'boolean' }, { type: 'object' }], + }, + extractCSS: { + type: 'boolean', + }, + injectCSS: { + oneOf: [{ type: 'boolean' }, { instanceof: 'Function' }], + }, + autoprefixer: { + type: 'object', + }, + include: { + oneOf: [ + { type: 'string' }, + { type: 'object' }, + { type: 'array' }, + ] + }, + runtimeHelpers: { + type: 'boolean', + }, + overridesByEntry: { + type: 'object', + }, + nodeResolveOpts: { + type: 'object', + }, + target: noEmptyStr, + doc: { + type: 'object', + }, + replace: { + type: 'object', + }, + inject: { + type: 'object', + }, + lessInRollupMode: { + type: 'object' + }, + sassInRollupMode: { + type: 'object' + }, + lessInBabelMode: { + oneOf: [ + { type: 'boolean' }, + { type: 'object' }, + ], + }, + browserFiles: { + type: 'array', + }, + nodeFiles: { + type: 'array', + }, + nodeVersion: { + type: 'number', + }, + disableTypeCheck: { + type: 'boolean', + }, + preCommit: { + type: 'object', + additionalProperties: false, + properties: { + eslint: { type: 'boolean' }, + prettier: { type: 'boolean' }, + }, + }, + typescriptOpts: { + type: 'object', + }, + pkgs: { + type: 'array', + }, + }, +}; diff --git a/packages/father-build/src/types.d.ts b/packages/father-build/src/types.d.ts new file mode 100755 index 0000000000000000000000000000000000000000..dbc4d9c1d66b9c153f234bf57f33637e92361af4 --- /dev/null +++ b/packages/father-build/src/types.d.ts @@ -0,0 +1,96 @@ +export type BundleType = 'rollup' | 'babel'; + +interface IBundleTypeOutput { + type: BundleType; + file?: string; +} + +export interface ICjs extends IBundleTypeOutput { + minify?: boolean; + lazy?: boolean; +} + +interface IEsm extends IBundleTypeOutput { + mjs?: boolean; + minify?: boolean; + importLibToEs?: boolean; +} + +interface IStringObject { + [prop: string]: string; +} + +interface IUmd { + globals?: IStringObject; + name?: string; + minFile?: boolean; + file?: string; + sourcemap?: boolean; +} + +export interface IBundleOptions { + entry?: string | string[]; + file?: string; + esm?: BundleType | IEsm | false; + cjs?: BundleType | ICjs | false; + umd?: IUmd | false; + extraBabelPlugins?: any[]; + extraBabelPresets?: any[]; + extraPostCSSPlugins?: any[]; + extraRollupPlugins?: any[]; + extraExternals?: string[]; + externalsExclude?: string[]; + cssModules?: boolean | Object; + extractCSS?: boolean; + injectCSS?: boolean | ((varname: string, filename: string) => string); + inject?: Object; + autoprefixer?: Object; + include?: string | RegExp; + runtimeHelpers?: boolean; + target?: 'node' | 'browser'; + overridesByEntry?: { + [entry: string]: any; + }; + replace?: { + [value: string]: any; + }; + browserFiles?: { + [value: string]: any; + }; + nodeFiles?: { + [value: string]: any; + }; + nodeVersion?: number; + disableTypeCheck?: boolean; + preCommit?: { + eslint?: boolean; + prettier?: boolean; + }; + lessInBabelMode?: boolean | { + paths?: any[]; + plugins?: any[]; + }; + typescriptOpts?: { + [value: string]: any; + }; + nodeResolveOpts?: { + [value: string]: any; + }; + lessInRollupMode?: { + [opt: string]: any + }; + sassInRollupMode?: { + [opt: string]: any + }; + pkgs?: string[]; +} + +export interface IOpts { + cwd: string; + watch?: boolean; + buildArgs?: IBundleOptions; + rootConfig?: IBundleOptions; + rootPath?: string; +} + +export type Dispose = () => void; diff --git a/packages/father-build/src/utils.ts b/packages/father-build/src/utils.ts new file mode 100755 index 0000000000000000000000000000000000000000..c00bcb91cc9d4d76f6fb75eeaf80d814dfa6f793 --- /dev/null +++ b/packages/father-build/src/utils.ts @@ -0,0 +1,11 @@ +import { existsSync } from 'fs'; +import { join } from 'path'; + +export function getExistFile({ cwd, files, returnRelative }) { + for (const file of files) { + const absFilePath = join(cwd, file); + if (existsSync(absFilePath)) { + return returnRelative ? file : absFilePath; + } + } +} diff --git a/packages/father-build/template/tsconfig.json b/packages/father-build/template/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..9a8969019ac53e5ff6720b010b174de7f6007f38 --- /dev/null +++ b/packages/father-build/template/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "jsx": "react" + }, + "include": ["./src", "./typings/"], + "typings": "./typings/index.d.ts", + "exclude": [ + "node_modules", + "build", + "scripts", + "acceptance-tests", + "webpack", + "jest", + "src/setupTests.ts", + "tslint:latest", + "tslint-config-prettier" + ] +} diff --git a/packages/plugin-action-logs/package.json b/packages/plugin-action-logs/package.json index dadc8187c553b1fe95209dd93d8faa168708aebc..15e96d21acd27ffa6ea6682d61c972ebc5f9a1d1 100644 --- a/packages/plugin-action-logs/package.json +++ b/packages/plugin-action-logs/package.json @@ -1,15 +1,13 @@ { "name": "@nocobase/plugin-action-logs", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", "dependencies": { - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7" + "@nocobase/server": "^0.5.0-alpha.25" }, "devDependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7" + "@nocobase/test": "^0.5.0-alpha.25" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-action-logs/src/__tests__/hook.test.ts b/packages/plugin-action-logs/src/__tests__/hook.test.ts index d233087a0be3f960ef81f7747d689533c1d3dd5d..e77d3063cb41363093797e3396f1efea1ed1258d 100644 --- a/packages/plugin-action-logs/src/__tests__/hook.test.ts +++ b/packages/plugin-action-logs/src/__tests__/hook.test.ts @@ -1,69 +1,70 @@ -import { getApp, getAPI, getAgent } from '.'; +import Database from '@nocobase/database'; +import { registerActions } from '@nocobase/actions'; +import { mockServer, MockServer } from '@nocobase/test'; +import logPlugin from '../server'; describe('hook', () => { - let app; - let anonymousAPI; - let userAPI; - let db; - let user; + let api: MockServer; + let db: Database; beforeEach(async () => { - app = await getApp(); - db = app.database; - - anonymousAPI = getAPI(getAgent(app)); - + api = mockServer(); + api.registerPlugin({ + collections: require('@nocobase/plugin-collections/src/server').default, + users: require('@nocobase/plugin-users/src/server').default, + logs: logPlugin, + }); + registerActions(api); + await api.loadPlugins(); + db = api.db; + db.table({ + name: 'posts', + logging: true, + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'string', + name: 'status', + defaultValue: 'draft', + }, + ] + }); + await db.sync(); const User = db.getModel('users'); - user = await User.create({ nickname: 'a', token: 'token1' }); - - const userAgent = getAgent(app); - userAgent.set('Authorization', `Bearer ${user.token}`); - userAPI = getAPI(userAgent); + const user = await User.create({ nickname: 'a', token: 'token1' }); + api.agent().set('Authorization', `Bearer ${user.token}`); }); - afterEach(() => db.close()); - - describe('common', () => { - it('create log', async () => { - await userAPI.resource('posts').create({ - values: { title: 't1' } - }); - - const Post = db.getModel('posts'); - const p1 = await Post.findByPk(1); + afterEach(async () => { + await api.destroy(); + }); - const logs = await p1.getAction_logs(); + it('database', async () => { + const Post = db.getModel('posts'); + const post = await Post.create({ title: 't1' }); + await post.update({title: 't2'}); + await post.destroy(); + const ActionLog = db.getModel('action_logs'); + const count = await ActionLog.count(); + expect(count).toBe(3); + }); - expect(logs.length).toBe(1); - expect(logs[0].get()).toMatchObject({ - type: 'create', - index: p1.id, - user_id: user.id, - collection_name: 'posts' - }); + it('resource', async () => { + const response = await api.resource('posts').create({ + values: { title: 't1' }, }); - - it('logs should be scoped (no other model logs)', async () => { - await userAPI.resource('posts').create({ - values: { title: 't1' } - }); - await userAPI.resource('posts').update({ - resourceKey: '1', - values: { title: 't11' } - }); - await userAPI.resource('posts').create({ - values: { title: 't2' } - }); - await userAPI.resource('comments').create({ - values: { content: 'c1' } - }); - - const Post = db.getModel('posts'); - const p1 = await Post.findByPk(1); - - const logs = await p1.getAction_logs(); - expect(logs.length).toBe(2); - expect(logs.map(item => item.collection_name)).toEqual(['posts', 'posts']); + await api.resource('posts').update({ + resourceKey: response.body.data.id, + values: { title: 't2' }, + }); + await api.resource('posts').destroy({ + resourceKey: response.body.data.id, }); + const ActionLog = db.getModel('action_logs'); + const count = await ActionLog.count(); + expect(count).toBe(3); }); }); diff --git a/packages/plugin-action-logs/src/__tests__/index.ts b/packages/plugin-action-logs/src/__tests__/index.ts deleted file mode 100644 index 45ff12800dd4c40d57639ab3f3f3847c3a01ccef..0000000000000000000000000000000000000000 --- a/packages/plugin-action-logs/src/__tests__/index.ts +++ /dev/null @@ -1,145 +0,0 @@ -import path from 'path'; -import qs from 'qs'; -import supertest from 'supertest'; -import bodyParser from 'koa-bodyparser'; -import { Dialect } from 'sequelize'; -import Database from '@nocobase/database'; -import { actions, middlewares } from '@nocobase/actions'; -import { Application } from '@nocobase/server'; -import middleware from '@nocobase/server/src/middleware'; -import plugin from '../server'; - -function getTestKey() { - const { id } = require.main; - const key = id - .replace(`${process.env.PWD}/packages`, '') - .replace(/src\/__tests__/g, '') - .replace('.test.ts', '') - .replace(/[^\w]/g, '_') - .replace(/_+/g, '_'); - return key -} - -const config = { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: Number.parseInt(process.env.DB_PORT, 10), - dialect: process.env.DB_DIALECT as Dialect, - logging: process.env.DB_LOG_SQL === 'on', - sync: { - force: true, - alter: { - drop: true, - }, - }, - hooks: { - beforeDefine(columns, model) { - model.tableName = `${getTestKey()}_${model.tableName || model.name.plural}`; - } - }, -}; - -export function getDatabase() { - return new Database(config); -}; - -export async function getApp() { - const app = new Application({ - database: config, - resourcer: { - prefix: '/api', - }, - }); - app.resourcer.use(middlewares.associated); - app.resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); - app.registerPlugin({ - collections: path.resolve(__dirname, '../../../plugin-collections'), - users: path.resolve(__dirname, '../../../plugin-users'), - logs: plugin - }); - await app.loadPlugins(); - const testTables = app.database.import({ - directory: path.resolve(__dirname, './tables') - }); - try { - await app.database.sync(); - } catch (err) { - console.error(err); - } - - for (const table of testTables.values()) { - // TODO(bug): 由于每个用例结束后不会清理用于测试的数据表,导致再次创建和更新 - // 创建和更新里面仍会再次创建 fields,导致创建相关的数据重复,数据库报错。 - await app.database.getModel('collections').import(table.getOptions(), { update: true, migrate: false }); - } - - app.context.db = app.database; - app.use(bodyParser()); - app.use(middleware({ - prefix: '/api', - resourcer: app.resourcer, - database: app.database, - })); - return app; -} - -interface ActionParams { - resourceKey?: string | number; - // resourceName?: string; - // associatedName?: string; - associatedKey?: string | number; - fields?: any; - filter?: any; - values?: any; - [key: string]: any; -} - -interface Handler { - get: (params?: ActionParams) => Promise; - list: (params?: ActionParams) => Promise; - create: (params?: ActionParams) => Promise; - update: (params?: ActionParams) => Promise; - destroy: (params?: ActionParams) => Promise; - [name: string]: (params?: ActionParams) => Promise; -} - -export interface Agent { - resource: (name: string) => Handler; -} - -export function getAgent(app: Application) { - return supertest.agent(app.callback()); -} - -export function getAPI(agent) { - return { - resource(name: string): any { - return new Proxy({}, { - get(target, method: string, receiver) { - return (params: ActionParams = {}) => { - const { associatedKey, resourceKey, values = {}, filePath, ...restParams } = params; - let url = `/api/${name}`; - if (associatedKey) { - url = `/api/${name.split('.').join(`/${associatedKey}/`)}`; - } - url += `:${method as string}`; - if (resourceKey) { - url += `/${resourceKey}`; - } - - switch (method) { - case 'list': - case 'get': - return agent.get(`${url}?${qs.stringify(restParams)}`); - - default: - return agent.post(`${url}?${qs.stringify(restParams)}`).send(values); - } - } - } - }); - } - }; -} diff --git a/packages/plugin-action-logs/src/__tests__/tables/comments.ts b/packages/plugin-action-logs/src/__tests__/tables/comments.ts deleted file mode 100644 index 6f752ff1b10e0264385f0854e1b0c330c95148a0..0000000000000000000000000000000000000000 --- a/packages/plugin-action-logs/src/__tests__/tables/comments.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'comments', - fields: [ - { - type: 'string', - name: 'content', - }, - { - type: 'belongsTo', - name: 'post', - }, - ] -} as TableOptions; diff --git a/packages/plugin-action-logs/src/__tests__/tables/posts.ts b/packages/plugin-action-logs/src/__tests__/tables/posts.ts deleted file mode 100644 index 85c5f340f35850f34ec005e4b87780e832f8e88c..0000000000000000000000000000000000000000 --- a/packages/plugin-action-logs/src/__tests__/tables/posts.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'posts', - // 目前默认就带了 - // createdBy: true, - fields: [ - { - type: 'string', - name: 'title', - }, - { - type: 'string', - name: 'status', - defaultValue: 'draft', - }, - { - type: 'hasMany', - name: 'comments', - } - ] -} as TableOptions; diff --git a/packages/plugin-action-logs/src/collections/action_changes.ts b/packages/plugin-action-logs/src/collections/action_changes.ts index 2a3b34008cf30ea35bd549cf5ca441a36e6c54e1..60b8e5d1b2e4eca7f997eceeba5651fecb387f28 100644 --- a/packages/plugin-action-logs/src/collections/action_changes.ts +++ b/packages/plugin-action-logs/src/collections/action_changes.ts @@ -3,65 +3,28 @@ import { TableOptions } from '@nocobase/database'; export default { name: 'action_changes', title: '变动值', - developerMode: true, - internal: true, createdBy: false, updatedBy: false, createdAt: false, updatedAt: false, - logging: false, fields: [ { - interface: 'linkTo', type: 'belongsTo', name: 'log', target: 'action_logs', - title: '所属操作' + foreignKey: 'action_log_id', }, { - type: 'jsonb', + type: 'json', name: 'field', - title: '字段信息', - component: { - type: 'logs.field', - showInTable: true, - }, }, { - type: 'jsonb', + type: 'json', name: 'before', - title: '操作前', - component: { - type: 'logs.fieldValue', - showInTable: true, - }, }, { - type: 'jsonb', + type: 'json', name: 'after', - title: '操作后', - component: { - type: 'logs.fieldValue', - showInTable: true, - }, - } - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看' - } - ], - views_v2: [ - { - type: 'table', - name: 'table', - fields: [ - 'field', - 'before', - 'after', - ], } ], } as TableOptions; diff --git a/packages/plugin-action-logs/src/collections/action_logs.ts b/packages/plugin-action-logs/src/collections/action_logs.ts index a22b294899a569b7d7d47efa7f48715409429d6f..ae84cdcb05517d24d6204770be40dddf2b6b3c7a 100644 --- a/packages/plugin-action-logs/src/collections/action_logs.ts +++ b/packages/plugin-action-logs/src/collections/action_logs.ts @@ -4,217 +4,43 @@ import { LOG_TYPE_CREATE, LOG_TYPE_UPDATE, LOG_TYPE_DESTROY } from '../constants export default { name: 'action_logs', title: '操作记录', - developerMode: true, - internal: true, createdBy: false, updatedBy: false, updatedAt: false, - logging: false, fields: [ { - interface: 'createdAt', - name: 'created_at', type: 'date', - title: '操作时间', - showTime: true, - component: { - showInTable: true, - showInDetail: true, - }, + name: 'created_at', }, { - interface: 'linkTo', type: 'belongsTo', name: 'user', target: 'users', - title: '操作用户', - appends: true, - labelField: 'nickname', - component: { - showInTable: true, - showInDetail: true, - }, }, { - interface: 'linkTo', + type: 'string', + name: 'collection_name', + }, + { type: 'belongsTo', name: 'collection', target: 'collections', - title: '数据表', targetKey: 'name', - appends: true, - labelField: 'title', - component: { - showInTable: true, - showInDetail: true, - }, + constraints: false, }, { - interface: 'select', type: 'string', name: 'type', - title: '操作类型', - filterable: true, - dataSource: [ - { value: LOG_TYPE_CREATE, label: '新增', color: 'blue' }, - { value: LOG_TYPE_UPDATE, label: '更新', color: 'volcano' }, - { value: LOG_TYPE_DESTROY, label: '删除', color: 'magenta' }, - ], - component: { - showInTable: true, - showInDetail: true, - }, }, { type: 'integer', name: 'index', - title: '数据ID', - component: { - showInTable: true, - }, }, { - interface: 'subTable', type: 'hasMany', name: 'changes', target: 'action_changes', - title: '数据变动', - component: { - showInDetail: true, - }, + foreignKey: 'action_log_id', } ], - actions: [ - { - type: 'filter', - name: 'filter', - title: '筛选' - }, - { - type: 'list', - name: 'list', - title: '查看', - // sort: '-created_at' - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'created_at', - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - }, - ], - fields: ['created_at', 'user', 'collection', 'type', 'index'], - detailsOpenMode: 'drawer', // window - details: ['descriptions'], - sort: ['-created_at'], - }, - { - developerMode: true, - type: 'table', - name: 'create', - title: '新增数据', - labelField: 'created_at', - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - }, - ], - fields: ['created_at', 'user', 'collection', 'type', 'index'], - detailsOpenMode: 'drawer', // window - details: ['descriptions'], - filter: { - and: [ - { - type: 'create', - } - ], - }, - sort: ['-created_at'], - }, - { - developerMode: true, - type: 'table', - name: 'update', - title: '更新数据', - labelField: 'created_at', - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - }, - ], - fields: ['created_at', 'user', 'collection', 'type', 'index'], - detailsOpenMode: 'drawer', // window - details: ['descriptions'], - filter: { - and: [ - { - type: 'update', - } - ], - }, - sort: ['-created_at'], - }, - { - developerMode: true, - type: 'table', - name: 'destroy', - title: '删除数据', - labelField: 'created_at', - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - }, - ], - fields: ['created_at', 'user', 'collection', 'type', 'index'], - detailsOpenMode: 'drawer', // window - details: ['descriptions'], - filter: { - and: [ - { - type: 'destroy', - } - ], - }, - sort: ['-created_at'], - }, - { - type: 'table', - name: 'table2', - title: '操作日志列表', - labelField: 'created_at', - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - }, - ], - fields: ['created_at', 'user', 'type', 'index'], - detailsOpenMode: 'drawer', // window - details: ['descriptions'], - sort: ['-created_at'], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - fields: ['created_at', 'user', 'collection', 'type', 'index', 'changes'], - actions: [], - }, - ], } as TableOptions; diff --git a/packages/plugin-action-logs/src/collections/collections.ts b/packages/plugin-action-logs/src/collections/collections.ts deleted file mode 100644 index 25cf0dae976b49bd2d90dd66e65c453eb4128772..0000000000000000000000000000000000000000 --- a/packages/plugin-action-logs/src/collections/collections.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { extend } from '@nocobase/database'; - -// TODO(bug): collections 表创建关联字段有问题 -export default extend({ - name: 'collections', - logging: false -}); diff --git a/packages/plugin-action-logs/src/hooks/after-create.ts b/packages/plugin-action-logs/src/hooks/after-create.ts index 36aea421c7856b8467ebe1fac3ab037577caca4b..0279ae659cb3c5e0933fc05a00c378f9b5930ff2 100644 --- a/packages/plugin-action-logs/src/hooks/after-create.ts +++ b/packages/plugin-action-logs/src/hooks/after-create.ts @@ -1,53 +1,52 @@ -import { Field } from '@nocobase/database'; +import Database, { Field, Model } from '@nocobase/database'; import { LOG_TYPE_CREATE } from '../constants'; -export default async function (model, options) { - if (!options.context) { +export async function afterCreate(model, options) { + const db = model.database as Database; + const table = db.getTable(model.constructor.name); + if (!table.getOptions('logging')) { return; } - const { database: db } = model; - const { context: { state }, transaction = await db.sequelize.transaction() } = options; + const { transaction = await db.sequelize.transaction() } = options; const ActionLog = db.getModel('action_logs'); - // 创建操作记录 - const log = await ActionLog.create({ - type: LOG_TYPE_CREATE, - collection_name: model.constructor.name, - index: model.get(model.constructor.primaryKeyAttribute), - created_at: model.get('created_at') - }, { - transaction - }); - if (state.currentUser) { - // TODO(bug): state.currentUser 不是 belongsTo field 的 target 实例 - // Sequelize 会另外创建一个 Model 的继承类,直传 instance 因为无法匹配类会当做 id 造成类型错误 - // await log.setUser(state.currentUser, { transaction }); - await log.updateAssociations({ user: state.currentUser.id }, { - transaction - }); - } - - const fields = db.getTable(model.constructor.name).getFields(); - const fieldsList = Array.from(fields.values()); - const changes = []; - const changed = model.changed(); - if (changed) { - changed.forEach((key: string) => { - const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); - if (field && !field.options.hidden && field.options.type !== 'formula') { - changes.push({ - field: field.options, - after: model.get(key) - }); - } - }); - await log.updateAssociations({ - changes + const currentUserId = options?.context?.state?.currentUser?.id; + try { + const log = await ActionLog.create({ + type: LOG_TYPE_CREATE, + collection_name: model.constructor.name, + index: model.get(model.constructor.primaryKeyAttribute), + created_at: model.get('created_at'), + user_id: currentUserId, }, { - transaction + transaction, + hooks: false, }); - } - - if (!options.transaction) { - await transaction.commit(); + const fields = db.getTable(model.constructor.name).getFields(); + const fieldsList = Array.from(fields.values()); + const changes = []; + const changed = model.changed(); + if (changed) { + changed.forEach((key: string) => { + const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); + if (field && !field.options.hidden && field.options.type !== 'formula') { + changes.push({ + field: field.options, + after: model.get(key) + }); + } + }); + await log.updateAssociations({ + changes + }, { + transaction + }); + } + if (!options.transaction) { + await transaction.commit(); + } + } catch (error) { + if (!options.transaction) { + await transaction.rollback(); + } } } diff --git a/packages/plugin-action-logs/src/hooks/after-destroy.ts b/packages/plugin-action-logs/src/hooks/after-destroy.ts index 28acac0d06081b73274c9c3f0e6b18681e5590ce..0ca3755ad154fb23293bc299de5a8eb30eb0a633 100644 --- a/packages/plugin-action-logs/src/hooks/after-destroy.ts +++ b/packages/plugin-action-logs/src/hooks/after-destroy.ts @@ -1,49 +1,48 @@ -import { Field } from '@nocobase/database'; +import Database, { Field } from '@nocobase/database'; import { LOG_TYPE_DESTROY } from '../constants'; -export default async function (model, options) { - if (!options.context) { +export async function afterDestroy(model, options) { + const db = model.database as Database; + const table = db.getTable(model.constructor.name); + if (!table.getOptions('logging')) { return; } - const { database: db } = model; - const { context: { state }, transaction = await db.sequelize.transaction() } = options; + const { transaction = await db.sequelize.transaction() } = options; const ActionLog = db.getModel('action_logs'); - // 创建操作记录 - const log = await ActionLog.create({ - // user_id: state.currentUser ? state.currentUser.id : null, - type: LOG_TYPE_DESTROY, - collection_name: model.constructor.name, - index: model.get(model.constructor.primaryKeyAttribute), - // created_at: model.get('created_at') - }, { - transaction - }); - if (state.currentUser) { - await log.updateAssociations({ user: state.currentUser.id }, { + const currentUserId = options?.context?.state?.currentUser?.id; + try { + const log = await ActionLog.create({ + type: LOG_TYPE_DESTROY, + collection_name: model.constructor.name, + index: model.get(model.constructor.primaryKeyAttribute), + user_id: currentUserId, + }, { + transaction, + hooks: false, + }); + const fields = db.getTable(model.constructor.name).getFields(); + const fieldsList = Array.from(fields.values()); + const changes = []; + Object.keys(model.get()).forEach((key: string) => { + const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); + if (field) { + changes.push({ + field: field.options, + before: model.get(key) + }); + } + }); + await log.updateAssociations({ + changes + }, { transaction }); - } - - const fields = db.getTable(model.constructor.name).getFields(); - const fieldsList = Array.from(fields.values()); - const changes = []; - Object.keys(model.get()).forEach((key: string) => { - const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); - if (field) { - changes.push({ - field: field.options, - before: model.get(key) - }); + if (!options.transaction) { + await transaction.commit(); + } + } catch (error) { + if (!options.transaction) { + await transaction.rollback(); } - }); - - await log.updateAssociations({ - changes - }, { - transaction - }); - - if (!options.transaction) { - await transaction.commit(); } } diff --git a/packages/plugin-action-logs/src/hooks/after-update.ts b/packages/plugin-action-logs/src/hooks/after-update.ts index d1e7e1613e9af33ac9f09efffe78051aa0c2fefc..999d5c49b61ff32d1be9806184d0b14693326026 100644 --- a/packages/plugin-action-logs/src/hooks/after-update.ts +++ b/packages/plugin-action-logs/src/hooks/after-update.ts @@ -1,51 +1,57 @@ -import { Field } from '@nocobase/database'; +import Database, { Field } from '@nocobase/database'; import { LOG_TYPE_UPDATE } from '../constants'; -export default async function (model, options) { - if (!options.context) { +export async function afterUpdate(model, options) { + const db = model.database as Database; + const table = db.getTable(model.constructor.name); + if (!table.getOptions('logging')) { return; } - const { database: db } = model; - const { context: { state }, transaction = await db.sequelize.transaction() } = options; + const changed = model.changed(); + if (!changed) { + return; + } + const { transaction = await db.sequelize.transaction() } = options; const ActionLog = db.getModel('action_logs'); - + const currentUserId = options?.context?.state?.currentUser?.id; const fields = db.getTable(model.constructor.name).getFields(); const fieldsList = Array.from(fields.values()); const changes = []; - const changed = model.changed(); - if (changed) { - changed.forEach((key: string) => { - const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); - if (field && !field.options.hidden && field.options.type !== 'formula') { - changes.push({ - field: field.options, - after: model.get(key), - before: model.previous(key) - }); - } - }); - - if (changes.length) { - // 创建操作记录 - const log = await ActionLog.create({ - type: LOG_TYPE_UPDATE, - collection_name: model.constructor.name, - index: model.get(model.constructor.primaryKeyAttribute), - created_at: model.get('updated_at') - }, { - transaction - }); - - await log.updateAssociations({ - ...(state.currentUser ? { user: state.currentUser.id } : {}), - changes - }, { - transaction + changed.forEach((key: string) => { + const field = fields.get(key) || fieldsList.find((item: Field) => item.options.field === key); + if (field && !field.options.hidden && field.options.type !== 'formula') { + changes.push({ + field: field.options, + after: model.get(key), + before: model.previous(key) }); } + }); + if (!changes.length) { + return; } - - if (!options.transaction) { - await transaction.commit(); + try { + const log = await ActionLog.create({ + type: LOG_TYPE_UPDATE, + collection_name: model.constructor.name, + index: model.get(model.constructor.primaryKeyAttribute), + created_at: model.get('updated_at'), + user_id: currentUserId, + }, { + transaction, + hooks: false, + }); + await log.updateAssociations({ + changes + }, { + transaction + }); + if (!options.transaction) { + await transaction.commit(); + } + } catch (error) { + if (!options.transaction) { + await transaction.rollback(); + } } } diff --git a/packages/plugin-action-logs/src/hooks/index.ts b/packages/plugin-action-logs/src/hooks/index.ts index 799f7968330e25ab79a40c166b60ab9a360ef3c9..3c84cf55e383fe83b2d3f472e71783fd56faabc8 100644 --- a/packages/plugin-action-logs/src/hooks/index.ts +++ b/packages/plugin-action-logs/src/hooks/index.ts @@ -1,10 +1,3 @@ -import afterCreate from './after-create'; -import afterUpdate from './after-update'; -import afterDestroy from './after-destroy'; - -export function addAll(Model) { - Model.addHook('afterCreate', afterCreate); - // Model.addHook('afterBulkCreate', hooks.afterBulkCreate); - Model.addHook('afterUpdate', afterUpdate); - Model.addHook('afterDestroy', afterDestroy); -} +export * from './after-create'; +export * from './after-update'; +export * from './after-destroy'; diff --git a/packages/plugin-action-logs/src/server.ts b/packages/plugin-action-logs/src/server.ts index c6f4458fe91fb99958a83a7b6a36152dcb08ae46..f4d874567dcdba43ac28bcad626cbdfa2ac655cb 100644 --- a/packages/plugin-action-logs/src/server.ts +++ b/packages/plugin-action-logs/src/server.ts @@ -1,56 +1,16 @@ import path from 'path'; -import { Op } from 'sequelize'; - -import { addAll } from './hooks'; - -export default async function() { - const { database } = this; - - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); - - // 为所有的表都加上日志的 hooks - database.addHook('afterTableInit', (table) => { - if (table.options.logging === false) { - return; - } - addAll(database.getModel(table.options.name)); - }); - - const Collection = database.getModel('collections'); - Collection.addHook('afterCreate', async (model, options) => { - if (model.get('logging') === false) { - return; - } - - const { transaction = await model.sequelize.transaction() } = options; - - const exists = await model.countFields({ - where: { - type: { [Op.iLike]: 'hasMany' }, - name: 'action_logs' - }, - transaction +import { IPlugin } from '@nocobase/server'; +import { afterCreate, afterUpdate, afterDestroy } from './hooks'; + +export default { + name: 'action-logs', + async load() { + const database = this.app.db; + database.import({ + directory: path.resolve(__dirname, 'collections'), }); - - if (!exists) { - await model.createField({ - interface: 'linkTo', - type: 'hasMany', - name: 'action_logs', - target: 'action_logs', - title: '数据动态', - foreignKey: 'index', - scope: { - collection_name: model.get('name') - }, - constraints: false - }, { transaction }); - } - - if (!options.transaction) { - await transaction.commit(); - } - }); -} + database.on('afterCreate', afterCreate); + database.on('afterUpdate', afterUpdate); + database.on('afterDestroy', afterDestroy); + } +} as IPlugin; diff --git a/packages/plugin-automations/package.json b/packages/plugin-automations/package.json index 8a609d2de89618f11db93f7c176683111ad396d3..eb7023c3eb833e7037b6969e149c8ec5ce4d171a 100644 --- a/packages/plugin-automations/package.json +++ b/packages/plugin-automations/package.json @@ -1,13 +1,11 @@ { "name": "@nocobase/plugin-automations", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", + "private": true, "license": "MIT", "dependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7", + "@nocobase/server": "^0.5.0-alpha.25", "json-templates": "^4.1.0", "node-schedule": "^2.0.0" }, diff --git a/packages/plugin-automations/src/__tests__/automations.test.ts b/packages/plugin-automations/src/__tests__/automations.test.ts index 26ed455664ee3f4b564c7b3d8ebfb80cbb64e311..75569c62ebec9af68c84761042e4904c4610a1e7 100644 --- a/packages/plugin-automations/src/__tests__/automations.test.ts +++ b/packages/plugin-automations/src/__tests__/automations.test.ts @@ -14,7 +14,7 @@ describe('automations', () => { beforeEach(async () => { app = await getApp(); - db = app.database; + db = app.db; Automation = db.getModel('automations') as any; Test = db.getModel('tests'); Target = db.getModel('targets'); diff --git a/packages/plugin-automations/src/__tests__/index.ts b/packages/plugin-automations/src/__tests__/index.ts index 9ec131ab0131352f9083351d64750f518fb83abf..ff38b9cb198eca12452c2b3b0f8d56cd40b35b34 100644 --- a/packages/plugin-automations/src/__tests__/index.ts +++ b/packages/plugin-automations/src/__tests__/index.ts @@ -59,11 +59,11 @@ export async function getApp() { automations: plugin }); await app.loadPlugins(); - const testTables = app.database.import({ + const testTables = app.db.import({ directory: path.resolve(__dirname, './collections') }); try { - await app.database.sync(); + await app.db.sync(); } catch (err) { console.error(err); } @@ -71,15 +71,15 @@ export async function getApp() { for (const table of testTables.values()) { // TODO(bug): 由于每个用例结束后不会清理用于测试的数据表,导致再次创建和更新 // 创建和更新里面仍会再次创建 fields,导致创建相关的数据重复,数据库报错。 - await app.database.getModel('collections').import(table.getOptions(), { update: true, migrate: false }); + await app.db.getModel('collections').import(table.getOptions(), { update: true, migrate: false }); } - app.context.db = app.database; + app.context.db = app.db; app.use(bodyParser()); app.use(middleware({ prefix: '/api', resourcer: app.resourcer, - database: app.database, + database: app.db, })); return app; } diff --git a/packages/plugin-automations/src/__tests__/jobs.test.ts b/packages/plugin-automations/src/__tests__/jobs.test.ts index 64233e939b8dd0159cb92757a2f19dd3b8bc335a..44266cfd5af261ff4b5d3e54645fd4b58c2031a2 100644 --- a/packages/plugin-automations/src/__tests__/jobs.test.ts +++ b/packages/plugin-automations/src/__tests__/jobs.test.ts @@ -19,7 +19,7 @@ describe('automations.jobs', () => { beforeEach(async () => { app = await getApp(); - db = app.database; + db = app.db; Job = db.getModel('automations_jobs') as any; Test = db.getModel('tests'); }); diff --git a/packages/plugin-automations/src/server.ts b/packages/plugin-automations/src/server.ts index 83b64f5087ec757c89147662fdecb843947b0225..43c43cb5c0e3958a204fdf9e223f02015a196038 100644 --- a/packages/plugin-automations/src/server.ts +++ b/packages/plugin-automations/src/server.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import Database, { registerModels } from '@nocobase/database'; import Resourcer from '@nocobase/resourcer'; import path from 'path'; diff --git a/packages/plugin-china-region/package.json b/packages/plugin-china-region/package.json index 5c6ccb68e2261961bcb67a82d49eaea7d7cd676a..80e5482c8a2ff8f4d000500271674c44a2eefc1e 100644 --- a/packages/plugin-china-region/package.json +++ b/packages/plugin-china-region/package.json @@ -1,11 +1,11 @@ { "name": "@nocobase/plugin-china-region", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", "dependencies": { - "@nocobase/database": "^0.4.0-alpha.7", + "@nocobase/server": "^0.5.0-alpha.25", "china-division": "2.3.1" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-china-region/src/collections/china_regions.ts b/packages/plugin-china-region/src/collections/china_regions.ts index 2edf7b5bdd036c033df4f6b91ee4583ad9634916..007ce03ba9326a706fd7ffc519a3e88c88cf99f5 100644 --- a/packages/plugin-china-region/src/collections/china_regions.ts +++ b/packages/plugin-china-region/src/collections/china_regions.ts @@ -10,21 +10,15 @@ export default { // 如使用代码作为 id 可能更节省,但由于代码数字最长为 12 字节,除非使用 bigint(64) 才够放置 { name: 'code', - title: '代码', - interface: 'string', type: 'string', unique: true, }, { name: 'name', - title: '名称', - interface: 'string', type: 'string', }, { name: 'parent', - title: '从属', - interface: 'linkTo', type: 'belongsTo', target: 'china_regions', targetKey: 'code', @@ -32,8 +26,6 @@ export default { }, { name: 'children', - title: '下辖', - interface: 'linkTo', type: 'hasMany', target: 'china_regions', sourceKey: 'code', @@ -41,7 +33,6 @@ export default { }, { name: 'level', - title: '层级', type: 'integer' } ] diff --git a/packages/plugin-china-region/src/server.ts b/packages/plugin-china-region/src/server.ts index 37b3ce17c2fbf13ce98abadf97903e10fa9d95b4..85428ea2ae63f7b8a3f0444ff0f7920e20268725 100644 --- a/packages/plugin-china-region/src/server.ts +++ b/packages/plugin-china-region/src/server.ts @@ -1,11 +1,22 @@ import path from 'path'; import { registerModels } from '@nocobase/database'; import { ChinaRegion } from './models/china-region'; +import { Plugin } from '@nocobase/server'; -export default async function (options = {}) { - const { database } = this; - registerModels({ ChinaRegion }); - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); -} +registerModels({ ChinaRegion }); + +export default { + name: 'china-region', + async load(this: Plugin) { + const db = this.app.db; + + db.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + this.app.on('db.init', async () => { + const M = db.getModel('china_regions'); + await M.importData(); + }); + } +}; diff --git a/packages/plugin-client/.gitignore b/packages/plugin-client/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1be219988380e71581d3d2cdb2d9d6e3638039da --- /dev/null +++ b/packages/plugin-client/.gitignore @@ -0,0 +1,4 @@ +node_modules +yarn-error.log +.env +src2 \ No newline at end of file diff --git a/packages/plugin-pages/.npmignore b/packages/plugin-client/.npmignore similarity index 100% rename from packages/plugin-pages/.npmignore rename to packages/plugin-client/.npmignore diff --git a/packages/plugin-client/package.json b/packages/plugin-client/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ef8843db6e07a6e80814a2d2caa8379b80669ae8 --- /dev/null +++ b/packages/plugin-client/package.json @@ -0,0 +1,16 @@ +{ + "name": "@nocobase/plugin-client", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "deepmerge": "^4.2.2", + "flat-to-nested": "^1.1.1", + "koa-compress": "^5.1.0" + }, + "devDependencies": { + "@nocobase/test": "^0.5.0-alpha.25" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/plugin-client/src/__tests__/sqlite.test.ts b/packages/plugin-client/src/__tests__/sqlite.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..628b359d33dc96a60b278f85192795778de63cdc --- /dev/null +++ b/packages/plugin-client/src/__tests__/sqlite.test.ts @@ -0,0 +1,65 @@ +import Application from '../../../server/src/application'; +import { getInitSqls, runSql } from '../server'; + +test('import demo data', async () => { + const app = new Application({ + database: { + dialect: 'sqlite', + dialectModule: require('sqlite3'), + storage: 'db.sqlite', + logging: false, + }, + }); + + const plugins = [ + '@nocobase/plugin-ui-router', + '@nocobase/plugin-ui-schema', + '@nocobase/plugin-collections', + '@nocobase/plugin-users', + '@nocobase/plugin-action-logs', + '@nocobase/plugin-file-manager', + '@nocobase/plugin-permissions', + '@nocobase/plugin-export', + '@nocobase/plugin-system-settings', + '@nocobase/plugin-china-region', + ]; + + for (const plugin of plugins) { + const pluginPath = `${plugin}/src/server`.replace( + '@nocobase/', + '../../../', + ); + app.plugin((await import(pluginPath)).default); + } + + await app.load(); + + await app.db.sync({ force: true }); + + await app.emitAsync('db.init'); + + const database = app.db; + + const sqls = getInitSqls(); + + for (const sqlGroup of sqls.part1) { + for (const sql of sqlGroup.split(';')) { + await runSql(sql, database); + } + } + + await app.db.getModel('collections').load({ + skipExisting: true, + }); + await app.db.sync(); + + for (const sqlGroup of sqls.part2) { + for (const sql of sqlGroup.split(';')) { + try { + await runSql(sql, database); + } catch (e) { + console.error(e); + } + } + } +}); diff --git a/packages/plugin-client/src/db/part1/01-ui_schemas.sql b/packages/plugin-client/src/db/part1/01-ui_schemas.sql new file mode 100644 index 0000000000000000000000000000000000000000..409f0e22c28e2cdab0d13299fa50d68e03af8f60 --- /dev/null +++ b/packages/plugin-client/src/db/part1/01-ui_schemas.sql @@ -0,0 +1,1570 @@ +DELETE FROM "ui_schemas"; +INSERT INTO "ui_schemas" ("key", "name", "title", "type", "x-component", "options", "async", "sort", "created_at", "updated_at", "parent_key") VALUES +('dtu7erjj0q8', NULL, '昵称', 'string', 'Input', '{}', '0', 1, '2021-09-02 15:07:56.984+00', '2021-09-02 15:07:56.984+00', NULL), +('5nqs5glgn5c', NULL, '邮箱', 'string', 'Input', '{"require":true}', '0', 2, '2021-09-02 15:07:57.015+00', '2021-09-02 15:07:57.015+00', NULL), +('a65exd8qcuo', NULL, '密码', 'string', 'Password', '{}', '0', 3, '2021-09-02 15:07:57.036+00', '2021-09-02 15:07:57.036+00', NULL), +('qqzzjakwkwl', 'qqzzjakwkwl', NULL, 'void', 'Menu', '{"x-designable-bar":"Menu.DesignableBar","x-component-props":{"mode":"mix","theme":"dark","defaultSelectedKeys":"{{ selectedKeys }}","sideMenuRef":"{{ sideMenuRef }}","onSelect":"{{ onSelect }}","onRemove":"{{ onMenuItemRemove }}"}}', '0', 4, '2021-09-02 15:07:57.179+00', '2021-09-02 15:07:57.179+00', NULL), +('dtf9j0b8p9u', NULL, '登录', 'object', NULL, '{}', '0', 5, '2021-09-02 15:07:57.204+00', '2021-09-02 15:07:57.204+00', NULL), +('momkt16x7mx', 'email', NULL, 'string', 'Input', '{"required":true,"x-decorator":"FormItem","x-component-props":{"placeholder":"电子邮箱","style":{}}}', '0', 1, '2021-09-02 15:07:57.211+00', '2021-09-02 15:07:57.211+00', 'dtf9j0b8p9u'), +('tkt2jhj8sat', 'password', NULL, 'string', 'Password', '{"required":true,"x-decorator":"FormItem","x-component-props":{"placeholder":"密码","style":{}}}', '0', 2, '2021-09-02 15:07:57.218+00', '2021-09-02 15:07:57.218+00', 'dtf9j0b8p9u'), +('k3s7zqvqmom', 'actions', NULL, 'void', 'Div', '{}', '0', 3, '2021-09-02 15:07:57.225+00', '2021-09-02 15:07:57.225+00', 'dtf9j0b8p9u'), +('m0n5a3jfesn', 'submit', '登录', 'void', 'Action', '{"x-component-props":{"block":true,"type":"primary","useAction":"{{ useLogin }}","style":{"width":"100%"}}}', '0', 1, '2021-09-02 15:07:57.23+00', '2021-09-02 15:07:57.23+00', 'k3s7zqvqmom'), +('mrmnoyxriey', 'registerlink', NULL, 'void', 'Div', '{}', '0', 4, '2021-09-02 15:07:57.237+00', '2021-09-02 15:07:57.237+00', 'dtf9j0b8p9u'), +('bx33j95zx96', 'link', '注册账号', 'void', 'Action.Link', '{"x-component-props":{"to":"/register"}}', '0', 1, '2021-09-02 15:07:57.242+00', '2021-09-02 15:07:57.242+00', 'mrmnoyxriey'), +('46qlxqam3xk', NULL, '注册', 'object', NULL, '{}', '0', 6, '2021-09-02 15:07:57.264+00', '2021-09-02 15:07:57.264+00', NULL), +('boeo3hxxxbt', 'email', NULL, 'string', 'Input', '{"required":true,"x-decorator":"FormItem","x-component-props":{"placeholder":"电子邮箱","style":{}}}', '0', 1, '2021-09-02 15:07:57.275+00', '2021-09-02 15:07:57.275+00', '46qlxqam3xk'), +('1hab9e4957e', 'password', NULL, 'string', 'Password', '{"required":true,"x-decorator":"FormItem","x-component-props":{"placeholder":"密码","checkStrength":true,"style":{}},"x-reactions":[{"dependencies":[".confirm_password"],"fulfill":{"state":{"errors":"{{$deps[0] && $self.value && $self.value !== $deps[0] ? \"确认密码不匹配\" : \"\"}}"}}}]}', '0', 2, '2021-09-02 15:07:57.283+00', '2021-09-02 15:07:57.283+00', '46qlxqam3xk'), +('b1wtfrb9u23', 'confirm_password', NULL, 'string', 'Password', '{"required":true,"x-decorator":"FormItem","x-component-props":{"placeholder":"确认密码","checkStrength":true,"style":{}},"x-reactions":[{"dependencies":[".password"],"fulfill":{"state":{"errors":"{{$deps[0] && $self.value && $self.value !== $deps[0] ? \"确认密码不匹配\" : \"\"}}"}}}]}', '0', 3, '2021-09-02 15:07:57.29+00', '2021-09-02 15:07:57.29+00', '46qlxqam3xk'), +('oxi5nbuxoz5', 'actions', NULL, 'void', 'Div', '{}', '0', 4, '2021-09-02 15:07:57.299+00', '2021-09-02 15:07:57.299+00', '46qlxqam3xk'), +('seai078jf23', 'submit', '注册', 'void', 'Action', '{"x-component-props":{"block":true,"type":"primary","useAction":"{{ useRegister }}","style":{"width":"100%"}}}', '0', 1, '2021-09-02 15:07:57.306+00', '2021-09-02 15:07:57.306+00', 'oxi5nbuxoz5'), +('95u0x6o2nws', 'registerlink', NULL, 'void', 'Div', '{}', '0', 5, '2021-09-02 15:07:57.32+00', '2021-09-02 15:07:57.32+00', '46qlxqam3xk'), +('hk3wro8l6pd', 'link', '使用已有账号登录', 'void', 'Action.Link', '{"x-component-props":{"to":"/login"}}', '0', 1, '2021-09-02 15:07:57.328+00', '2021-09-02 15:07:57.328+00', '95u0x6o2nws'), +('q8k5he8m33u', 'y1fa6f1cy2g', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-02 22:21:32.654+00', '2021-09-02 22:21:32.654+00', '4b2sqxvrd5q'), +('y9qcc6ds2j3', 'wf9o6yhusn8', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-02 22:21:32.663+00', '2021-09-02 22:21:32.663+00', 'q8k5he8m33u'), +('5vb0xrpx9rw', '0o43oyce02p', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-02 22:23:52.142+00', '2021-09-02 22:23:52.142+00', '2e2trty2mfu'), +('qc0b0d2xfo4', NULL, '添加时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 7, '2021-09-02 22:24:30.245+00', '2021-09-02 22:24:30.245+00', NULL), +('ue90wlv7r26', NULL, '最后更新时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 8, '2021-09-02 22:24:30.27+00', '2021-09-02 22:24:30.27+00', NULL), +('32q17i8jcg9', NULL, '添加人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 9, '2021-09-02 22:24:30.29+00', '2021-09-02 22:24:30.29+00', NULL), +('1keis1kmsh9', NULL, '最后修改人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 10, '2021-09-02 22:24:30.305+00', '2021-09-02 22:24:30.305+00', NULL), +('xe5j6tk6y52', NULL, '名称', 'string', 'Input', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 11, '2021-09-02 22:27:03.747+00', '2021-09-02 22:27:03.747+00', NULL), +('exjytl34657', NULL, '分类', 'array', 'Select', '{"x-component-props":{"mode":"multiple"},"x-decorator":"FormItem","x-designable-bar":"Select.DesignableBar","enum":[{"value":"6t7ymkea93i","label":"家用电器","color":"red"},{"value":"qfw5lm2ltq1","label":"日用品","color":"magenta"},{"value":"7y53n84vad6","label":"蔬菜水果","color":"orange"},{"value":"mbhrlnto7c7","label":"儿童玩具","color":"green"},{"value":"xaf8vqqc37w","label":"药品","color":"blue"},{"value":"1hqareezm1g","label":"家具","color":"purple"}]}', '0', 12, '2021-09-02 22:27:03.769+00', '2021-09-02 22:27:03.769+00', NULL), +('4blpztuxkha', NULL, '图片', 'array', 'Upload.Attachment', '{"x-decorator":"FormItem","x-designable-bar":"Upload.DesignableBar","x-component-props":{"multiple":true}}', '0', 13, '2021-09-02 22:28:32.783+00', '2021-09-02 22:28:32.783+00', NULL), +('4an73nd4bxh', NULL, '产地', 'array', 'Cascader', '{"x-component-props":{"changeOnSelectLast":false,"loadData":"{{ ChinaRegion.loadData() }}","labelInValue":true,"maxLevel":3,"fieldNames":{"label":"name","value":"code","children":"children"}},"x-reactions":["{{ChinaRegion.useFieldValue}}","{{useAsyncDataSource(ChinaRegion.loadDataSource())}}"],"x-decorator":"FormItem","x-designable-bar":"Cascader.DesignableBar"}', '0', 14, '2021-09-02 22:28:32.807+00', '2021-09-02 22:28:32.807+00', NULL), +('e5t9w7t3rxu', NULL, '价格', 'number', 'InputNumber', '{"x-component-props":{"stringMode":true,"step":"0.01"},"x-decorator":"FormItem","x-designable-bar":"InputNumber.DesignableBar"}', '0', 15, '2021-09-02 22:28:32.824+00', '2021-09-02 22:28:32.824+00', NULL), +('hej1gpzthf3', NULL, '商品描述', 'string', 'Input.TextArea', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 16, '2021-09-02 22:28:32.843+00', '2021-09-02 22:28:32.843+00', NULL), +('zh4zpw15qpz', 'rxfyczia6um', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-03 07:17:56.728+00', '2021-09-03 07:17:56.728+00', 'y9qcc6ds2j3'), +('hlupairud50', '44om6qmmqsp', '商品管理', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"filetextoutlined"}}', '0', 1, '2021-09-02 22:20:51.678+00', '2021-09-04 01:04:35.453+00', NULL), +('2e2trty2mfu', 'g4r3duba7a6', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-02 22:23:52.134+00', '2021-09-02 22:23:52.134+00', NULL), +('q9qjhqqboq4', 'rxcomawl2ym', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 07:17:56.761+00', '2021-09-03 07:17:56.761+00', 'zh4zpw15qpz'), +('hci6kno0a5c', 'ff8qcydemwv', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-03 07:17:56.802+00', '2021-09-03 07:17:56.802+00', 'qme4giyofs8'), +('uqdqezff3oe', '3dt8x3f0lu7', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-03 07:17:56.823+00', '2021-09-03 07:17:56.823+00', 'hci6kno0a5c'), +('91vcddnz04t', 'dzevfjy4gnk', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-03 07:17:56.842+00', '2021-09-03 07:17:56.842+00', 'hci6kno0a5c'), +('8ba2qgi5yvt', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-03 07:17:56.872+00', '2021-09-03 07:17:56.872+00', 'nxmhnl633uj'), +('6ft06i5sn2y', 'i62pck8bwuz', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-03 07:17:56.882+00', '2021-09-03 07:17:56.882+00', '8ba2qgi5yvt'), +('1qy3figdlby', 'ge0vpyjv1or', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-03 07:17:56.912+00', '2021-09-03 07:17:56.912+00', 'q6htpfagtbq'), +('imy04dt71th', '5dxq94b62t2', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-03 07:17:56.919+00', '2021-09-03 07:17:56.919+00', '1qy3figdlby'), +('0n1tanzr0l6', 'zlaik70g07d', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-03 07:17:56.928+00', '2021-09-03 07:17:56.928+00', 'imy04dt71th'), +('nphje2oqie7', '70nj5hibesh', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-03 07:17:56.936+00', '2021-09-03 07:17:56.936+00', '0n1tanzr0l6'), +('z4iebhg35ab', 'vff2wy4g7er', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-03 07:17:56.955+00', '2021-09-03 07:17:56.955+00', 'fyhivthynf3'), +('bvtbcjn2lpc', '8yfcer5xivv', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-03 07:17:56.972+00', '2021-09-03 07:17:56.972+00', '1qy3figdlby'), +('n0d36ycb79p', 'o0qsnoao4nu', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-03 07:17:56.983+00', '2021-09-03 07:17:56.983+00', 'bvtbcjn2lpc'), +('xz80ys7oxso', 'z1nqozz5f97', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-03 07:17:56.991+00', '2021-09-03 07:17:56.991+00', 'n0d36ycb79p'), +('uxcvj4473q9', NULL, '添加人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 19, '2021-09-03 08:17:30.567+00', '2021-09-03 08:17:30.567+00', NULL), +('d3zwndj0gdt', NULL, '最后修改人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 20, '2021-09-03 08:17:30.583+00', '2021-09-03 08:17:30.583+00', NULL), +('fyhivthynf3', 'jgpfxlrlt5d', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"insertrowbelowoutlined"}}', '0', 1, '2021-09-03 07:17:56.947+00', '2021-09-04 01:09:44.895+00', 'nphje2oqie7'), +('wbhdzftsrlf', 'r8u46801zwr', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_lwyvh77c122"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-03 07:18:00.429+00', '2021-09-03 07:58:56.796+00', 'qme4giyofs8'), +('r7ynpehmcmt', '5818yebo8e5', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_lov82rwvxgk"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-03 07:18:01.064+00', '2021-09-04 01:07:58.194+00', 'qme4giyofs8'), +('c6qmyf4uzl9', NULL, '名称', 'string', 'Input', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 21, '2021-09-03 08:18:44.967+00', '2021-09-03 08:18:44.967+00', NULL), +('nxmhnl633uj', 't0gll82cewi', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-03 07:17:56.859+00', '2021-09-03 07:59:17.403+00', 'hci6kno0a5c'), +('7u0cu6nfu44', NULL, '截止日期', 'datetime', 'DatePicker', '{"x-component-props":{"showTime":false,"dateFormat":"YYYY-MM-DD"},"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 22, '2021-09-03 08:18:44.991+00', '2021-09-03 08:18:44.991+00', NULL), +('q6htpfagtbq', 'gy0xi9yrxhg', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 10, '2021-09-03 07:17:56.904+00', '2021-09-04 01:07:52.803+00', 'qme4giyofs8'), +('y9y4mgjy6ot', NULL, '添加时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 17, '2021-09-03 08:17:30.528+00', '2021-09-03 08:17:30.528+00', NULL), +('lchrxtjm3d5', NULL, '最后更新时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 18, '2021-09-03 08:17:30.547+00', '2021-09-03 08:17:30.547+00', NULL), +('3gagem5q13h', 'ojn3i7qfnxt', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-03 08:19:04.663+00', '2021-09-03 08:19:04.663+00', 'hall72478p5'), +('5de6xmem8vw', NULL, '状态', 'string', 'Radio.Group', '{"x-decorator":"FormItem","x-designable-bar":"Radio.DesignableBar","enum":[{"value":"f1g3r41rdh8","label":"未开始","color":"volcano"},{"value":"lebkfnj3d9i","label":"进行中","color":"green"},{"value":"zfowtv6fnel","label":"已完成","color":"blue"}]}', '0', 23, '2021-09-03 08:18:45.015+00', '2021-09-12 09:36:39.261+00', NULL), +('0b73gccskc2', 'vz3aemqbios', '任务', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"appstoreaddoutlined"}}', '0', 11, '2021-09-03 08:18:54.926+00', '2021-09-14 00:34:37.379+00', 'qqzzjakwkwl'), +('hall72478p5', 'scmt3291syn', '第一个里程碑', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"appstoreoutlined"}}', '0', 1, '2021-09-03 08:19:04.655+00', '2021-09-14 01:54:51.761+00', '0b73gccskc2'), +('hhhofusmllb', 'hv6tou8hct5', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-03 08:19:04.671+00', '2021-09-03 08:19:04.671+00', '3gagem5q13h'), +('ye3kb9rnxm4', 'xzth0mtrm0v', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-03 08:19:14.491+00', '2021-09-03 08:19:14.491+00', 'vahh7rzizdm'), +('qf2e3s09skt', 'tdt0sbn0j6j', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-03 08:19:14.5+00', '2021-09-03 08:19:14.5+00', 'ye3kb9rnxm4'), +('uqtx7xt9co6', '4r2blc4z0sk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-03 08:19:19.265+00', '2021-09-03 08:19:19.265+00', 'hhhofusmllb'), +('0grxmryvfz7', 'b4xbacyzee7', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:19:19.277+00', '2021-09-03 08:19:19.277+00', 'uqtx7xt9co6'), +('40i74d7mqbd', 't6iyb99snt8', NULL, 'array', 'Kanban', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Kanban.DesignableBar","x-component-props":{"resource":"t_2uhu4szs1kq","collectionName":"t_2uhu4szs1kq","groupField":{"name":"f_u4i0jrp4uo6"}},"x-decorator":"CardItem","x-decorator-props":{"style":{"background":"none"},"bodyStyle":{"padding":0}}}', '0', 1, '2021-09-03 08:19:19.293+00', '2021-09-03 08:19:19.293+00', '0grxmryvfz7'), +('2pqkn7o84o4', 'create', '添加卡片', 'void', 'Kanban.Card.AddNew', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"text","icon":"PlusOutlined"}}', '0', 1, '2021-09-03 08:19:19.301+00', '2021-09-03 08:19:19.301+00', '40i74d7mqbd'), +('qul9m62boq4', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Kanban.useCreateResource }}"},"x-component-props":{"useOkAction":"{{ Kanban.useCreateAction }}"}}', '0', 1, '2021-09-03 08:19:19.314+00', '2021-09-03 08:19:19.314+00', '2pqkn7o84o4'), +('qp4giydwn93', 'xb7wy1ovtep', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-03 08:19:19.324+00', '2021-09-03 08:19:19.324+00', 'qul9m62boq4'), +('thuluzq0u3x', 'card1', NULL, 'void', 'Kanban.Card', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-designable-bar":"Kanban.Card.DesignableBar","x-read-pretty":true,"x-decorator-props":{"useResource":"{{ Kanban.useRowResource }}"}}', '0', 2, '2021-09-03 08:19:19.338+00', '2021-09-03 08:19:19.338+00', '40i74d7mqbd'), +('keawi4bc0r4', 'view1', '编辑数据', 'void', 'Kanban.Card.View', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Kanban.useUpdateAction }}"},"x-decorator-props":{"useResource":"{{ Kanban.useSingleResource }}"}}', '0', 3, '2021-09-03 08:19:19.347+00', '2021-09-03 08:19:19.347+00', '40i74d7mqbd'), +('tj9c7vbrcib', 'i5b5nd38t9j', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-03 08:19:19.353+00', '2021-09-03 08:19:19.353+00', 'keawi4bc0r4'), +('a27v24fl7pt', 'lmp73qtjj5u', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-03 08:19:31.795+00', '2021-09-03 08:19:31.795+00', 'qf2e3s09skt'), +('ii4olxlcm50', 'ad0nvz4l7w2', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:19:31.813+00', '2021-09-03 08:19:31.813+00', 'a27v24fl7pt'), +('p9b882otm2b', 'calendar1', NULL, 'array', 'Calendar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Calendar.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"resource":"t_2uhu4szs1kq","collectionName":"t_2uhu4szs1kq","fieldNames":{"title":"f_hwenour8ara","start":"f_hznqtmqljb2","end":"f_hznqtmqljb2"}}}', '0', 1, '2021-09-03 08:19:31.833+00', '2021-09-03 08:19:31.833+00', 'ii4olxlcm50'), +('ejqz7gegmx1', 'toolbar', NULL, 'void', 'Calendar.Toolbar', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:19:31.844+00', '2021-09-03 08:19:31.844+00', 'p9b882otm2b'), +('2xv57eyi0cw', 'today', '今天', 'void', 'Calendar.Today', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Calendar.ActionDesignableBar","x-align":"left","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"today"}}', '0', 1, '2021-09-03 08:19:31.851+00', '2021-09-03 08:19:31.851+00', 'ejqz7gegmx1'), +('64llgworte5', 'nav', '翻页', 'void', 'Calendar.Nav', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Calendar.ActionDesignableBar","x-align":"left","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"nav"}}', '0', 2, '2021-09-03 08:19:31.86+00', '2021-09-03 08:19:31.86+00', 'ejqz7gegmx1'), +('iqzt0355l63', 'title', '标题', 'void', 'Calendar.Title', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Calendar.ActionDesignableBar","x-align":"left","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"title"}}', '0', 3, '2021-09-03 08:19:31.871+00', '2021-09-03 08:19:31.871+00', 'ejqz7gegmx1'), +('iccws4w0w0a', 'viewSelect', '视图切换', 'void', 'Calendar.ViewSelect', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Calendar.ActionDesignableBar","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"viewSelect"}}', '0', 4, '2021-09-03 08:19:31.88+00', '2021-09-03 08:19:31.88+00', 'ejqz7gegmx1'), +('5abcnk9vnep', 'filter', '筛选', 'void', 'Calendar.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-designable-bar":"Calendar.Filter.DesignableBar","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"}}', '0', 5, '2021-09-03 08:19:31.889+00', '2021-09-03 08:19:31.889+00', 'ejqz7gegmx1'), +('po57yizdz6s', 'create', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-designable-bar":"Calendar.ActionDesignableBar","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"type":"primary","icon":"PlusOutlined"}}', '0', 6, '2021-09-03 08:19:31.901+00', '2021-09-03 08:19:31.901+00', 'ejqz7gegmx1'), +('1yf3tp20bq1', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Calendar.useCreateAction }}"}}', '0', 1, '2021-09-03 08:19:31.908+00', '2021-09-03 08:19:31.908+00', 'po57yizdz6s'), +('uutpyimeve9', 'cdlkzds87g6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-03 08:19:31.915+00', '2021-09-03 08:19:31.915+00', '1yf3tp20bq1'), +('1a02fuojrkw', 'event', NULL, 'void', 'Calendar.Event', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-03 08:19:31.933+00', '2021-09-03 08:19:31.933+00', 'p9b882otm2b'), +('b9zm4ia7tcy', 'qt7hb210iz8', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-03 08:19:31.94+00', '2021-09-03 08:19:31.94+00', '1a02fuojrkw'), +('wl8xndbdiep', 'mz90271z9zy', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-03 08:19:31.947+00', '2021-09-03 08:19:31.947+00', 'b9zm4ia7tcy'), +('4vjk2zw3u7d', 'kcvhm3jspz6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-03 08:19:31.956+00', '2021-09-03 08:19:31.956+00', 'wl8xndbdiep'), +('mxfms69ou5t', 'liaeebqv8pf', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-03 08:19:40.992+00', '2021-09-03 08:19:40.992+00', 'qp4giydwn93'), +('5x5qbcle61k', 'wsqrpym4bu8', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:19:41.002+00', '2021-09-03 08:19:41.002+00', 'mxfms69ou5t'), +('f4x0kro4bj0', 'tc85poi2xr1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-03 08:19:41.011+00', '2021-09-03 08:19:41.011+00', '5x5qbcle61k'), +('l0ypat3bs7x', '86tpwv6pbd2', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-03 08:19:41.945+00', '2021-09-03 08:19:41.945+00', 'qp4giydwn93'), +('lza1t64y1ef', 'li6v13aiqs9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:19:41.953+00', '2021-09-03 08:19:41.953+00', 'l0ypat3bs7x'), +('fkihjain6tk', 'uyjo4jzkozi', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_u4i0jrp4uo6"}}', '0', 1, '2021-09-03 08:19:41.962+00', '2021-09-03 08:19:41.962+00', 'lza1t64y1ef'), +('jkwfv8xvzs8', '1vhukij8mcl', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-03 08:20:08.776+00', '2021-09-03 08:20:08.776+00', 'tj9c7vbrcib'), +('1yy0ekta4lv', 'nq9arbvv0lt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:20:08.787+00', '2021-09-03 08:20:08.787+00', 'jkwfv8xvzs8'), +('6cvv2nxatks', '6hw86szrous', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-03 08:20:08.808+00', '2021-09-03 08:20:08.808+00', '1yy0ekta4lv'), +('5gzwwh2u362', 'jntiu0y679i', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-04 00:41:49.342+00', '2021-09-04 00:41:49.342+00', '6ft06i5sn2y'), +('a2izjbgjj0t', 'yts2grj9iwx', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:49.349+00', '2021-09-04 00:41:49.349+00', '5gzwwh2u362'), +('2993ircibv5', 'kcbni08qvrh', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-04 00:41:50.846+00', '2021-09-04 00:41:50.846+00', '6ft06i5sn2y'), +('jsy57cidyl6', '56wgr57q4u1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:50.853+00', '2021-09-04 00:41:50.853+00', '2993ircibv5'), +('rlmdm1etdgx', '7o31ytxfcmv', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-04 00:41:54.185+00', '2021-09-04 00:41:54.185+00', '6ft06i5sn2y'), +('oxi5u6uvxfx', 'rz5uum841j1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:54.194+00', '2021-09-04 00:41:54.194+00', 'rlmdm1etdgx'), +('c9j7inlqgiq', 'b6sa8kzyqyg', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-04 00:41:55.115+00', '2021-09-04 00:41:55.115+00', '6ft06i5sn2y'), +('2irh07pq84a', 'qmr0ywn7mqt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:55.125+00', '2021-09-04 00:41:55.125+00', 'c9j7inlqgiq'), +('g2n8ab8hfo3', 'f9xmh0y1yxt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_xmjn5cfl9co"}}', '0', 1, '2021-09-04 00:41:55.134+00', '2021-09-04 00:41:55.134+00', '2irh07pq84a'), +('9zo6rp02njp', 'ha6jdpf8rwb', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-04 00:41:56.404+00', '2021-09-04 00:41:56.404+00', '6ft06i5sn2y'), +('1gpbwdjq0qb', 'a12vrfnw8th', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:56.415+00', '2021-09-04 00:41:56.415+00', '9zo6rp02njp'), +('i2g0ymvh2oc', 'xzpw1ysqg71', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jbqopur80lk"}}', '0', 1, '2021-09-04 00:41:56.422+00', '2021-09-04 00:41:56.422+00', '1gpbwdjq0qb'), +('7hk2xs6w9pe', 'chid46xwicn', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-04 00:42:06.896+00', '2021-09-04 00:42:06.896+00', '2993ircibv5'), +('4b2sqxvrd5q', 'pgqztmld4wa', '全部商品', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"filezipoutlined"}}', '0', 3, '2021-09-02 22:21:32.644+00', '2021-09-04 01:04:42.789+00', 'hlupairud50'), +('44t87p11w0i', '8plbn03dqo4', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 00:41:52.759+00', '2021-09-04 00:41:52.759+00', NULL), +('xya5psfee1u', 'whx1m5o40du', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lwyvh77c122"},"required":true}', '0', 1, '2021-09-04 00:41:49.355+00', '2021-09-04 00:42:33.448+00', 'a2izjbgjj0t'), +('p7ss6bpbrzl', '4gwp7bm32c5', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lov82rwvxgk"},"required":true}', '0', 1, '2021-09-04 00:41:50.862+00', '2021-09-04 00:42:36.452+00', 'jsy57cidyl6'), +('1oyv4jvf17h', 'nriy7nwahly', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n0snwtdes3r"},"required":true}', '0', 1, '2021-09-04 00:41:52.767+00', '2021-09-04 00:42:39.12+00', '7hk2xs6w9pe'), +('5ss3hct0tzk', '3mqoh9s8p2w', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jdlw4uf6vfv"},"required":true}', '0', 1, '2021-09-04 00:41:54.203+00', '2021-09-04 00:42:41.413+00', 'oxi5u6uvxfx'), +('lnpxh9nm3r7', 'xrpo2ywbmqk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-04 01:05:47.117+00', '2021-09-04 01:05:47.117+00', 'z4iebhg35ab'), +('l3xvirdh2n7', '8but88ujwx0', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:05:47.126+00', '2021-09-04 01:05:47.126+00', 'lnpxh9nm3r7'), +('gqo8ifd6wos', '67rcni8xss5', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-04 01:05:47.133+00', '2021-09-04 01:05:47.133+00', 'l3xvirdh2n7'), +('t2yy2l95c2x', '2t34khmsom8', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-04 01:05:47.141+00', '2021-09-04 01:05:47.141+00', 'gqo8ifd6wos'), +('ikp2c3671e1', '8s4wm56mm5h', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-04 01:05:47.152+00', '2021-09-04 01:05:47.152+00', 'gqo8ifd6wos'), +('gpyobccc3hj', '5si11fk0uzi', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-04 01:05:50.45+00', '2021-09-04 01:05:50.45+00', 'ikp2c3671e1'), +('0zjjrfqpfz2', 'p7272mdp4dx', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:05:50.458+00', '2021-09-04 01:05:50.458+00', 'gpyobccc3hj'), +('4hw5s1bqlcq', 'rhjcxv8ewkt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lwyvh77c122"}}', '0', 1, '2021-09-04 01:05:50.465+00', '2021-09-04 01:05:50.465+00', '0zjjrfqpfz2'), +('996rd4ydrib', 'qs6bc91t1uk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-04 01:05:56.546+00', '2021-09-04 01:05:56.546+00', 'ikp2c3671e1'), +('3jt6bxcs019', 'd1eih5r6zn8', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:05:56.553+00', '2021-09-04 01:05:56.553+00', '996rd4ydrib'), +('f4s7urvlin4', '8p14vew9ykq', '任务', 'void', 'Form.Field', '{"version":"2.0","x-decorator":"Form.Field.Item","x-decorator-props":{"draggable":false},"x-designable-bar":"Kanban.FieldDesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-03 08:19:58.35+00', '2021-09-14 04:36:59.622+00', 'thuluzq0u3x'), +('8j5t7fwf123', 'lpy4bh6ctsf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-03 08:20:09.432+00', '2021-09-03 08:20:09.432+00', NULL), +('m8e7eb5nsfa', 'p8qhxvhxfbo', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"},"required":true}', '0', 1, '2021-09-03 08:20:09.443+00', '2021-09-12 08:18:58.824+00', 'gnwa4ndv1gi'), +('6v14dvbfl9n', 'pdgy56ieztt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lov82rwvxgk"}}', '0', 1, '2021-09-04 01:05:56.56+00', '2021-09-04 01:05:56.56+00', '3jt6bxcs019'), +('pdqub080ddp', 'nho6v9zwff7', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-04 01:06:00.092+00', '2021-09-04 01:06:00.092+00', 'ikp2c3671e1'), +('8xeg3mk5gah', 'j5oly8kp01g', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:00.098+00', '2021-09-04 01:06:00.098+00', 'pdqub080ddp'), +('4b407hldh87', '4fmtzzm1zz0', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_xmjn5cfl9co"}}', '0', 1, '2021-09-04 01:06:00.106+00', '2021-09-04 01:06:00.106+00', '8xeg3mk5gah'), +('bzn0zm47xy7', 'z5jb51wqke0', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-04 01:06:01.338+00', '2021-09-04 01:06:01.338+00', 'ikp2c3671e1'), +('1bellguhtrz', '0h00kblqgro', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:01.346+00', '2021-09-04 01:06:01.346+00', 'bzn0zm47xy7'), +('qu7mtca9gg0', 'muj6xkenwn6', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jbqopur80lk"}}', '0', 1, '2021-09-04 01:06:01.353+00', '2021-09-04 01:06:01.353+00', '1bellguhtrz'), +('esg3atlxpke', 'vkrvqlksqq6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:31.079+00', '2021-09-04 01:06:31.079+00', NULL), +('prho1ivfcus', 'udmb8iqz5gd', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n0snwtdes3r"}}', '0', 1, '2021-09-04 01:05:57.546+00', '2021-09-04 01:06:10.37+00', '2ysrr1sgqwt'), +('8aynble3gd4', '409wsksinel', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-04 01:06:07.368+00', '2021-09-04 01:06:07.368+00', NULL), +('804bar596wn', 'bb1m7wqqydj', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-04 01:06:27.957+00', '2021-09-04 01:06:27.957+00', 'xz80ys7oxso'), +('24goqxvwuel', 'zbt7eol6mpi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:27.97+00', '2021-09-04 01:06:27.97+00', '804bar596wn'), +('yjrydx6vdvm', 'qj9bbzbily0', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-04 01:06:29.618+00', '2021-09-04 01:06:29.618+00', 'xz80ys7oxso'), +('e6wsxbftk55', 'o04ib3b54qj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:29.625+00', '2021-09-04 01:06:29.625+00', 'yjrydx6vdvm'), +('sxxzhthxo97', 'bxzch4slq3k', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-04 01:06:31.902+00', '2021-09-04 01:06:31.902+00', 'xz80ys7oxso'), +('7v5o4r7466o', 'q1lbnq1q7e8', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:31.967+00', '2021-09-04 01:06:31.967+00', 'sxxzhthxo97'), +('c7fztqunxc3', 'kf2pq7s1ufm', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-04 01:06:32.99+00', '2021-09-04 01:06:32.99+00', 'xz80ys7oxso'), +('k8exffl1cx4', 'rfgbtm2lbsr', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:32.999+00', '2021-09-04 01:06:32.999+00', 'c7fztqunxc3'), +('l0xrx0dhurz', 'g018ex193ie', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_xmjn5cfl9co"}}', '0', 1, '2021-09-04 01:06:33.005+00', '2021-09-04 01:06:33.005+00', 'k8exffl1cx4'), +('v4rcswy3mqv', '3w9oxk85385', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-04 01:06:33.556+00', '2021-09-04 01:06:33.556+00', 'xz80ys7oxso'), +('gd5cil2c4xt', 'kp3benlmx4q', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:06:33.568+00', '2021-09-04 01:06:33.568+00', 'v4rcswy3mqv'), +('lkfoyyj2h4m', 'd6jqeoid0d5', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jbqopur80lk"}}', '0', 1, '2021-09-04 01:06:33.577+00', '2021-09-04 01:06:33.577+00', 'gd5cil2c4xt'), +('f60smhzm2xz', 'xv33l50137e', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-04 01:06:39.219+00', '2021-09-04 01:06:39.219+00', 'yjrydx6vdvm'), +('7y4ia047bi5', '77skwx14zex', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jdlw4uf6vfv"},"required":true}', '0', 1, '2021-09-04 01:06:32.021+00', '2021-09-04 01:06:54.866+00', '7v5o4r7466o'), +('py4esdjsyaw', 'y9rqhkp6sam', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lwyvh77c122"},"required":true}', '0', 1, '2021-09-04 01:06:27.978+00', '2021-09-04 01:06:43.764+00', '24goqxvwuel'), +('g6rkp8fls9m', '8102sgysegj', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_lov82rwvxgk"},"required":true}', '0', 1, '2021-09-04 01:06:29.631+00', '2021-09-04 01:06:46.99+00', 'e6wsxbftk55'), +('zc7zm8tm9s4', 'ltbtfkn8we1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n0snwtdes3r"},"required":true}', '0', 1, '2021-09-04 01:06:31.088+00', '2021-09-04 01:06:51.9+00', 'f60smhzm2xz'), +('qme4giyofs8', 'zrnm6uy9etl', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_n93qitmhzty","collectionName":"t_n93qitmhzty","defaultSort":["-ccdop3v4iqw"]}}', '0', 1, '2021-09-03 07:17:56.784+00', '2021-09-04 01:07:33.279+00', 'q9qjhqqboq4'), +('s577luywv6p', 'kh9slu1iyip', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_jdlw4uf6vfv"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 9, '2021-09-04 01:07:48.431+00', '2021-09-04 01:07:48.431+00', 'qme4giyofs8'), +('sqzqakfoutx', 'twj736vka0k', '更新记录', 'void', 'Tabs.TabPane', '{"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"solutionoutlined"}}', '0', 2, '2021-09-04 01:09:11.407+00', '2021-09-04 01:09:11.407+00', 'nphje2oqie7'), +('d4eihcknn6x', '8kqcnifiibc', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_jbqopur80lk"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 10, '2021-09-04 01:07:46.208+00', '2021-09-04 01:08:04.852+00', 'qme4giyofs8'), +('83qjip7kxmi', 'ks09dgzn8t9', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-04 01:09:11.416+00', '2021-09-04 01:09:11.416+00', 'sqzqakfoutx'), +('w0zqeitg53g', 'ccxnmv8k050', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-04 01:09:49.238+00', '2021-09-04 01:09:49.238+00', '83qjip7kxmi'), +('pzv6d6ksenp', 'g10p7mlegtf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:09:49.252+00', '2021-09-04 01:09:49.252+00', 'w0zqeitg53g'), +('fqym1tdw21b', 'hi2mp5o0dqj', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_jdlw4uf6vfv"}}', '0', 1, '2021-09-04 01:05:58.776+00', '2021-09-04 01:11:37.874+00', 'vxidy2p6yda'), +('2ysrr1sgqwt', 'yp6bpxwdxxh', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 3, '2021-09-04 01:06:10.36+00', '2021-09-04 01:11:37.889+00', '996rd4ydrib'), +('q6ycukhcd1m', 'x8z13x7w8wy', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:05:58.768+00', '2021-09-04 01:05:58.768+00', NULL), +('1n2o1ykc94b', '6f3j7cxf00x', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_u4i0jrp4uo6"}}', '0', 1, '2021-09-08 07:28:33.411+00', '2021-09-08 07:28:33.411+00', 'w97g6pgiozw'), +('mozw8ws430b', 'c55s5zkvody', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:28:57.389+00', '2021-09-08 07:28:57.389+00', 'h7vq1zhlfvp'), +('uqbwicpjq0l', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Table.SimpleDesignableBar","default":[],"x-component-props":{"useResource":"{{ Table.useActionLogsResource }}","collectionName":"action_logs","rowKey":"id","showIndex":true,"defaultSort":["-id"],"defaultAppends":["user","collection"],"refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-04 01:09:49.27+00', '2021-09-04 01:09:49.27+00', 'pzv6d6ksenp'), +('a2wncnlauvv', 'ahw1be2r266', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-04 01:09:49.277+00', '2021-09-04 01:09:49.277+00', 'uqbwicpjq0l'), +('lult0p6kdrw', '8uf0a58t0p5', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"left","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-04 01:09:49.283+00', '2021-09-04 01:09:49.283+00', 'a2wncnlauvv'), +('f17df8q1pzy', 'column1', '操作类型', 'void', 'Filter.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"operations":[{"label":"等于","value":"eq","selected":true,"schema":{"x-component":"Select"}},{"label":"不等于","value":"ne","schema":{"x-component":"Select"}},{"label":"包含","value":"in","schema":{"x-component":"Select","x-component-props":{"mode":"tags"}}},{"label":"不包含","value":"notIn","schema":{"x-component":"Select","x-component-props":{"mode":"tags"}}},{"label":"非空","value":"$notNull","noValue":true},{"label":"为空","value":"$null","noValue":true}]}}', '0', 1, '2021-09-04 01:09:49.293+00', '2021-09-04 01:09:49.293+00', 'lult0p6kdrw'), +('lqvuevs9f6e', 'type', NULL, 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 1, '2021-09-04 01:09:49.3+00', '2021-09-04 01:09:49.3+00', 'f17df8q1pzy'), +('jdovkm5la48', 'column1', '操作时间', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-04 01:09:49.318+00', '2021-09-04 01:09:49.318+00', 'uqbwicpjq0l'), +('widqzim9t1z', 'created_at', NULL, 'string', 'DatePicker', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"x-component-props":{"format":"YYYY-MM-DD HH:mm:ss"}}', '0', 1, '2021-09-04 01:09:49.327+00', '2021-09-04 01:09:49.327+00', 'jdovkm5la48'), +('gi6i6wxnbxa', 'column2', '操作用户', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 3, '2021-09-04 01:09:49.338+00', '2021-09-04 01:09:49.338+00', 'uqbwicpjq0l'), +('n4kefhfo7xe', 'user.nickname', NULL, 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true}', '0', 1, '2021-09-04 01:09:49.345+00', '2021-09-04 01:09:49.345+00', 'gi6i6wxnbxa'), +('sai37tfbv1x', 'column3', '数据表', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 4, '2021-09-04 01:09:49.358+00', '2021-09-04 01:09:49.358+00', 'uqbwicpjq0l'), +('1jyy188m4wa', 'collection.title', NULL, 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true}', '0', 1, '2021-09-04 01:09:49.365+00', '2021-09-04 01:09:49.365+00', 'sai37tfbv1x'), +('aj5l2mjzdxb', 'column4', '操作类型', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 5, '2021-09-04 01:09:49.377+00', '2021-09-04 01:09:49.377+00', 'uqbwicpjq0l'), +('dyrw60kdd2p', 'type', NULL, 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 1, '2021-09-04 01:09:49.389+00', '2021-09-04 01:09:49.389+00', 'aj5l2mjzdxb'), +('6if7lzkrume', 't4tamfzz358', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"width":60,"align":"center"}}', '0', 6, '2021-09-04 01:09:49.4+00', '2021-09-04 01:09:49.4+00', 'uqbwicpjq0l'), +('8bkpd1xhj07', 'o9c1h033n9v', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link","style":{"padding":"0","height":"auto"}},"x-action-type":"view"}', '0', 1, '2021-09-04 01:09:49.406+00', '2021-09-04 01:09:49.406+00', '6if7lzkrume'), +('vbnmf5sh27z', 'qq2415u35s2', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useActionLogDetailsResource }}"},"x-component-props":{}}', '0', 1, '2021-09-04 01:09:49.415+00', '2021-09-04 01:09:49.415+00', '8bkpd1xhj07'), +('1lm1n02i12g', 'created_at', '操作时间', 'string', 'DatePicker', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true,"x-component-props":{"format":"YYYY-MM-DD HH:mm:ss"}}', '0', 1, '2021-09-04 01:09:49.422+00', '2021-09-04 01:09:49.422+00', 'vbnmf5sh27z'), +('fm155fw7gtm', 'user.nickname', '操作用户', 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true}', '0', 2, '2021-09-04 01:09:49.432+00', '2021-09-04 01:09:49.432+00', 'vbnmf5sh27z'), +('xc724n88xgn', 'collection.title', '数据表', 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true}', '0', 3, '2021-09-04 01:09:49.445+00', '2021-09-04 01:09:49.445+00', 'vbnmf5sh27z'), +('3vx9a9kt3jc', 'type', '操作类型', 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true,"enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 4, '2021-09-04 01:09:49.456+00', '2021-09-04 01:09:49.456+00', 'vbnmf5sh27z'), +('r1m8822uids', 'changes', '数据变动', 'array', 'ArrayTable', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-component-props":{"pagination":false},"items":{"_isJSONSchemaObject":true,"version":"2.0","type":"object","properties":{"column0":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"width":80,"align":"center"},"properties":{"index":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Index","name":"index"}},"name":"column0"},"column1":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"字段名称"},"properties":{"field":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.Field","name":"field"}},"name":"column1"},"column3":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"操作前"},"properties":{"before":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.FieldValue","name":"before"}},"name":"column3"},"column4":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"操作后"},"properties":{"after":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.FieldValue","name":"after"}},"name":"column4"}}}}', '0', 5, '2021-09-04 01:09:49.467+00', '2021-09-04 01:09:49.467+00', 'vbnmf5sh27z'), +('vxidy2p6yda', 'evogvumfs6r', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-04 01:11:37.861+00', '2021-09-04 01:11:37.892+00', '996rd4ydrib'), +('wg9l8wt8fw0', 'eepiixl29ye', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"8ke6k4er30w"}}', '0', 1, '2021-09-08 07:28:28.453+00', '2021-09-08 07:28:28.453+00', '25d5jv4678c'), +('u26ejat4fth', 'ou46i76ytud', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-08 07:28:33.394+00', '2021-09-08 07:28:33.394+00', 'tj9c7vbrcib'), +('w97g6pgiozw', 'po2brogy67h', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:28:33.403+00', '2021-09-08 07:28:33.403+00', 'u26ejat4fth'), +('h7vq1zhlfvp', 'lnnc3mvwmxx', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-08 07:28:57.377+00', '2021-09-08 07:28:57.377+00', '4vjk2zw3u7d'), +('nwp1be3yr3v', 'o49n3fux7o0', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Calendar.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-08 07:28:57.398+00', '2021-09-08 07:28:57.398+00', 'mozw8ws430b'), +('ahgh1u3w8kx', 'fmup56jsha5', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-08 07:28:57.406+00', '2021-09-08 07:28:57.406+00', 'nwp1be3yr3v'), +('moqvunryqs8', '6has654tfxv', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-08 07:28:57.419+00', '2021-09-08 07:28:57.419+00', 'nwp1be3yr3v'), +('ecx6tsojqh6', 'ylnw14ttrin', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-08 07:29:05.227+00', '2021-09-08 07:29:05.227+00', 'moqvunryqs8'), +('f3g2nvepmae', 'e4epsnnjqbv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:29:05.239+00', '2021-09-08 07:29:05.239+00', 'ecx6tsojqh6'), +('dkrv5gprp6g', '8jhx89oem7a', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_u4i0jrp4uo6"}}', '0', 1, '2021-09-08 07:29:05.246+00', '2021-09-08 07:29:05.246+00', 'f3g2nvepmae'), +('15gxwkvqfzc', 'l20btw9gq21', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-08 07:29:08.052+00', '2021-09-08 07:29:08.052+00', 'moqvunryqs8'), +('ck47p3bbabj', 'v9gcpuapc7p', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:29:08.065+00', '2021-09-08 07:29:08.065+00', '15gxwkvqfzc'), +('zgjbnykkndz', 'l93in563lry', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-08 07:29:08.083+00', '2021-09-08 07:29:08.083+00', 'ck47p3bbabj'), +('bha10rq6g96', 'yxwpu6da0z6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:29:12.975+00', '2021-09-08 07:29:12.975+00', 'fvvdyd39o71'), +('w6axtww5a1u', 'v48a8vnkf49', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-08 07:29:06.331+00', '2021-09-08 07:29:12.989+00', 'bha10rq6g96'), +('fvvdyd39o71', '5quodzvwb9b', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-08 07:29:12.964+00', '2021-09-08 07:29:13.01+00', 'moqvunryqs8'), +('r11bmiojt9l', '9v9jmg4uqyn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:29:06.317+00', '2021-09-08 07:29:06.317+00', NULL), +('u2m5d5e68n0', NULL, '标题', 'string', 'Input', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 24, '2021-09-12 00:56:41.967+00', '2021-09-12 00:56:41.967+00', NULL), +('0tq5fymokmh', NULL, '描述', 'string', 'Input.TextArea', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 25, '2021-09-12 00:56:41.995+00', '2021-09-12 00:56:41.995+00', NULL), +('412w3sy7u91', NULL, '名称', 'array', 'Table', '{"x-decorator":"FormItem","x-component-props":{},"x-designable-bar":"Table.DesignableBar","enum":[]}', '0', 26, '2021-09-12 00:56:42.012+00', '2021-09-12 00:56:42.012+00', NULL), +('fkzlftn3o14', 't8vjwji8udd', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 00:57:02.598+00', '2021-09-12 00:57:02.598+00', 'xw9hxqfi06n'), +('bv71k1q4yvp', 'z4l7wiazy4e', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 00:57:07.746+00', '2021-09-12 00:57:07.746+00', 'fkzlftn3o14'), +('i1abz0a3dw2', 'e92wjomomt9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 00:57:07.759+00', '2021-09-12 00:57:07.759+00', 'bv71k1q4yvp'), +('hzrmdhjypsf', 'wjqqon0ocam', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"users","collectionName":"users"}}', '0', 1, '2021-09-12 00:57:07.772+00', '2021-09-12 00:57:07.772+00', 'i1abz0a3dw2'), +('nai5i8gl2n5', 'g46rhwjdihe', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 00:57:07.78+00', '2021-09-12 00:57:07.78+00', 'hzrmdhjypsf'), +('qi2bagnc54o', 'ixa25gf4v1a', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 00:57:07.787+00', '2021-09-12 00:57:07.787+00', 'nai5i8gl2n5'), +('sdzbz7a19qb', 'bpqs6one3i5', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 00:57:07.797+00', '2021-09-12 00:57:07.797+00', 'nai5i8gl2n5'), +('2ajsn2gbvde', '6b1vitu9mlw', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 00:57:07.807+00', '2021-09-12 00:57:07.807+00', 'nai5i8gl2n5'), +('oysejmvxfuk', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 00:57:07.815+00', '2021-09-12 00:57:07.815+00', '2ajsn2gbvde'), +('jrpuh9vtc6n', '8umqjk96she', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 00:57:07.828+00', '2021-09-12 00:57:07.828+00', 'oysejmvxfuk'), +('imqc1wkzxx3', 'o0xbq7zrji2', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 00:57:07.84+00', '2021-09-12 00:57:07.84+00', 'hzrmdhjypsf'), +('stivfufa62x', '0pcj1vt8a0i', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 00:57:07.848+00', '2021-09-12 00:57:07.848+00', 'imqc1wkzxx3'), +('38wqnbvxsnm', 'msib8drtu54', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 00:57:07.856+00', '2021-09-12 00:57:07.856+00', 'stivfufa62x'), +('t00oxqu2fer', 'y2k229z7rgr', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 00:57:07.864+00', '2021-09-12 00:57:07.864+00', '38wqnbvxsnm'), +('g10ys8ubnlj', 'ad97webn7mu', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 00:57:07.872+00', '2021-09-12 00:57:07.872+00', 't00oxqu2fer'), +('u9cgrrqx30v', 'p6ri656ococ', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 00:57:07.88+00', '2021-09-12 00:57:07.88+00', 'g10ys8ubnlj'), +('c6l3fe493su', 'xxx1fnwhq3q', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 00:57:07.886+00', '2021-09-12 00:57:07.886+00', 'u9cgrrqx30v'), +('xw9hxqfi06n', 'mqgmzlde3wc', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 00:57:02.588+00', '2021-09-12 00:57:02.588+00', NULL), +('zc57lr3dfgw', 'x2bwu51sttx', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-12 01:21:34.527+00', '2021-09-12 01:21:34.527+00', '8rp2l6eh3gi'), +('i7nwvszk1ul', 'ugthmqfq0mv', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 00:57:07.902+00', '2021-09-12 00:57:07.902+00', 'stivfufa62x'), +('r8xmho8ufys', '3ducyhkckzh', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 00:57:07.913+00', '2021-09-12 00:57:07.913+00', 'i7nwvszk1ul'), +('m2u2kmo6b67', 'qj4mpfwbrvt', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 00:57:07.919+00', '2021-09-12 00:57:07.919+00', 'r8xmho8ufys'), +('ozrz6h8zguv', 'syiv8jci7t2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_l6xhfn14zji"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 00:57:12.156+00', '2021-09-12 00:57:12.156+00', 'hzrmdhjypsf'), +('6zt8a6vfmeg', NULL, '添加时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 27, '2021-09-12 01:05:52.739+00', '2021-09-12 01:05:52.739+00', NULL), +('q1bwolkkq5w', NULL, '最后更新时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 28, '2021-09-12 01:05:52.758+00', '2021-09-12 01:05:52.758+00', NULL), +('si4x29vvkeb', NULL, '添加人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 29, '2021-09-12 01:05:52.775+00', '2021-09-12 01:05:52.775+00', NULL), +('g6fgjhxwqdt', NULL, '最后修改人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 30, '2021-09-12 01:05:52.794+00', '2021-09-12 01:05:52.794+00', NULL), +('u1767w73vdn', NULL, '添加时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 31, '2021-09-12 01:06:05.204+00', '2021-09-12 01:06:05.204+00', NULL), +('fmweeu589m9', NULL, '最后更新时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 32, '2021-09-12 01:06:05.219+00', '2021-09-12 01:06:05.219+00', NULL), +('bi9n4qdvvk2', NULL, '添加人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 33, '2021-09-12 01:06:05.234+00', '2021-09-12 01:06:05.234+00', NULL), +('dzc486mzccr', NULL, '最后修改人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 34, '2021-09-12 01:06:05.248+00', '2021-09-12 01:06:05.248+00', NULL), +('oo7ejuze28i', NULL, '添加时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 35, '2021-09-12 01:06:55.127+00', '2021-09-12 01:06:55.127+00', NULL), +('1l9qav1f97v', NULL, '最后更新时间', 'datetime', 'DatePicker', '{"x-component-props":{"dateFormat":"YYYY-MM-DD"},"x-read-pretty":true,"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 36, '2021-09-12 01:06:55.144+00', '2021-09-12 01:06:55.144+00', NULL), +('ya58lec57fp', NULL, '添加人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 37, '2021-09-12 01:06:55.16+00', '2021-09-12 01:06:55.16+00', NULL), +('k40ozwnisyr', NULL, '最后修改人', 'object', 'Select.Drawer', '{"x-component-props":{"fieldNames":{"value":"id","label":"nickname"}},"x-decorator":"FormItem","x-read-pretty":true,"x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 38, '2021-09-12 01:06:55.175+00', '2021-09-12 01:06:55.175+00', NULL), +('yo6wjwgsfx2', NULL, '下单时间', 'datetime', 'DatePicker', '{"x-component-props":{"showTime":true,"dateFormat":"YYYY-MM-DD","timeFormat":"HH:mm:ss"},"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 39, '2021-09-12 01:09:26.209+00', '2021-09-12 01:09:26.209+00', NULL), +('kmx147xwkrp', NULL, '顾客', 'array', 'Select.Drawer', '{"x-component-props":{},"x-decorator":"FormItem","x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 40, '2021-09-12 01:09:26.225+00', '2021-09-12 01:09:26.225+00', NULL), +('e5r226qqi20', NULL, '消费内容', 'string', 'Select', '{"x-decorator":"FormItem","x-designable-bar":"Select.DesignableBar","enum":[{"value":"i2xjqmnwrsu","label":"A套餐","color":"volcano"},{"value":"x4qnavatfai","label":"B套餐","color":"blue"},{"value":"tqgda8p724l","label":"C套餐","color":"purple"}]}', '0', 41, '2021-09-12 01:09:26.238+00', '2021-09-12 01:09:26.238+00', NULL), +('h73wygfixrg', NULL, '订单', 'array', 'Select.Drawer', '{"x-component-props":{"multiple":true},"x-decorator":"FormItem","x-designable-bar":"Select.Drawer.DesignableBar"}', '0', 42, '2021-09-12 01:09:26.265+00', '2021-09-12 01:09:26.265+00', NULL), +('wfa10dg0vyl', '0av8mj9jq3l', '全部订单', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"containeroutlined"}}', '0', 1, '2021-09-12 01:10:07.368+00', '2021-09-12 01:10:07.368+00', 'im4un32remd'), +('r16pf88chlh', '0sf7awkbbay', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 01:10:07.376+00', '2021-09-12 01:10:07.376+00', 'wfa10dg0vyl'), +('ogl7n8xeh4g', 'pu8svnfaae7', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 01:10:07.384+00', '2021-09-12 01:10:07.384+00', 'r16pf88chlh'), +('ndkbn5dqzs4', 'i9vlphwxml2', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:10:12.033+00', '2021-09-12 01:10:12.033+00', 'i8maupbyrqr'), +('tv41iuflns0', 'hi1m7gvp1nz', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 01:10:12.056+00', '2021-09-12 01:10:12.056+00', 'ndkbn5dqzs4'), +('im4un32remd', '0t3ogc8kqam', '订单', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"fileaddoutlined"}}', '0', 7, '2021-09-12 01:09:53.21+00', '2021-09-14 00:34:37.383+00', 'qqzzjakwkwl'), +('sjc5uxxtwkm', 'lve0bb7tpqo', NULL, 'void', 'Grid.Row', '{"version":"2.0","x-component-props":{"colsize":[72.79090113735784,27.296587926509186]}}', '0', 1, '2021-09-12 01:10:12.008+00', '2021-09-12 07:39:03.824+00', 'ogl7n8xeh4g'), +('hna5hq4l38r', 'lg8lkzm49l6', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 01:10:12.074+00', '2021-09-12 01:10:12.074+00', 'ndkbn5dqzs4'), +('5f7lkzu3hda', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 01:10:12.08+00', '2021-09-12 01:10:12.08+00', 'hna5hq4l38r'), +('3gtya6xukdi', '1k0o6ibj6cf', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:10:12.085+00', '2021-09-12 01:10:12.085+00', '5f7lkzu3hda'), +('xdxjz31ekds', '89dintqhzl6', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 01:10:12.103+00', '2021-09-12 01:10:12.103+00', 'i8maupbyrqr'), +('yd9talr3lrb', 'qkzrcqwmldu', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 01:10:12.109+00', '2021-09-12 01:10:12.109+00', 'xdxjz31ekds'), +('grfgh95t4rk', 'k969jftku2c', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:10:12.136+00', '2021-09-12 01:10:12.136+00', '7ds90qryerh'), +('au8xgar9tv5', '4aimv3nkr7e', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:10:12.144+00', '2021-09-12 01:10:12.144+00', 'grfgh95t4rk'), +('t3k2jym57q1', 'dtezto2qffv', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 01:10:12.158+00', '2021-09-12 01:10:12.158+00', 'yd9talr3lrb'), +('hcmzrfmx94r', '5livvlkcu7p', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 01:10:12.164+00', '2021-09-12 01:10:12.164+00', 't3k2jym57q1'), +('dzo9zrof056', 'yo69qf1u3r9', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:10:12.171+00', '2021-09-12 01:10:12.171+00', 'hcmzrfmx94r'), +('m4ltb1ya67k', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-12 01:10:20.723+00', '2021-09-12 01:10:20.723+00', 'qtwdtjhe0xe'), +('w6ozkcwqb97', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 01:10:20.731+00', '2021-09-12 01:10:20.731+00', 'm4ltb1ya67k'), +('jewwt4qkrlg', '57wg4wfrqzb', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:10:20.738+00', '2021-09-12 01:10:20.738+00', 'w6ozkcwqb97'), +('nqokibplz6f', '213pbt40t09', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 01:10:20.746+00', '2021-09-12 01:10:20.746+00', 'jewwt4qkrlg'), +('2veqbkhmx6h', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 01:10:20.762+00', '2021-09-12 01:10:20.762+00', 'qtwdtjhe0xe'), +('yh2o0ihutor', 's6wc9n5hne0', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:10:20.769+00', '2021-09-12 01:10:20.769+00', '2veqbkhmx6h'), +('tvxex3cts8i', '8ko0o9knyzh', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:10:20.79+00', '2021-09-12 01:10:20.79+00', '6q2ge2n723q'), +('6chv7wh9gy9', 'wd7t4yuzxpo', '全部顾客', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"teamoutlined"}}', '0', 1, '2021-09-12 01:11:03.872+00', '2021-09-12 01:11:03.872+00', 'k33sn747t75'), +('o9zz2vpi0k0', 'r82gfts72fy', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 01:11:03.884+00', '2021-09-12 01:11:03.884+00', '6chv7wh9gy9'), +('fyku58l8svs', 'ag10guls97u', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 01:11:03.894+00', '2021-09-12 01:11:03.894+00', 'o9zz2vpi0k0'), +('k33sn747t75', 'toiptec9ecn', '顾客', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"teamoutlined"}}', '0', 6, '2021-09-12 01:10:51.674+00', '2021-09-12 12:16:08.436+00', 'qqzzjakwkwl'), +('aslfo2li593', 'spsl8qelznn', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:11:33.883+00', '2021-09-12 01:11:33.883+00', 'm25pry2yof2'), +('6q2ge2n723q', '80gmfnxvnda', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"containeroutlined"}}', '0', 1, '2021-09-12 01:10:20.784+00', '2021-09-12 01:54:55.575+00', 'drueiy5hn0w'), +('m25pry2yof2', 'gwrhxxovbta', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269"}}', '0', 2, '2021-09-12 01:11:33.873+00', '2021-09-23 02:53:57.411+00', 'tbrkw7j67dv'), +('v5daj7h03f7', 'rezhf02g51m', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 01:10:20.244+00', '2021-09-12 07:38:57.619+00', 'i8maupbyrqr'), +('7ds90qryerh', 'wms4h2zzwka', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 01:10:12.129+00', '2021-09-14 02:53:59.028+00', 'eq8ty1c1ldv'), +('eq8ty1c1ldv', 'bqnsqblyxd0', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:10:12.122+00', '2021-09-12 01:10:12.122+00', NULL), +('drueiy5hn0w', 'hqzrnwubybg', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 01:10:20.776+00', '2021-09-14 03:14:35.99+00', 'yh2o0ihutor'), +('53mjk8nwktv', 'pjmurqm2xzn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:11:33.862+00', '2021-09-12 01:11:33.862+00', NULL), +('f9bihqdzwoi', 'gc9yhrw3oom', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 01:11:33.904+00', '2021-09-12 01:11:33.904+00', 'aslfo2li593'), +('2k28iunkmjw', 'w0n0kctetxb', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 01:11:33.915+00', '2021-09-12 01:11:33.915+00', 'aslfo2li593'), +('777gho3ucdd', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 01:11:33.927+00', '2021-09-12 01:11:33.927+00', '2k28iunkmjw'), +('22witz3g5qp', 'gobvb7mfrb8', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:11:33.935+00', '2021-09-12 01:11:33.935+00', '777gho3ucdd'), +('9howq9m8gs1', 'glmomd8yq21', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 01:11:33.961+00', '2021-09-12 01:11:33.961+00', 'bceywyhrjmk'), +('iaxzbfxslth', 'osjcqk398jr', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 01:11:33.967+00', '2021-09-12 01:11:33.967+00', '9howq9m8gs1'), +('5pg2jxcphsc', 'fp5t45pemhg', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:11:33.976+00', '2021-09-12 01:11:33.976+00', 'iaxzbfxslth'), +('q282cw6jjk1', 'bvgwjuwfxd1', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 01:11:33.984+00', '2021-09-12 01:11:33.984+00', '5pg2jxcphsc'), +('jf4rvr8ev5h', '4miguuscpb8', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:11:33.997+00', '2021-09-12 01:11:33.997+00', 'hczibotbvz2'), +('7b0s6zupndc', 'kjv1si32czw', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 01:11:34.017+00', '2021-09-12 01:11:34.017+00', '9howq9m8gs1'), +('yb2zg16i1km', '429ybajjur9', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 01:11:34.026+00', '2021-09-12 01:11:34.026+00', '7b0s6zupndc'), +('6z1xnufz6qe', '1s4smmvwe93', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:11:34.032+00', '2021-09-12 01:11:34.032+00', 'yb2zg16i1km'), +('r9i0nuz6gaa', NULL, '姓名', 'string', 'Input', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 43, '2021-09-12 01:13:43.207+00', '2021-09-12 01:13:43.207+00', NULL), +('d0vxh9zspr0', NULL, '手机号码', 'string', 'Input', '{"x-decorator":"FormItem","x-validator":"phone","x-designable-bar":"Input.DesignableBar"}', '0', 44, '2021-09-12 01:13:43.225+00', '2021-09-12 01:13:43.225+00', NULL), +('cntdgyegzk1', NULL, '性别', 'string', 'Radio.Group', '{"x-decorator":"FormItem","x-designable-bar":"Radio.DesignableBar","enum":[{"value":"khan8z430yx","label":"男","color":"geekblue"},{"value":"59khrisonj6","label":"女","color":"orange"}]}', '0', 45, '2021-09-12 01:13:43.244+00', '2021-09-12 01:13:43.244+00', NULL), +('wy9l25k1k8n', NULL, '生日', 'datetime', 'DatePicker', '{"x-component-props":{"showTime":false,"dateFormat":"YYYY-MM-DD"},"x-decorator":"FormItem","x-designable-bar":"DatePicker.DesignableBar"}', '0', 46, '2021-09-12 01:13:43.265+00', '2021-09-12 01:13:43.265+00', NULL), +('mz5lwuvl3ne', NULL, '合同资料', 'array', 'Upload.Attachment', '{"x-decorator":"FormItem","x-designable-bar":"Upload.DesignableBar","x-component-props":{"multiple":true}}', '0', 47, '2021-09-12 01:13:43.301+00', '2021-09-12 01:13:43.301+00', NULL), +('ic1crmml3ww', NULL, '备注', 'string', 'Input.TextArea', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 48, '2021-09-12 01:13:43.32+00', '2021-09-12 01:13:43.32+00', NULL), +('vc7jvb0em51', '2rpzzkdngbo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:14:15.956+00', '2021-09-12 01:14:15.956+00', '22witz3g5qp'), +('wtuhk4bann5', 'fmm03j2mt8v', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:14:15.963+00', '2021-09-12 01:14:15.963+00', 'vc7jvb0em51'), +('hluydy0pi2o', 'r22lpqhyzsx', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-12 01:14:18.807+00', '2021-09-12 01:14:18.807+00', '22witz3g5qp'), +('apabsv0yg2q', '1g6uvocosd6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:14:17.511+00', '2021-09-12 01:14:17.511+00', NULL), +('dubqcfoeq15', 'woed7vfczcb', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 01:13:49.002+00', '2021-09-26 01:40:11.789+00', 'm25pry2yof2'), +('hczibotbvz2', 'jbs3r05u50o', '资料', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"useroutlined"}}', '0', 1, '2021-09-12 01:11:33.99+00', '2021-09-12 01:23:28.504+00', 'q282cw6jjk1'), +('jmz9esp7c20', '25buhserozn', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"},"required":true}', '0', 1, '2021-09-12 01:14:17.518+00', '2021-09-12 01:17:46.58+00', 'b5vjs506lyu'), +('yvspx17cglv', 'dmmbrg2jlqg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:06:26.454+00', '2021-09-14 01:06:26.454+00', NULL), +('1jedgeo94xg', 'py477djvyjy', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 03:16:16.382+00', '2021-09-14 03:16:16.382+00', '4tbaimvtzis'), +('5wmi74rpmj6', 'vp0wppz6qtv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:16.391+00', '2021-09-14 03:16:16.391+00', '1jedgeo94xg'), +('0qm1vj5t0dn', 'iiyz49vv29u', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 03:16:16.397+00', '2021-09-14 03:16:16.397+00', '5wmi74rpmj6'), +('bceywyhrjmk', 'ljudn2t3cp8', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 3, '2021-09-12 01:11:33.953+00', '2021-09-17 07:43:29.625+00', 'm25pry2yof2'), +('6yt6ty5gkhr', 'u1nzo8wa5qs', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:14:21.002+00', '2021-09-12 01:14:21.002+00', '1swy4yztzes'), +('79g2vkwum4c', 'h4dbd1dvt4t', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-12 01:14:21.009+00', '2021-09-12 01:14:21.009+00', '6yt6ty5gkhr'), +('4xzjetbp5tc', 'cuqc88t2ma9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:14:21.505+00', '2021-09-12 01:14:21.505+00', '21khaxi97r3'), +('8b4uwbnbf26', 'g0bltxjxqmm', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-12 01:14:21.512+00', '2021-09-12 01:14:21.512+00', '4xzjetbp5tc'), +('nfe18h31k3u', 'uj1z5cjz0yn', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"},"required":true}', '0', 1, '2021-09-12 01:14:15.969+00', '2021-09-12 01:14:26.436+00', 'wtuhk4bann5'), +('anwph5e5kub', 'l9dru06qm0k', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:29.49+00', '2021-09-12 01:21:29.49+00', '19hvzgb1jz5'), +('oyzz4l3hdz0', 'ydm5d3avyyz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:14:19.966+00', '2021-09-12 01:14:19.966+00', NULL), +('zvd6gh9ikuu', 'fgd5nncqm6s', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"},"required":true}', '0', 1, '2021-09-12 01:14:18.826+00', '2021-09-12 01:15:02.149+00', 'enwykdtf64o'), +('enwykdtf64o', '6tvz4juk4km', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 01:15:02.142+00', '2021-09-12 01:15:02.164+00', 'vc7jvb0em51'), +('0jxb4dmrc1x', 'a353elbncoc', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"},"required":true}', '0', 1, '2021-09-12 01:17:29.67+00', '2021-09-12 01:18:08.981+00', '7t77ao8zf3y'), +('2h9pf1b6olk', '9o4lf7kfp0o', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-12 01:14:19.975+00', '2021-09-12 01:15:08.468+00', 'a3lfj4ufg57'), +('a3lfj4ufg57', '8l8m8wufce1', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-12 01:15:08.455+00', '2021-09-12 01:15:08.483+00', 'hluydy0pi2o'), +('zncs2fmi3md', NULL, '会员等级', 'string', 'Select', '{"x-decorator":"FormItem","x-designable-bar":"Select.DesignableBar","enum":[{"value":"z7wq1mkwmmx","label":"拂晓会员","color":"blue"},{"value":"plcxasw2xrs","label":"日暮会员","color":"orange"},{"value":"e3fb46gnarj","label":"青柠会员","color":"lime"},{"value":"h5cxo6g48lj","label":" 酱紫会员","color":"purple"}]}', '0', 49, '2021-09-12 01:17:01.049+00', '2021-09-12 01:17:01.049+00', NULL), +('o21p57oi4ci', NULL, '地址', 'array', 'Cascader', '{"x-component-props":{"changeOnSelectLast":false,"loadData":"{{ ChinaRegion.loadData() }}","labelInValue":true,"maxLevel":3,"fieldNames":{"label":"name","value":"code","children":"children"}},"x-reactions":["{{ChinaRegion.useFieldValue}}","{{useAsyncDataSource(ChinaRegion.loadDataSource())}}"],"x-decorator":"FormItem","x-designable-bar":"Cascader.DesignableBar"}', '0', 50, '2021-09-12 01:17:01.065+00', '2021-09-12 01:17:01.065+00', NULL), +('y9pc4sua6q7', '0wicv1in4co', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 3, '2021-09-23 02:53:11.395+00', '2021-09-23 02:53:16.615+00', 'k50qsygrdju'), +('cexqu9aljyo', 'viqzudzapsd', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-12 01:21:29.499+00', '2021-09-12 01:21:29.499+00', 'anwph5e5kub'), +('atinc1dlozk', 'gtwsrd24pwu', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:17:30.204+00', '2021-09-12 01:17:30.204+00', NULL), +('b5vjs506lyu', 'ommvztbfurm', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:17:46.573+00', '2021-09-12 01:17:46.573+00', 'vzcuhg55sn3'), +('1swy4yztzes', '3ozjaernleo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-12 01:14:20.995+00', '2021-09-12 01:17:46.595+00', '22witz3g5qp'), +('21khaxi97r3', 'iazoviy990a', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-12 01:14:21.499+00', '2021-09-12 01:17:46.595+00', '22witz3g5qp'), +('7t77ao8zf3y', 'cc1np91buct', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', -1, '2021-09-12 01:18:08.972+00', '2021-09-12 01:18:09+00', 'hluydy0pi2o'), +('vzcuhg55sn3', 'outlv9mq1ez', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-12 01:17:46.564+00', '2021-09-12 01:17:46.598+00', '22witz3g5qp'), +('74jdmf7htme', 'o81z6jliczi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:17:29.66+00', '2021-09-12 01:17:29.66+00', NULL), +('8rbqppijo6v', '65q04heh01j', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-12 01:17:30.21+00', '2021-09-12 01:18:11.496+00', '4qzisdp3fpx'), +('4qzisdp3fpx', 'yvhd3j8evvg', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-12 01:18:11.486+00', '2021-09-12 01:18:11.509+00', 'vzcuhg55sn3'), +('nf32jixkuac', 'voz2fj5gb3o', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:21:26.386+00', '2021-09-12 01:21:26.386+00', 'jf4rvr8ev5h'), +('cz06k9ro7eh', 'gzu1yd9dch2', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:26.396+00', '2021-09-12 01:21:26.396+00', 'nf32jixkuac'), +('vvg3uj45z6k', 'urdf0zcwjvb', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-12 01:21:26.403+00', '2021-09-12 01:21:26.403+00', 'cz06k9ro7eh'), +('70pez9j2s6n', 'tgqdvnnb6ko', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:21:26.412+00', '2021-09-12 01:21:26.412+00', 'vvg3uj45z6k'), +('blgc7o07897', '5iunrh4nymu', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-12 01:21:26.42+00', '2021-09-12 01:21:26.42+00', 'vvg3uj45z6k'), +('19hvzgb1jz5', 'gw6shks3mcb', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:21:29.484+00', '2021-09-12 01:21:29.484+00', 'blgc7o07897'), +('i4ffmbtsbk9', 'oxw4vj4y9pw', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-12 01:21:33.991+00', '2021-09-12 01:21:33.991+00', 'blgc7o07897'), +('8v7bi9r7q6h', '0t8uvcph9gw', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:33.999+00', '2021-09-12 01:21:33.999+00', 'i4ffmbtsbk9'), +('3lo11hxgzke', 'ibwnjqstl1i', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-12 01:21:34.006+00', '2021-09-12 01:21:34.006+00', '8v7bi9r7q6h'), +('n02x4dcefxx', '06q5l8obr24', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-12 01:21:34.505+00', '2021-09-12 01:21:34.505+00', 'blgc7o07897'), +('cvwb42tx2ro', '5ddxcinqdo5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:32.528+00', '2021-09-12 01:21:32.528+00', NULL), +('r07c2nk7bth', 'ledjnkq83io', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:34:59.866+00', '2021-09-14 02:34:59.866+00', NULL), +('e4ylnpoef0i', 'b3tplj340ns', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:40:45.828+00', '2021-09-14 02:40:45.828+00', 'm3g53ifw6yn'), +('rhkqkgcyox9', 'svz85x018xm', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-12 01:21:38.501+00', '2021-09-12 01:21:38.501+00', 'blgc7o07897'), +('qsbw5i7m5dy', 'znlrxcz1znf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:38.508+00', '2021-09-12 01:21:38.508+00', 'rhkqkgcyox9'), +('e3v3ll2nyrp', 'u3unof4xym6', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-12 01:21:38.514+00', '2021-09-12 01:21:38.514+00', 'qsbw5i7m5dy'), +('yw67h0a57nh', 'si4gdea160t', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-12 01:21:39.121+00', '2021-09-12 01:21:39.121+00', 'blgc7o07897'), +('nuntw5bi3bz', 'wsik8zl0ex2', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:39.132+00', '2021-09-12 01:21:39.132+00', 'yw67h0a57nh'), +('9x1nmfi9uaa', '0c8lgbpso1n', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-12 01:21:39.148+00', '2021-09-12 01:21:39.148+00', 'nuntw5bi3bz'), +('ji78aeg27tl', 'fdh5e0f100k', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:21:56.183+00', '2021-09-12 01:21:56.183+00', '6z1xnufz6qe'), +('z75wbl9gpf6', 'og2kvbj720t', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:56.2+00', '2021-09-12 01:21:56.2+00', 'ji78aeg27tl'), +('oq5shoaso6r', 'sib1bq6zhbg', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-12 01:21:57.613+00', '2021-09-12 01:21:57.613+00', '6z1xnufz6qe'), +('tdvgxfkjzbk', 'r52wsttca2z', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:58.471+00', '2021-09-12 01:21:58.471+00', 'hcxvjjp01rm'), +('e9frsg4c2wh', 'sejbpe89y2r', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-12 01:21:58.477+00', '2021-09-12 01:21:58.477+00', 'tdvgxfkjzbk'), +('xlebz4fihz2', 'jyh7slauicz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:59.549+00', '2021-09-12 01:21:59.549+00', '43igy4t356y'), +('q2vpumk541b', 'lbc1a7nb2pf', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-12 01:21:59.556+00', '2021-09-12 01:21:59.556+00', 'xlebz4fihz2'), +('uau6m00lv7v', 'ny9hno0fa1u', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"collectionName":"t_geso7fru7a9","resourceName":"f_c8mes0kp1zt","associatedName":"t_fsveob6p269","useResource":"{{ Association.useResource }}"}}', '0', 1, '2021-09-12 01:22:53.405+00', '2021-09-12 01:22:53.405+00', 'hiioacy62iu'), +('cmskpxawxvh', 'mbedjlcosxo', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:22:53.505+00', '2021-09-12 01:22:53.505+00', 'uau6m00lv7v'), +('hiioacy62iu', 'z4n8nwj46ce', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:22:53.394+00', '2021-09-12 01:22:53.394+00', NULL), +('e142txpgx00', '0h3d7jwyme5', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:23:35.373+00', '2021-09-12 01:23:35.373+00', 'h1whr84k5bq'), +('tv8m71uw1py', 'zlo21ovic7a', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:36.389+00', '2021-09-12 01:21:36.389+00', NULL), +('h1whr84k5bq', '7rxij2t1px8', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 01:23:35.367+00', '2021-09-14 03:01:12.768+00', 'ius64go0no5'), +('nm95mjnpjxo', 'cmpbe3oa5e9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:37.364+00', '2021-09-12 01:21:37.364+00', NULL), +('m0yshj16enj', 'x928sncgk8b', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"},"required":true}', '0', 1, '2021-09-12 01:21:57.632+00', '2021-09-12 01:30:48.51+00', 'k1rywkn2rsl'), +('02e3umxvucf', 'hrz142bynrx', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:57.092+00', '2021-09-12 01:21:57.092+00', NULL), +('eh2cndbd9a0', 'dze15prtjfc', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-12 01:21:37.371+00', '2021-09-14 01:06:56.363+00', 'jmid3ozvdyd'), +('wcfxdvqp3x5', 'tfsqxjjmlmi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:59.954+00', '2021-09-12 01:21:59.954+00', NULL), +('l9a4k7bdzl7', 't0a56k3okhm', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-12 01:21:58.018+00', '2021-09-12 01:30:06.472+00', 'oela9g3zkms'), +('ya7p8753vce', 'puvlxbvz13o', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"},"required":true}', '0', 1, '2021-09-12 01:21:57.099+00', '2021-09-12 01:30:42.545+00', 'bywtw8gm0lg'), +('cakd89kovzv', 'uktno9vzqw1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:21:58.009+00', '2021-09-12 01:21:58.009+00', NULL), +('nxdfki439tg', 'ltigy2sbdcc', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-12 01:22:00.386+00', '2021-09-12 01:30:09.272+00', 'v5uk0kpexp1'), +('hcxvjjp01rm', '4r3nynkszm4', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-12 01:21:58.462+00', '2021-09-12 01:30:09.292+00', '6z1xnufz6qe'), +('43igy4t356y', '7ogvf6jb2y5', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-12 01:21:59.54+00', '2021-09-12 01:30:09.292+00', '6z1xnufz6qe'), +('b6huhuwlc6c', '1psnwb9curs', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:22:00.373+00', '2021-09-12 01:22:00.373+00', NULL), +('6m4qvt6rhc3', 'p1m6uvve5fw', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"},"required":true}', '0', 1, '2021-09-12 01:21:56.208+00', '2021-09-12 01:30:40.92+00', 'z75wbl9gpf6'), +('oelsj9cxstj', 'lklvtvx4gkf', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"},"required":true}', '0', 1, '2021-09-12 01:21:59.963+00', '2021-09-12 01:30:44.182+00', 'lok088drns4'), +('efn57tegqi3', 'sfyv9yk1ovs', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 01:22:53.651+00', '2021-09-12 01:22:53.651+00', 'cmskpxawxvh'), +('yp55u0dmo91', 'iqhen4kug2s', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 01:22:53.661+00', '2021-09-12 01:22:53.661+00', 'cmskpxawxvh'), +('augi3fn809b', '9o5x6zijl1b', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 01:22:53.67+00', '2021-09-12 01:22:53.67+00', 'cmskpxawxvh'), +('37ag2od1d8j', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 01:22:53.676+00', '2021-09-12 01:22:53.676+00', 'augi3fn809b'), +('0v607mzykm0', 'rfjd4xmkz6h', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:22:53.683+00', '2021-09-12 01:22:53.683+00', '37ag2od1d8j'), +('94oll3bw97c', 'p51emqtoyf9', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 01:22:53.7+00', '2021-09-12 01:22:53.7+00', 'uau6m00lv7v'), +('dllmlkcte63', 'gm85aslpc1p', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 01:22:53.708+00', '2021-09-12 01:22:53.708+00', '94oll3bw97c'), +('zvbpcwnauno', 'opqh0c2425o', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 01:22:53.718+00', '2021-09-12 01:22:53.718+00', 'dllmlkcte63'), +('m53qozeneda', 'olbpwwligz3', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:22:53.725+00', '2021-09-12 01:22:53.725+00', 'zvbpcwnauno'), +('w5jgb1kpp88', '2i4ypmo6nqy', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 01:22:53.732+00', '2021-09-12 01:22:53.732+00', 'm53qozeneda'), +('abs1goya1lr', '56gvpkzreg4', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:22:53.74+00', '2021-09-12 01:22:53.74+00', 'w5jgb1kpp88'), +('8pi513m1okg', 'c72oyvad6f7', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:22:53.748+00', '2021-09-12 01:22:53.748+00', 'abs1goya1lr'), +('nxlpgf86bw3', 'rg3ub0sp8co', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 01:22:53.771+00', '2021-09-12 01:22:53.771+00', 'dllmlkcte63'), +('zb03lq3dmvd', '1lk8e6e997w', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 01:22:53.777+00', '2021-09-12 01:22:53.777+00', 'nxlpgf86bw3'), +('2djq2hcfogn', 'qofycnimy95', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:22:53.786+00', '2021-09-12 01:22:53.786+00', 'zb03lq3dmvd'), +('v4mbsb1a0up', 'sc8k8adjuxy', '订单', 'void', 'Tabs.TabPane', '{"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"containeroutlined"}}', '0', 2, '2021-09-12 01:23:17.224+00', '2021-09-12 01:23:17.224+00', 'q282cw6jjk1'), +('b61xvujsfh3', '77zz0vrbhkj', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:23:17.232+00', '2021-09-12 01:23:17.232+00', 'v4mbsb1a0up'), +('z1268ra0tr2', 'qbgk9ghfowl', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:23:35.097+00', '2021-09-12 01:23:35.097+00', 'b61xvujsfh3'), +('ugv0r28257r', '9b04icvmrx3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:23:35.107+00', '2021-09-12 01:23:35.107+00', 'z1268ra0tr2'), +('7noddgavw9a', 'fyj2vrfeygq', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:23:35.259+00', '2021-09-12 01:23:35.259+00', 'l2uq7pgdrht'), +('zmglva0osa6', 'rb4qaopia8b', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:23:35.318+00', '2021-09-12 01:23:35.318+00', 'txo05vnvkml'), +('e24uwkfa1ij', 'v7tzl73m4pn', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 01:23:35.341+00', '2021-09-12 01:23:35.341+00', 'l2uq7pgdrht'), +('b8h6m1a0b0i', 'lhwj3rxvwun', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 01:23:35.348+00', '2021-09-12 01:23:35.348+00', 'e24uwkfa1ij'), +('txo05vnvkml', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 01:23:35.31+00', '2021-09-12 01:23:35.31+00', NULL), +('ius64go0no5', '393mnzsyvl4', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:23:35.361+00', '2021-09-12 01:23:35.361+00', NULL), +('ac8hulvrzph', 'ec83njwcxbh', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:23:35.383+00', '2021-09-12 01:23:35.383+00', 'e142txpgx00'), +('u0dsigvg0sx', 'et6kwq0nyby', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 01:23:35.418+00', '2021-09-12 01:23:35.418+00', 'gag61cozr0o'), +('h8elgw485c0', 'wk22p6fae33', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:24:20.6+00', '2021-09-12 01:24:20.6+00', 'xz87tw0xkbj'), +('ltatx1gexrw', 'zmagbbdzxp3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:24:21.003+00', '2021-09-12 01:24:21.003+00', 'pit19i41iow'), +('bmfng1sn6od', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-12 01:24:21.023+00', '2021-09-12 01:24:21.023+00', '0ta9xk8f2pm'), +('0s69s3n7w0z', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 01:24:21.031+00', '2021-09-12 01:24:21.031+00', 'bmfng1sn6od'), +('o9psolreeej', 'q61lywq58gg', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:24:21.041+00', '2021-09-12 01:24:21.041+00', '0s69s3n7w0z'), +('rtxorr7wdal', 'segyrbv5eke', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 01:24:21.054+00', '2021-09-12 01:24:21.054+00', 'o9psolreeej'), +('nm5dfs0rgds', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 01:24:21.074+00', '2021-09-12 01:24:21.074+00', '0ta9xk8f2pm'), +('yyqbjy7dn8n', '9ojblmi2o7m', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:24:21.082+00', '2021-09-12 01:24:21.082+00', 'nm5dfs0rgds'), +('ywufiodzk4k', 'eu89fa5km7k', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 01:24:21.089+00', '2021-09-12 01:24:21.089+00', 'yyqbjy7dn8n'), +('xf7nssi5fl8', '37ey2f1yus4', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:24:21.095+00', '2021-09-12 01:24:21.095+00', 'ywufiodzk4k'), +('e50x62s7azv', 'fumjk94va5d', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:24:21.104+00', '2021-09-12 01:24:21.104+00', 'xf7nssi5fl8'), +('28dzsq4laoi', 'kruv1g035am', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:24:21.852+00', '2021-09-12 01:24:21.852+00', '81hr4bigan1'), +('8s9i0yj0wbc', 'k4l5px2jmg1', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 01:25:48.678+00', '2021-09-12 01:25:48.678+00', '19hvzgb1jz5'), +('fjsz2gs4rnv', 'ecz449ziaby', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-12 01:21:32.543+00', '2021-09-12 01:25:48.695+00', '8s9i0yj0wbc'), +('sotljynqmed', '8ic8a8fcfar', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-12 01:21:36.394+00', '2021-09-12 01:26:03.992+00', 'whd102dqqx0'), +('whd102dqqx0', '3h8ko0bsb36', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-12 01:26:03.978+00', '2021-09-12 01:26:04.007+00', 'i4ffmbtsbk9'), +('0ta9xk8f2pm', 'zesiqbggbk1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-12 01:24:21.011+00', '2021-09-14 02:02:15.096+00', 'ltatx1gexrw'), +('gag61cozr0o', 'whvvq1w2w8q', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 01:23:35.411+00', '2021-09-12 01:23:35.411+00', NULL), +('bywtw8gm0lg', 'x5iccc2aowi', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 01:29:58.241+00', '2021-09-12 01:29:58.241+00', 'ji78aeg27tl'), +('lok088drns4', 'fu2qnwgzqy8', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-12 01:30:03.08+00', '2021-09-12 01:30:03.113+00', 'oq5shoaso6r'), +('oela9g3zkms', 'pwnovm1ooyu', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 1, '2021-09-12 01:30:06.464+00', '2021-09-12 01:30:06.494+00', 'oq5shoaso6r'), +('v5uk0kpexp1', '6ku3qv725hc', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:30:09.263+00', '2021-09-12 01:30:09.263+00', 'u0yzvj1jwg4'), +('u0yzvj1jwg4', '8tuhlzjgfig', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-12 01:30:09.253+00', '2021-09-12 01:30:09.296+00', '6z1xnufz6qe'), +('k1rywkn2rsl', 'z5ejbmapedi', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 01:30:11.43+00', '2021-09-12 01:30:11.43+00', 'u0yzvj1jwg4'), +('q9n340uebz5', '4761vjxpegw', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-12 01:24:20.61+00', '2021-09-14 02:02:07.443+00', 'h8elgw485c0'), +('xl5y914i1s9', 'tz5okdlnp7c', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 01:23:47.674+00', '2021-09-14 03:01:50.45+00', 'l2uq7pgdrht'), +('pwbqkiw66bv', 'xhx3fhtfywp', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-12 01:24:21.863+00', '2021-09-14 02:02:18.45+00', '28dzsq4laoi'), +('bynbs9pu3jd', '3nn4vi8zpcw', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 01:23:48.188+00', '2021-09-14 03:01:50.45+00', 'l2uq7pgdrht'), +('hg7yi3bwgwo', 't05rtv5ctoi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:27.002+00', '2021-09-12 07:34:27.002+00', NULL), +('dnm8gsjd5pk', 'n6vvzxrel39', '更新记录', 'void', 'Tabs.TabPane', '{"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{"icon":"cloudserveroutlined"}}', '0', 3, '2021-09-12 01:31:26.25+00', '2021-09-12 01:31:26.25+00', 'q282cw6jjk1'), +('zmclu94kshw', '1t3a051ip5t', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:31:26.268+00', '2021-09-12 01:31:26.268+00', 'dnm8gsjd5pk'), +('gj9wedlk24u', 'pnngioacq1v', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 01:31:30.274+00', '2021-09-12 01:31:30.274+00', 'zmclu94kshw'), +('crkujrzrajo', 'y4mpcfti73o', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:31:30.288+00', '2021-09-12 01:31:30.288+00', 'gj9wedlk24u'), +('jk6hplao83m', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Table.SimpleDesignableBar","default":[],"x-component-props":{"useResource":"{{ Table.useActionLogsResource }}","collectionName":"action_logs","rowKey":"id","showIndex":true,"defaultSort":["-id"],"defaultAppends":["user","collection"],"refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 01:31:30.311+00', '2021-09-12 01:31:30.311+00', 'crkujrzrajo'), +('8pzeumw5boe', 'b90azrrpbv3', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:31:30.331+00', '2021-09-12 01:31:30.331+00', 'jk6hplao83m'), +('8f9rd19lfy4', '2371poekw0l', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"left","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 01:31:30.339+00', '2021-09-12 01:31:30.339+00', '8pzeumw5boe'), +('bwhicfamxxv', 'column1', '操作类型', 'void', 'Filter.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"operations":[{"label":"等于","value":"eq","selected":true,"schema":{"x-component":"Select"}},{"label":"不等于","value":"ne","schema":{"x-component":"Select"}},{"label":"包含","value":"in","schema":{"x-component":"Select","x-component-props":{"mode":"tags"}}},{"label":"不包含","value":"notIn","schema":{"x-component":"Select","x-component-props":{"mode":"tags"}}},{"label":"非空","value":"$notNull","noValue":true},{"label":"为空","value":"$null","noValue":true}]}}', '0', 1, '2021-09-12 01:31:30.346+00', '2021-09-12 01:31:30.346+00', '8f9rd19lfy4'), +('6u2q6arrkjo', 'type', NULL, 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 1, '2021-09-12 01:31:30.353+00', '2021-09-12 01:31:30.353+00', 'bwhicfamxxv'), +('ohjo3yyutvk', 'column1', '操作时间', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 01:31:30.368+00', '2021-09-12 01:31:30.368+00', 'jk6hplao83m'), +('g586vm4e1dw', 'created_at', NULL, 'string', 'DatePicker', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"x-component-props":{"format":"YYYY-MM-DD HH:mm:ss"}}', '0', 1, '2021-09-12 01:31:30.377+00', '2021-09-12 01:31:30.377+00', 'ohjo3yyutvk'), +('7kmpoh12gyz', 'column2', '操作用户', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 3, '2021-09-12 01:31:30.387+00', '2021-09-12 01:31:30.387+00', 'jk6hplao83m'), +('gvpvu3arngo', 'user.nickname', NULL, 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true}', '0', 1, '2021-09-12 01:31:30.394+00', '2021-09-12 01:31:30.394+00', '7kmpoh12gyz'), +('39x5m1xztbl', 'column3', '数据表', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 4, '2021-09-12 01:31:30.404+00', '2021-09-12 01:31:30.404+00', 'jk6hplao83m'), +('1aahb8yh14y', 'collection.title', NULL, 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true}', '0', 1, '2021-09-12 01:31:30.412+00', '2021-09-12 01:31:30.412+00', '39x5m1xztbl'), +('oiynv8cajrb', 'column4', '操作类型', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 5, '2021-09-12 01:31:30.428+00', '2021-09-12 01:31:30.428+00', 'jk6hplao83m'), +('tuh85876eul', 'type', NULL, 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 1, '2021-09-12 01:31:30.437+00', '2021-09-12 01:31:30.437+00', 'oiynv8cajrb'), +('cjw09rovqb1', 'qignqewpysa', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"width":60,"align":"center"}}', '0', 6, '2021-09-12 01:31:30.446+00', '2021-09-12 01:31:30.446+00', 'jk6hplao83m'), +('759031zvxtv', '3c0708fu729', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link","style":{"padding":"0","height":"auto"}},"x-action-type":"view"}', '0', 1, '2021-09-12 01:31:30.452+00', '2021-09-12 01:31:30.452+00', 'cjw09rovqb1'), +('ygbrs78lxnm', 'pqavq0lxbaj', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-read-pretty":true,"x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useActionLogDetailsResource }}"},"x-component-props":{}}', '0', 1, '2021-09-12 01:31:30.464+00', '2021-09-12 01:31:30.464+00', '759031zvxtv'), +('xpqadg76uzr', 'created_at', '操作时间', 'string', 'DatePicker', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true,"x-component-props":{"format":"YYYY-MM-DD HH:mm:ss"}}', '0', 1, '2021-09-12 01:31:30.471+00', '2021-09-12 01:31:30.471+00', 'ygbrs78lxnm'), +('iz2zfoswqp4', 'user.nickname', '操作用户', 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true}', '0', 2, '2021-09-12 01:31:30.479+00', '2021-09-12 01:31:30.479+00', 'ygbrs78lxnm'), +('pbwn5p4d44j', 'collection.title', '数据表', 'string', 'Input', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true}', '0', 3, '2021-09-12 01:31:30.49+00', '2021-09-12 01:31:30.49+00', 'ygbrs78lxnm'), +('4mu9fdyftac', 'type', '操作类型', 'string', 'Select', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-read-pretty":true,"enum":[{"label":"新增","value":"create","color":"green"},{"label":"更新","value":"update","color":"blue"},{"label":"删除","value":"destroy","color":"red"}]}', '0', 4, '2021-09-12 01:31:30.499+00', '2021-09-12 01:31:30.499+00', 'ygbrs78lxnm'), +('ro0hgi4fk6d', 'changes', '数据变动', 'array', 'ArrayTable', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"FormItem","x-component-props":{"pagination":false},"items":{"_isJSONSchemaObject":true,"version":"2.0","type":"object","properties":{"column0":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"width":80,"align":"center"},"properties":{"index":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Index","name":"index"}},"name":"column0"},"column1":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"字段名称"},"properties":{"field":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.Field","name":"field"}},"name":"column1"},"column3":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"操作前"},"properties":{"before":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.FieldValue","name":"before"}},"name":"column3"},"column4":{"_isJSONSchemaObject":true,"version":"2.0","type":"void","x-component":"ArrayTable.Column","x-component-props":{"title":"操作后"},"properties":{"after":{"_isJSONSchemaObject":true,"version":"2.0","type":"string","x-decorator":"FormilyFormItem","x-component":"ActionLogs.FieldValue","name":"after"}},"name":"column4"}}}}', '0', 5, '2021-09-12 01:31:30.505+00', '2021-09-12 01:31:30.505+00', 'ygbrs78lxnm'), +('w3ffnsl1r3s', 'jj4dokedkt0', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 07:56:48.926+00', '2021-09-12 07:56:48.926+00', '4i3pi6na2us'), +('3n691oyepso', 'lbzm4ksucnp', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 07:56:48.934+00', '2021-09-12 07:56:48.934+00', 'w3ffnsl1r3s'), +('w8697cme09h', '3bw1b6krm03', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Select.Drawer.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-12 01:54:14.07+00', '2021-09-12 01:54:14.07+00', '6aorn22jn07'), +('ng3spcq1ztq', 'crgtd07i95y', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:35:14.571+00', '2021-09-12 01:35:14.571+00', 'afa3o4orvfl'), +('gm5lvvnwh2x', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-12 01:35:14.605+00', '2021-09-12 01:35:14.605+00', 'ya4i4em415w'), +('nobry6xhw5v', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 01:35:14.619+00', '2021-09-12 01:35:14.619+00', 'gm5lvvnwh2x'), +('vd9xpz0vpwh', '9157knd02rh', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 01:35:14.633+00', '2021-09-12 01:35:14.633+00', 'nobry6xhw5v'), +('ljp9ssuu9om', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 01:35:14.674+00', '2021-09-12 01:35:14.674+00', 'ya4i4em415w'), +('pz1r6quw7dr', 'stfo7zr49zf', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 01:35:14.683+00', '2021-09-12 01:35:14.683+00', 'ljp9ssuu9om'), +('c4lpqf0p8ox', '2zcwbtqkc2f', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 01:35:14.697+00', '2021-09-12 01:35:14.697+00', 'pz1r6quw7dr'), +('peymtt26s66', '8ytk2hd8h70', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:35:14.707+00', '2021-09-12 01:35:14.707+00', 'c4lpqf0p8ox'), +('2pot2uy81hy', '9db0qiukg3x', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 01:35:14.718+00', '2021-09-12 01:35:14.718+00', 'peymtt26s66'), +('a0scev24ke8', '9j1i0u82nnz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:35:15.035+00', '2021-09-12 01:35:15.035+00', 'rb2er0bh4p0'), +('bznrcr01kt7', 'yvwkwjdb5sd', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:35:15.673+00', '2021-09-12 01:35:15.673+00', 'mfvay3g2jgl'), +('a776zlon459', '0l5irnjcsbs', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-12 01:35:15.047+00', '2021-09-12 07:37:49.517+00', 'a0scev24ke8'), +('u5wehf80ij1', 'wg6nmlwjwqn', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 01:54:14.08+00', '2021-09-12 01:54:14.08+00', 'w8697cme09h'), +('dbew3mirvxc', 'dtzl0cu8h6c', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["1jkpjg7vkgi","qbe1q17p9kh","f_umjewufbyhj","f_kkopbnfdd0v","f_nlgk67tpdql","f_niymyj0no38"]}}', '0', 1, '2021-09-12 01:10:12.047+00', '2021-09-14 02:39:11.836+00', 'ndkbn5dqzs4'), +('swcwdy16u0c', 'a7swa9reqmf', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-12 01:35:14.644+00', '2021-09-14 02:59:20.277+00', 'vd9xpz0vpwh'), +('6aorn22jn07', 'd3r7mapllk3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:14.061+00', '2021-09-12 01:54:14.061+00', '8kcujdq5bvl'), +('nyjl1ypx8ih', 'dj0v9z5qqs6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-12 01:54:14.092+00', '2021-09-12 01:54:14.092+00', 'w8697cme09h'), +('24e32t123l3', 'zsvuk9at8pu', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:18.892+00', '2021-09-12 01:54:18.892+00', 'e0hdrnyk4ge'), +('gg5di2hks9r', 'd3z4abkp579', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-12 01:54:18.902+00', '2021-09-12 01:54:18.902+00', '24e32t123l3'), +('ya4i4em415w', 'vsyf2i8kdbi', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-12 01:35:14.593+00', '2021-09-12 07:37:47.383+00', 'ng3spcq1ztq'), +('32vv0cgxfql', 'kz8ypymc5df', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-12 01:54:21.638+00', '2021-09-12 01:54:40.524+00', '62hcx8s6n1d'), +('h62s5wcs1ey', '164q9p8dyez', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-12 01:35:15.685+00', '2021-09-12 07:37:51.389+00', 'bznrcr01kt7'), +('afa3o4orvfl', '9f6m4s8e5sk', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 01:35:14.549+00', '2021-09-12 07:38:57.488+00', 'dzo9zrof056'), +('rb2er0bh4p0', 'v8yxc99x83r', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:35:15.024+00', '2021-09-12 07:38:57.569+00', 'dzo9zrof056'), +('02heuzivptz', '4roy185jnr9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:25.547+00', '2021-09-12 01:54:25.547+00', '20r5rx8ryzj'), +('wl27m6e52sm', '1eknnlho5z7', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-12 01:54:25.555+00', '2021-09-12 01:54:25.555+00', '02heuzivptz'), +('zxx1q8vc8ya', 'r876xy45kyt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:26.254+00', '2021-09-12 01:54:26.254+00', 'vwyys9hvlrf'), +('e2r4k5jdrkg', 'denr3nnr7n6', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-12 01:54:26.262+00', '2021-09-12 01:54:26.262+00', 'zxx1q8vc8ya'), +('m8dbsc1d8bt', 'domjkc2hrg6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:26.74+00', '2021-09-12 01:54:26.74+00', '35t5ce8ttzf'), +('ryeyfmq50uc', 't7401wy6vi4', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-12 01:54:26.748+00', '2021-09-12 01:54:26.748+00', 'm8dbsc1d8bt'), +('1n48ped46z4', '2bycr0ozhky', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-12 01:54:22.481+00', '2021-09-12 01:54:30.651+00', 'asw2acwl3f0'), +('irc0989lo7m', '6um84tfp6qc', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:22.471+00', '2021-09-12 01:54:22.471+00', NULL), +('0fako4ad0u7', 'i42wi5wcg5r', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-12 01:54:24.758+00', '2021-09-12 01:54:35.063+00', 'jmb7pa8gqvt'), +('7lbpdlzzpnj', '9z56vemvirw', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:25.334+00', '2021-09-12 07:34:25.334+00', NULL), +('mtis3n8jp1o', 'kbsdflspazm', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:24.75+00', '2021-09-12 01:54:24.75+00', NULL), +('cwcw6ewk5no', '41pgzy5duo1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-12 01:54:23.172+00', '2021-09-12 01:54:38.039+00', 'ql5pto9qo9k'), +('8cxwa6c9x3k', 'kgzn0mlj5of', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-12 07:34:26.042+00', '2021-09-12 07:39:21.19+00', 'ltxxeaq4dwb'), +('wj9gg5qi3r1', 'c6zku4525se', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 01:54:23.164+00', '2021-09-12 01:54:23.164+00', NULL), +('4sjyde2u9oq', 'qpsf4aq5chc', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-12 07:34:25.377+00', '2021-09-14 02:59:33.54+00', 'tr5y0vkfyyw'), +('j3vyu7mwewx', 'feu1x50swqd', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:34:21.51+00', '2021-09-12 07:34:21.51+00', 'p87fcj3ojfs'), +('78ernl0vi6d', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-12 07:34:25.353+00', '2021-09-12 07:34:25.353+00', 'frvcwldllpd'), +('eyohmo8psbx', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 07:34:25.361+00', '2021-09-12 07:34:25.361+00', '78ernl0vi6d'), +('tr5y0vkfyyw', 'hb5sdylrdb0', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 07:34:25.369+00', '2021-09-12 07:34:25.369+00', 'eyohmo8psbx'), +('est5cvxiicq', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 07:34:25.393+00', '2021-09-12 07:34:25.393+00', 'frvcwldllpd'), +('8r2vcxy45in', 'xoetq0qg1m2', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 07:34:25.399+00', '2021-09-12 07:34:25.399+00', 'est5cvxiicq'), +('4n6tkvdy8pg', '1d7hcnc4sz3', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 07:34:25.406+00', '2021-09-12 07:34:25.406+00', '8r2vcxy45in'), +('o2m1dajk11m', 'bqkkhsso3s1', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 07:34:25.412+00', '2021-09-12 07:34:25.412+00', '4n6tkvdy8pg'), +('0a0cji6n0gx', 'qm1jmxlba24', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 07:34:25.419+00', '2021-09-12 07:34:25.419+00', 'o2m1dajk11m'), +('ltxxeaq4dwb', 'ckqixem0eqs', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:26.034+00', '2021-09-12 07:34:26.034+00', 'o936terfdi3'), +('x3dmjglzj8r', 'zmnv6jzdzmc', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:21.492+00', '2021-09-12 07:34:21.492+00', NULL), +('asw2acwl3f0', 'e4fp60qpep9', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:54:30.632+00', '2021-09-12 07:38:57.696+00', 'e0hdrnyk4ge'), +('jmb7pa8gqvt', '67xfhqlgaw6', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 0, '2021-09-12 01:54:35.05+00', '2021-09-12 07:38:57.716+00', '5n4vdrdd93c'), +('ql5pto9qo9k', 'fohpbz3j5ub', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 01:54:38.03+00', '2021-09-12 07:38:57.728+00', '5n4vdrdd93c'), +('20r5rx8ryzj', '0sb32fqboyh', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 6, '2021-09-12 01:54:25.54+00', '2021-09-12 07:38:57.742+00', 'nyjl1ypx8ih'), +('62hcx8s6n1d', '1ve5w65hr26', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 0, '2021-09-12 01:54:40.516+00', '2021-09-12 07:38:57.746+00', '20r5rx8ryzj'), +('frvcwldllpd', 'ji3bdl0zae0', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-12 07:34:25.341+00', '2021-09-15 01:44:18.692+00', 'xb6eh6iklcg'), +('pe5xg4s6nbd', '3mljelrabcv', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 07:35:37.413+00', '2021-09-15 01:39:28.967+00', 'eyohmo8psbx'), +('bzhnwtjmhbr', 'gkwv5i6dxyg', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', -1, '2021-09-12 07:38:57.272+00', '2021-09-12 07:38:57.839+00', 'sjc5uxxtwkm'), +('dlch4msfkok', 'wi1qy1uzfv0', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:59.534+00', '2021-09-12 07:34:59.534+00', 'zmbdwd3dm1k'), +('c51vkqz0ktj', '5wyimjzqit5', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**快速添加订单**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"FormItem","x-read-pretty":true}', '0', 1, '2021-09-12 07:34:41.332+00', '2021-09-12 07:34:59.546+00', 'dlch4msfkok'), +('06lb39g9pyi', 'bdkbmk97iqk', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:34:41.324+00', '2021-09-12 07:34:41.324+00', NULL), +('xj5582hqgvm', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_geso7fru7a9","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-12 07:35:36.283+00', '2021-09-12 07:35:36.283+00', '2ygi8yjoi0d'), +('m14bq5e0crl', 'u1r7c9w6e1i', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 07:35:36.291+00', '2021-09-12 07:35:36.291+00', 'xj5582hqgvm'), +('ixjnch4uorx', 'cztr3erotmi', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 07:35:36.298+00', '2021-09-12 07:35:36.298+00', 'm14bq5e0crl'), +('ijpd0dwzcn9', 'cmxaf4glsou', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 07:35:36.32+00', '2021-09-12 07:35:36.32+00', 'i2nebic23xf'), +('9nqyrh7kmff', 'vozlapdhk5r', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 07:35:36.328+00', '2021-09-12 07:35:36.328+00', 'ijpd0dwzcn9'), +('op65sui6nci', 'ku1ve0c8as5', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 07:35:36.335+00', '2021-09-12 07:35:36.335+00', '9nqyrh7kmff'), +('9wbq0hvo5cv', '729f98rj4u6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 07:35:36.343+00', '2021-09-12 07:35:36.343+00', 'op65sui6nci'), +('2ygi8yjoi0d', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-12 07:35:36.275+00', '2021-09-12 07:35:36.275+00', NULL), +('i2nebic23xf', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 07:35:36.313+00', '2021-09-12 07:35:36.313+00', NULL), +('x6j2o6xw1by', NULL, '订单编号', 'string', 'Input', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 51, '2021-09-12 07:36:53.512+00', '2021-09-12 07:36:53.512+00', NULL), +('zylge4u5krx', 'zuhpy4faxwb', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-12 07:38:25.583+00', '2021-09-12 07:39:17.35+00', 'fd2z1suahap'), +('ciuvfq6fr5i', 'p6big9ceidj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:37:41.141+00', '2021-09-12 07:37:41.141+00', 'quzjklrfwjg'), +('zmbdwd3dm1k', '2i6k20tus3g', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 0, '2021-09-12 07:34:59.525+00', '2021-09-15 01:42:34.562+00', 'j3vyu7mwewx'), +('pm4emw5t8hm', 'bsqckkco84t', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:37:38.696+00', '2021-09-12 07:37:38.696+00', NULL), +('csbs1x7unpy', 'vp7g3k0lkdv', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-12 07:37:38.703+00', '2021-09-12 07:37:43.83+00', 'ciuvfq6fr5i'), +('fd2z1suahap', 'q3a3wqh9qtc', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:38:28.703+00', '2021-09-12 07:38:28.703+00', '48epds0jr2w'), +('48epds0jr2w', 'q2iu4u4ja4t', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 07:38:28.696+00', '2021-09-15 01:42:34.58+00', 'j3vyu7mwewx'), +('o936terfdi3', 'cdwfvcw6q7u', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 07:34:26.025+00', '2021-09-15 01:44:18.76+00', 'j3vyu7mwewx'), +('d28iubpwd9e', 'kx4r5qqbv9o', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:38:25.576+00', '2021-09-12 07:38:25.576+00', NULL), +('xz87tw0xkbj', 'tn8tfberjxz', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 01:24:20.591+00', '2021-09-12 07:38:57.307+00', '3gtya6xukdi'), +('pit19i41iow', 'df4n1zl48rt', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:24:20.995+00', '2021-09-12 07:38:57.321+00', '3gtya6xukdi'), +('82pfiahl2bs', 'dxtibsrfszz', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:24:36.053+00', '2021-09-12 07:38:57.343+00', '0s69s3n7w0z'), +('quzjklrfwjg', 'wml0aqiwzkq', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 0, '2021-09-12 07:37:41.128+00', '2021-09-12 07:38:57.472+00', 'dzo9zrof056'), +('ld0lq7cawk5', 'dzeessqyre9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:11:25.09+00', '2021-09-12 08:11:25.09+00', '9i11iq68qtg'), +('n9latr3kd13', '5xhcfqf03qe', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 07:56:48.954+00', '2021-09-12 08:13:51.789+00', 'mtx9vafo4dk'), +('twaq37ojsxh', '7x5xwlk5pk7', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 07:35:41.006+00', '2021-09-15 01:39:28.982+00', 'eyohmo8psbx'), +('yeqrzlicmqz', '2l8t7uks4jm', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-12 07:34:27.015+00', '2021-09-15 01:39:31.042+00', '4a2qaxp1yh2'), +('cz3wafz4aa1', 'x5otg2quyut', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 01:24:38.165+00', '2021-09-12 07:38:57.347+00', '0s69s3n7w0z'), +('8x9qgjkvfu1', 'tmonh6w55bw', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 01:24:43.596+00', '2021-09-12 07:38:57.352+00', '0s69s3n7w0z'), +('81hr4bigan1', '1pe2hxpkj87', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 01:24:21.842+00', '2021-09-12 07:38:57.398+00', '3gtya6xukdi'), +('mpu29b3o70a', 'j4arxij3gz2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:35:32.482+00', '2021-09-12 07:38:57.514+00', 'nobry6xhw5v'), +('eupl9lbue6x', 'upmwhly57wy', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 01:35:36.225+00', '2021-09-12 07:38:57.518+00', 'nobry6xhw5v'), +('xe7npdpzm61', 'vf7wyo5ocir', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 01:35:39.526+00', '2021-09-12 07:38:57.523+00', 'nobry6xhw5v'), +('mfvay3g2jgl', 'g00ljyam7wf', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 01:35:15.666+00', '2021-09-12 07:38:57.582+00', 'dzo9zrof056'), +('hd78xnosk6a', 'ot17fninveh', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 07:36:59.794+00', '2021-09-12 07:38:57.613+00', 'i8maupbyrqr'), +('qtwdtjhe0xe', 'ww6pqa062vo', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e"}},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 01:10:20.716+00', '2021-09-12 07:38:57.625+00', 'i8maupbyrqr'), +('8kcujdq5bvl', 'thxknf1g5ts', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 01:54:14.035+00', '2021-09-12 07:38:57.665+00', 'tvxex3cts8i'), +('e0hdrnyk4ge', 'nhgdf6itgbj', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 01:54:18.882+00', '2021-09-12 07:38:57.683+00', 'nyjl1ypx8ih'), +('5n4vdrdd93c', 'bit5at2ljyd', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 01:54:21.616+00', '2021-09-12 07:38:57.709+00', 'nyjl1ypx8ih'), +('vwyys9hvlrf', 'or3o3m0kpnj', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 7, '2021-09-12 01:54:26.244+00', '2021-09-12 07:38:57.764+00', 'nyjl1ypx8ih'), +('35t5ce8ttzf', 'o7357c6h5lg', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 8, '2021-09-12 01:54:26.732+00', '2021-09-12 07:38:57.779+00', 'nyjl1ypx8ih'), +('k37wt7zbv61', 'qacxfliwwc1', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 5, '2021-09-12 01:10:21.241+00', '2021-09-12 07:38:57.822+00', 'i8maupbyrqr'), +('h41g5aiikz1', 'zspggbisusx', '首页', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"homeoutlined"}}', '0', 5, '2021-09-12 07:52:46.411+00', '2021-09-12 07:52:53.829+00', 'qqzzjakwkwl'), +('66g7jbpqsen', 'x3pccka6zr1', '区块组合', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"appstoreoutlined"}}', '0', 1, '2021-09-12 07:53:05.812+00', '2021-09-12 07:53:05.812+00', 'h41g5aiikz1'), +('io67vs1gksb', 'vmeqm0izzvf', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 07:53:05.824+00', '2021-09-12 07:53:05.824+00', '66g7jbpqsen'), +('owygfbxi3f0', '6jk8gotrodj', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 07:53:05.833+00', '2021-09-12 07:53:05.833+00', 'io67vs1gksb'), +('on7wtx4zj4i', '3o9eegogmhh', '菜单分组', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"barsoutlined"}}', '0', 2, '2021-09-12 07:53:33.719+00', '2021-09-12 07:53:33.719+00', 'h41g5aiikz1'), +('bz9f75loti1', '8nenwblifoc', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 07:53:56.124+00', '2021-09-12 07:53:56.124+00', 'iksevp895l4'), +('x235131r3nm', 'btlecvojey8', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 07:55:06.238+00', '2021-09-12 07:55:06.238+00', 'brdnr3tv1fq'), +('wcgzais97hx', 'ez17atdpebn', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 07:55:06.247+00', '2021-09-12 07:55:06.247+00', 'x235131r3nm'), +('8wpgo37h149', 'ypd5nw0rzl5', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 07:55:06.256+00', '2021-09-12 07:55:06.256+00', 'x235131r3nm'), +('66xkkyrhvo2', 'p83fmsakq93', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 07:55:06.266+00', '2021-09-12 07:55:06.266+00', 'x235131r3nm'), +('uklezwjnv3c', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 07:55:06.275+00', '2021-09-12 07:55:06.275+00', '66xkkyrhvo2'), +('4cab668vnid', '6y774sigsah', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:55:06.281+00', '2021-09-12 07:55:06.281+00', 'uklezwjnv3c'), +('d2piaqcsskg', 'ohr9rus35cj', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 07:55:06.299+00', '2021-09-12 07:55:06.299+00', 'brdnr3tv1fq'), +('c82qey0a5qf', 'eyuns05axle', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 07:55:06.306+00', '2021-09-12 07:55:06.306+00', 'd2piaqcsskg'), +('p8ocd894t8y', 'hibwczuwhvz', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-12 07:55:06.208+00', '2021-09-13 08:59:46.646+00', 'owygfbxi3f0'), +('2fmrebsf4gp', 'wdw8v3ljzk8', '外部链接', 'void', 'Menu.URL', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"href":"https://www.nocobase.com/"}}', '0', 4, '2021-09-12 07:54:27.859+00', '2021-09-14 00:34:01.017+00', 'on7wtx4zj4i'), +('iksevp895l4', '04qft4ttyag', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 07:53:56.117+00', '2021-09-12 07:53:56.117+00', NULL), +('46uv2irafjj', 'uwp63g0snzf', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 07:55:06.312+00', '2021-09-12 07:55:06.312+00', 'c82qey0a5qf'), +('z3tgns5sig7', 'nk21kz4ykys', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 07:55:06.322+00', '2021-09-12 07:55:06.322+00', '46uv2irafjj'), +('da63hv48ls3', 'ffqxj0s5m07', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 07:55:06.329+00', '2021-09-12 07:55:06.329+00', 'z3tgns5sig7'), +('tyk6mojy3tk', 'wv7jtgdbk0a', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 07:55:06.337+00', '2021-09-12 07:55:06.337+00', 'da63hv48ls3'), +('5kpbm2yjz91', 'ot6kp09qnh2', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 07:55:06.343+00', '2021-09-12 07:55:06.343+00', 'tyk6mojy3tk'), +('5mokwpu9u7l', 'mb5wgvbi4w1', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 07:55:06.364+00', '2021-09-12 07:55:06.364+00', 'c82qey0a5qf'), +('h37y1d03f1h', 'b2b4nm4hp7d', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 07:55:06.37+00', '2021-09-12 07:55:06.37+00', '5mokwpu9u7l'), +('iop09nxg8ba', 'zax9o5d4t65', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:55:06.379+00', '2021-09-12 07:55:06.379+00', 'h37y1d03f1h'), +('zg2qkq4930f', '77xkscspj24', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 3, '2021-09-12 07:56:22.692+00', '2021-09-12 07:56:22.692+00', 'p8ocd894t8y'), +('w8wganiiwim', '1t5mnp2ll81', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:55:18.301+00', '2021-09-12 07:55:18.301+00', NULL), +('js1umj9zkcw', '3dhagssqz3i', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 07:55:50.598+00', '2021-09-12 07:55:50.598+00', 'p8ocd894t8y'), +('w0wh8s0t9q6', 'uyrthalek4y', NULL, 'void', 'Chart.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"sales","yField":"type","legend":{"position":"top-left"},"barBackground":{"style":{"fill":"rgba(0,0,0,0.1)"}},"interactions":[{"type":"active-region","enable":false}]}}}', '0', 1, '2021-09-12 07:55:44.955+00', '2021-09-12 07:55:50.606+00', 'js1umj9zkcw'), +('afiii4fzjt4', 'a0acsfluns1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:55:44.946+00', '2021-09-12 07:55:44.946+00', NULL), +('brdnr3tv1fq', 'nmphpy858o3', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"users","collectionName":"users"}}', '0', 1, '2021-09-12 07:55:06.231+00', '2021-09-12 07:55:06.231+00', NULL), +('usav4xf4i5b', '2e2tf2sl8nx', NULL, 'void', 'Chart.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"type","yField":"sales","label":{"position":"middle","style":{"fill":"#FFFFFF","opacity":0.6}},"xAxis":{"label":{"autoHide":true,"autoRotate":false}},"meta":{"type":{"alias":"类别"},"sales":{"alias":"销售额"}}}}}', '0', 1, '2021-09-12 07:56:18.968+00', '2021-09-12 07:56:22.711+00', 'zg2qkq4930f'), +('sgi1ys98g9z', 'h77wa7zq3r1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:56:18.96+00', '2021-09-12 07:56:18.96+00', NULL), +('0iqvy8p1tvo', 'bypmsbeixva', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:55:36.438+00', '2021-09-12 07:55:36.438+00', NULL), +('cgvqt4pluo1', 'jhvqb9p0txh', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 07:56:48.849+00', '2021-09-12 07:56:48.849+00', 'ounz7zpirge'), +('vao8sez2gej', 'mwnq7dhbukc', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:56:48.895+00', '2021-09-12 07:56:48.895+00', '9pu6r17dwln'), +('4i3pi6na2us', 'irorafahm2p', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 07:56:48.915+00', '2021-09-12 07:56:48.915+00', 'ounz7zpirge'), +('9pu6r17dwln', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 07:56:48.889+00', '2021-09-12 07:56:48.889+00', NULL), +('prbpeltlckf', 'ph431xrvbeh', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"### 说明:\n- NocoBase 尚处在早期开发阶段,仅供预览,不适合用于生产环境。 \n- Demo 环境仅用于体验,你在 Demo 站点所做的操作、所存储的数据可能会丢失。 \n \n\n欢迎参与 NocoBase 的核心和插件开发:[Github](https://github.com/nocobase/nocobase \"Github\")","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 07:55:18.309+00', '2021-09-16 00:27:43.727+00', 'yjtisjjtb4c'), +('ounz7zpirge', 'na9ftcrdx5v', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_2uhu4szs1kq","collectionName":"t_2uhu4szs1kq"}}', '0', 1, '2021-09-12 07:56:48.841+00', '2021-09-13 09:00:00.299+00', 'b4xp5bvjtjg'), +('tt572749tn9', 'tucowmrzmjr', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 07:56:48.962+00', '2021-09-12 07:56:48.962+00', 'n9latr3kd13'), +('vohbzoj2m15', 'hny7l530kvx', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 07:56:48.974+00', '2021-09-12 07:56:48.974+00', 'tt572749tn9'), +('8270dqmqiiy', 'xtevar0izcq', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:56:49.015+00', '2021-09-12 07:56:49.015+00', 'o3hrzoijfww'), +('o3hrzoijfww', 'b4u1yt2s85v', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 07:56:49.004+00', '2021-09-12 07:56:49.004+00', NULL), +('agpcsifenuw', 'xcd7x3uavw4', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-12 07:58:45.9+00', '2021-09-12 07:58:45.9+00', 'ys8kexx4d5t'), +('xb9wgdj9hci', 'hh9hyfkcng3', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**本周待处理的任务**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 07:57:41.272+00', '2021-09-12 07:58:02.532+00', 'k7fnv90hoyz'), +('zp8y2lhb62h', 'ukbyiai3hyh', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 07:58:51.777+00', '2021-09-12 07:58:51.777+00', 'xiv40kadnzo'), +('k7fnv90hoyz', 'toz78a8rnrm', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:58:02.516+00', '2021-09-12 07:58:02.516+00', NULL), +('lzmq986ofck', '3wvot06svfh', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:57:41.262+00', '2021-09-12 07:57:41.262+00', NULL), +('d6caxvbz5fd', 'bcwees7xqd6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 07:58:19.228+00', '2021-09-12 07:58:19.228+00', '5i6htfen2xg'), +('rvl59tassil', 'xw72ck1xsvl', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:58:23.32+00', '2021-09-12 07:58:23.32+00', '3eaximzv664'), +('5i6htfen2xg', '6elvnbqjmfb', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-component-props":{"showDefaultButtons":true,"resource":"t_2uhu4szs1kq","collectionName":"t_2uhu4szs1kq"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-12 07:58:19.22+00', '2021-09-12 07:58:51.785+00', 'zp8y2lhb62h'), +('reqdnoxeco5', 'evheykrprks', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**快速添加任务**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"FormItem","x-read-pretty":true}', '0', 1, '2021-09-12 07:58:23.327+00', '2021-09-12 07:58:41.684+00', 'rvl59tassil'), +('8kdi4gylly4', 'j9wisa342l0', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:58:44.635+00', '2021-09-12 07:58:44.635+00', 'eemrffcv1rz'), +('cef9m3yf1c1', 'l9yuyng75il', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-12 07:58:44.642+00', '2021-09-12 07:58:44.642+00', '8kdi4gylly4'), +('ys8kexx4d5t', 'inx22bf9tjp', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:58:45.891+00', '2021-09-12 07:58:45.891+00', 'xzdwhq9245r'), +('3eaximzv664', 'gr2edipmxnr', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 07:58:23.31+00', '2021-09-12 07:58:51.796+00', 'd6caxvbz5fd'), +('eemrffcv1rz', 'jmgt7xkekkc', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 07:58:44.626+00', '2021-09-12 07:58:51.809+00', 'd6caxvbz5fd'), +('xzdwhq9245r', 'zxlbcb71cxw', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 07:58:45.881+00', '2021-09-12 07:58:51.826+00', 'd6caxvbz5fd'), +('6ozsi41pa8t', 'zrnq6glrbuy', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 07:58:19.212+00', '2021-09-12 07:58:19.212+00', NULL), +('gnwa4ndv1gi', '0830m2fl6gk', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:01:46.042+00', '2021-09-12 08:01:46.042+00', 'yizhuc5dxdb'), +('98w2ul6d5md', 'epwqwxemasr', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-12 08:01:26.947+00', '2021-09-12 08:01:26.947+00', 'qp4giydwn93'), +('5v86bl3m7t6', '5cv7o3tj9rj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:01:26.955+00', '2021-09-12 08:01:26.955+00', '98w2ul6d5md'), +('xwc4ao2fiqc', '43kk4h9cdh9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-12 08:01:26.967+00', '2021-09-12 08:01:26.967+00', '5v86bl3m7t6'), +('yizhuc5dxdb', 'ulcrzr13qii', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:01:46.033+00', '2021-09-12 08:01:46.072+00', 'tj9c7vbrcib'), +('25d5jv4678c', 'ky9lfrb2vp1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-08 07:28:28.444+00', '2021-09-08 07:28:28.444+00', NULL), +('1ha27dud5hv', 'ubxrkte11sf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:11:20.421+00', '2021-09-12 08:11:20.421+00', 'm2mvr899l9c'), +('n9lcw3dl6nx', 'hh72uw0epb4', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-12 08:11:20.428+00', '2021-09-12 08:11:20.428+00', '1ha27dud5hv'), +('ikizt10knfl', 's0rxe31bsqb', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:11:20.437+00', '2021-09-12 08:11:20.437+00', 'n9lcw3dl6nx'), +('qys5cfp3mdj', 'gldzi6k6u59', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-12 08:11:20.446+00', '2021-09-12 08:11:20.446+00', 'n9lcw3dl6nx'), +('npaacbtkb4g', 'zqxdp1akq17', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:11:24.195+00', '2021-09-12 08:11:24.195+00', 'zmnyf7leu5e'), +('85i9av7ngla', '516t7uziqsx', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-12 08:11:24.205+00', '2021-09-12 08:11:24.205+00', 'npaacbtkb4g'), +('xiv40kadnzo', '2v5ufe0wyn7', NULL, 'void', 'Grid.Row', '{"version":"2.0","x-component-props":{"colsize":[72.17473884140551,27.825261158594493]}}', '0', 4, '2021-09-12 07:56:48.815+00', '2021-09-13 08:59:46.646+00', 'owygfbxi3f0'), +('2g5fnn131l5', 'ii6xua7orcl', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-12 08:11:25.096+00', '2021-09-12 08:11:25.096+00', 'ld0lq7cawk5'), +('vb5h15yvlgr', 'rbh6j7mh621', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"wtojfhp8nwl"}}', '0', 1, '2021-09-12 08:11:29.116+00', '2021-09-12 08:11:29.116+00', 'rkusmebftd2'), +('mtx9vafo4dk', '69bclbwp4au', '查看数据', 'void', 'Action.Modal', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 07:56:48.945+00', '2021-09-12 08:11:51.592+00', '3n691oyepso'), +('c2pallk0lge', NULL, '任务详情', 'string', 'Input.TextArea', '{"x-decorator":"FormItem","x-designable-bar":"Input.DesignableBar"}', '0', 52, '2021-09-12 08:18:46.926+00', '2021-09-12 08:18:46.926+00', NULL), +('e7hul04yijg', '28kf8nkbogw', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-12 08:18:53.883+00', '2021-09-12 08:18:53.883+00', 'tj9c7vbrcib'), +('0es1iarwyvj', 'al2bqtpv5wa', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:18:53.891+00', '2021-09-12 08:18:53.891+00', 'e7hul04yijg'), +('q0lc8vobhbs', 'bqndkzb8lt7', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_l8uuiwcnlw9"}}', '0', 1, '2021-09-12 08:18:53.898+00', '2021-09-12 08:18:53.898+00', '0es1iarwyvj'), +('hz0xa6nieup', '2be9ywwzant', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:20:12.393+00', '2021-09-12 08:20:12.393+00', '2yxfvondpb4'), +('rg9w3fc2z9b', 'hsnya6frncp', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_l8uuiwcnlw9"}}', '0', 1, '2021-09-12 08:20:12.401+00', '2021-09-12 08:20:12.401+00', 'hz0xa6nieup'), +('gs3nuib6pw4', 'qlb8minkykq', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_u4i0jrp4uo6"}}', '0', 1, '2021-09-12 08:11:25.758+00', '2021-09-12 08:20:22.25+00', '6zy5c6yj530'), +('8sgi2ma6amm', '4vwfpsuc7zs', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:11:25.743+00', '2021-09-12 08:11:25.743+00', NULL), +('rkusmebftd2', 'y49ug7x3xvy', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:11:29.108+00', '2021-09-12 08:11:29.108+00', NULL), +('sfdkyqonmz0', 'd9aj571l3df', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:33:29.994+00', '2021-09-12 08:33:29.994+00', '2eacz1979l5'), +('c3cclt2yb97', 'x0vd92fxvfh', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:33:30.002+00', '2021-09-12 08:33:30.002+00', 'sfdkyqonmz0'), +('s08elx2trpt', 'cbt9s3t0gl0', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:33:41.227+00', '2021-09-12 08:33:41.227+00', 'ouuvop86xkn'), +('ydawn45xysc', 'zb8d8wvbz26', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:33:41.238+00', '2021-09-12 08:33:41.238+00', 's08elx2trpt'), +('6zdy7upftb2', 'lmrtzgqb556', '青柠会员', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 3, '2021-09-12 08:33:50.282+00', '2021-09-12 08:33:50.282+00', 'p5e092zc0ot'), +('ihycjm0mcyw', 'l1pl712kd67', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:33:50.288+00', '2021-09-12 08:33:50.288+00', '6zdy7upftb2'), +('r2cj4i4msqb', 'h1ihvgas1hu', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:33:50.295+00', '2021-09-12 08:33:50.295+00', 'ihycjm0mcyw'), +('h3irsnu3clo', '94hj1rrcnsl', '酱紫会员', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 4, '2021-09-12 08:33:59.1+00', '2021-09-12 08:33:59.1+00', 'p5e092zc0ot'), +('robkh6ftbzs', 'v3jwav2y5t5', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:33:59.107+00', '2021-09-12 08:33:59.107+00', 'h3irsnu3clo'), +('mjbzwsp9hzr', 'xrcl8gon31k', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:33:59.115+00', '2021-09-12 08:33:59.115+00', 'robkh6ftbzs'), +('4j5m2mweehy', '2h37sk1rkm2', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:34:08.291+00', '2021-09-12 08:34:08.291+00', '9ci8pxj60jv'), +('2891oprcahh', 'f1fnb3fyybp', '80后', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 2, '2021-09-12 08:34:18.308+00', '2021-09-12 08:34:18.308+00', '75uiuzj3a2y'), +('84ngb8x5fty', 'sndg3bxfuh4', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:34:18.321+00', '2021-09-12 08:34:18.321+00', '2891oprcahh'), +('5xyl3m4vq9e', 'yex7exstyq5', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:34:18.333+00', '2021-09-12 08:34:18.333+00', '84ngb8x5fty'), +('tqpxc3hilti', '9tklg0kw9q2', '90后', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 3, '2021-09-12 08:34:27.245+00', '2021-09-12 08:34:27.245+00', '75uiuzj3a2y'), +('ijlvastmsie', 'yandpxz5b4m', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:34:27.252+00', '2021-09-12 08:34:27.252+00', 'tqpxc3hilti'), +('b18l8xg234k', 'nj20bfx6zud', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:34:27.258+00', '2021-09-12 08:34:27.258+00', 'ijlvastmsie'), +('kme85fmbfdp', 'ty1n8c35xnb', '00后', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 4, '2021-09-12 08:34:37.338+00', '2021-09-12 08:34:37.338+00', '75uiuzj3a2y'), +('yov28h6ubbe', 'ybueqjk6x1t', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:34:37.35+00', '2021-09-12 08:34:37.35+00', 'kme85fmbfdp'), +('lyrtcuhap91', 'idn6t24m39y', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:34:37.357+00', '2021-09-12 08:34:37.357+00', 'yov28h6ubbe'), +('qgfyabeutgq', '3704g2gp4wo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:34:46.466+00', '2021-09-12 08:34:46.466+00', '4j5m2mweehy'), +('chxpf7521cg', '3c5bjrg7dc9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:34:46.478+00', '2021-09-12 08:34:46.478+00', 'qgfyabeutgq'), +('9ci8pxj60jv', '9n46u9aetva', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:34:08.283+00', '2021-09-12 08:34:08.283+00', NULL), +('2eacz1979l5', 'tbm9wnmojjb', '日暮会员', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 3, '2021-09-12 08:33:29.986+00', '2021-09-12 08:44:04.478+00', 'p5e092zc0ot'), +('ouuvop86xkn', 'dycp85fg7pt', '拂晓会员', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 2, '2021-09-12 08:33:41.216+00', '2021-09-12 08:44:02.72+00', 'p5e092zc0ot'), +('oetza8cgh74', 'dl6is20g6h5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:52:45.506+00', '2021-09-12 08:52:45.506+00', 'nsnnb9hz5rm'), +('6zy5c6yj530', 'qyjlcvh5me7', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 08:20:22.239+00', '2021-09-13 08:59:46.551+00', '9i11iq68qtg'), +('2yxfvondpb4', '5qei75jimis', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 5, '2021-09-12 08:20:12.376+00', '2021-09-13 08:59:46.565+00', 'qys5cfp3mdj'), +('p5e092zc0ot', 'd0n88541esb', '按类型划分', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"usergroupdeleteoutlined"}}', '0', 3, '2021-09-12 08:33:06.644+00', '2021-09-14 00:53:57.889+00', 'k33sn747t75'), +('oxtcsimpqb2', 'zj14gw0j1zt', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:34:46.502+00', '2021-09-12 08:34:46.502+00', '9vg6adtm6n6'), +('2yi9bg4mj57', 'nznn0ij5e5z', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-12 08:34:46.51+00', '2021-09-12 08:34:46.51+00', 'oxtcsimpqb2'), +('pmvf7fdcoqn', 'ol94xi92n9o', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-12 08:34:46.521+00', '2021-09-12 08:34:46.521+00', 'oxtcsimpqb2'), +('pa13darz9d4', 'in51pkyhsvp', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-12 08:34:46.53+00', '2021-09-12 08:34:46.53+00', 'oxtcsimpqb2'), +('1iv1b1fk9kt', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:34:46.538+00', '2021-09-12 08:34:46.538+00', 'pa13darz9d4'), +('e55armyp372', '0exnjwf96j9', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:34:46.549+00', '2021-09-12 08:34:46.549+00', '1iv1b1fk9kt'), +('5cl8jjug304', 'muadaczao4v', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:34:46.566+00', '2021-09-12 08:34:46.566+00', '9vg6adtm6n6'), +('odvsdrpgs5z', 'vljnzfav8fo', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:34:46.576+00', '2021-09-12 08:34:46.576+00', '5cl8jjug304'), +('4swww9ez85e', 'xgncx4bipcq', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:34:46.582+00', '2021-09-12 08:34:46.582+00', 'odvsdrpgs5z'), +('p381lm6wrpk', 'dymsj7gs0f6', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:34:46.588+00', '2021-09-12 08:34:46.588+00', '4swww9ez85e'), +('m8t41l1fhy7', 'oe0q7wgnpms', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 08:34:46.598+00', '2021-09-12 08:34:46.598+00', 'p381lm6wrpk'), +('2y8wkg5uuen', 'zi1afkzjxwa', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:34:46.606+00', '2021-09-12 08:34:46.606+00', 'm8t41l1fhy7'), +('bszzitpw3mb', 'sx7j5bmj32y', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:34:46.614+00', '2021-09-12 08:34:46.614+00', '2y8wkg5uuen'), +('bpdlme7kl4y', 'wp1g4pbcser', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-12 08:34:46.634+00', '2021-09-12 08:34:46.634+00', 'odvsdrpgs5z'), +('uqfo3bc59lc', '3dyasrujuks', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:34:46.64+00', '2021-09-12 08:34:46.64+00', 'bpdlme7kl4y'), +('1v7pj31rst6', 'rbg3tl4kozk', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:34:46.646+00', '2021-09-12 08:34:46.646+00', 'uqfo3bc59lc'), +('gb1ganqxlss', 'rrrulqmg1ym', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:34:53.533+00', '2021-09-12 08:34:53.533+00', '9vg6adtm6n6'), +('5bramaki119', '0f9ws4q4pac', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:34:56.206+00', '2021-09-12 08:34:56.206+00', '9vg6adtm6n6'), +('cx6tpk721ay', 'brexsc1cr37', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:34:59.568+00', '2021-09-12 08:34:59.568+00', '9vg6adtm6n6'), +('kcsrh94kobe', 'j0vh8vyduoi', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:35:02.827+00', '2021-09-12 08:35:02.827+00', '9vg6adtm6n6'), +('wq5unbnmai5', '0emrv1jw57c', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:35:03.509+00', '2021-09-12 08:35:03.509+00', '9vg6adtm6n6'), +('j0mohl316ma', 'b72k0vbzl71', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:36:51.075+00', '2021-09-12 08:36:51.075+00', 'qhn4cgfmid4'), +('9vg6adtm6n6', 'fvpv15y0e7x', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_bysgds7j36p":{"$dateNotAfter":"1979-12-31"}}]}}}', '0', 1, '2021-09-12 08:34:46.494+00', '2021-09-12 08:35:48.314+00', 'chxpf7521cg'), +('c6gl6mawm4g', 'tuv8episunt', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:36:51.049+00', '2021-09-12 08:36:51.049+00', '5xyl3m4vq9e'), +('y4exnjcu2xj', '79zpbq9e175', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:36:51.06+00', '2021-09-12 08:36:51.06+00', 'c6gl6mawm4g'), +('0e73vdybb8l', 'cp9z0tjcyt8', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_x9kmuovlm79","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-12 08:36:51.083+00', '2021-09-14 02:52:10.954+00', 'j0mohl316ma'), +('csvx2y38edo', 'vkb98tlhwuy', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:36:51.117+00', '2021-09-12 08:36:51.117+00', 'wgjeyh4ebbm'), +('tejycuffoxq', '3ewnbbmr77e', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:36:51.132+00', '2021-09-12 08:36:51.132+00', 'qhn4cgfmid4'), +('ij5vwcnise7', 'twp132yopns', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:36:51.138+00', '2021-09-12 08:36:51.138+00', 'tejycuffoxq'), +('iedl0uekr7p', 'o8th7k38lrx', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:36:51.145+00', '2021-09-12 08:36:51.145+00', 'ij5vwcnise7'), +('b93e0r2xgcd', '0ksp3ytxhb0', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:36:51.153+00', '2021-09-12 08:36:51.153+00', 'iedl0uekr7p'), +('uggb8f8zmvo', 'mzxdezv20k3', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:36:51.169+00', '2021-09-12 08:36:51.169+00', 'u14k2vd1efb'), +('bx3m7q9cod3', 't5261oy16cv', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:36:51.183+00', '2021-09-12 08:36:51.183+00', 'uggb8f8zmvo'), +('kqcvqyqifda', 'ysb0gm7ipdr', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:36:51.222+00', '2021-09-12 08:36:51.222+00', 'vrcee28kir6'), +('s7dr4zgwzu2', 'xscblds33h4', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:36:54.948+00', '2021-09-12 08:36:54.948+00', 'qhn4cgfmid4'), +('egyuyv16xdx', 'gejo5evkfrr', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:36:57.212+00', '2021-09-12 08:36:57.212+00', 'qhn4cgfmid4'), +('yl4ttbe5rdu', 'vv4spmdiohn', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:36:57.849+00', '2021-09-12 08:36:57.849+00', 'qhn4cgfmid4'), +('68fyjoc40sn', 'qzdrxk9fw4h', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:37:03.725+00', '2021-09-12 08:37:03.725+00', 'qhn4cgfmid4'), +('1fg99y0nyqu', 'ngjyt53ti2h', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:37:04.572+00', '2021-09-12 08:37:04.572+00', 'qhn4cgfmid4'), +('qhn4cgfmid4', 'ix2cf9yvbh3', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_bysgds7j36p":{"$dateBefore":"1990-01-01"}}]}}}', '0', 1, '2021-09-12 08:36:51.068+00', '2021-09-12 08:37:40.985+00', 'y4exnjcu2xj'), +('ulvb0fgb1wy', 'cnopigqb2sn', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:37:49.674+00', '2021-09-12 08:37:49.674+00', 'b18l8xg234k'), +('jj6krn50iqy', 'ccqmj8hp8yl', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:37:49.684+00', '2021-09-12 08:37:49.684+00', 'ulvb0fgb1wy'), +('lx4xm5sm849', '55sd21vvdql', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:37:49.699+00', '2021-09-12 08:37:49.699+00', 'ka2aiu7q623'), +('llx7g8tcrh8', 'rojpyy2rlb0', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:37:49.746+00', '2021-09-12 08:37:49.746+00', 'ajiacba4y20'), +('tx4p5icks0g', 'pvu7zmgwos2', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:37:49.769+00', '2021-09-12 08:37:49.769+00', 'ka2aiu7q623'), +('en98iv89tz3', 'yz4guz7tkfe', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:37:49.778+00', '2021-09-12 08:37:49.778+00', 'tx4p5icks0g'), +('j1yifjlgcop', 'qtuwmu91rw8', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:37:49.785+00', '2021-09-12 08:37:49.785+00', 'en98iv89tz3'), +('0c8pimijjil', 'cwjmh9vqkhx', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:37:49.792+00', '2021-09-12 08:37:49.792+00', 'j1yifjlgcop'), +('wgjeyh4ebbm', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:36:51.11+00', '2021-09-12 08:36:51.11+00', NULL), +('vrcee28kir6', 'ua7hewa02l4', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:36:51.212+00', '2021-09-12 08:36:51.212+00', NULL), +('u14k2vd1efb', 'r8xgvjicsdl', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:36:51.161+00', '2021-09-14 02:49:55.129+00', 'b93e0r2xgcd'), +('ajiacba4y20', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:37:49.737+00', '2021-09-12 08:37:49.737+00', NULL), +('p96rm7tano6', 'nkfr8mcy2da', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_x9kmuovlm79","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-12 08:37:49.709+00', '2021-09-14 02:52:05.585+00', 'lx4xm5sm849'), +('fgwqvsi9w8x', 'ro3d04y1u75', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:37:49.808+00', '2021-09-12 08:37:49.808+00', '64s7sekqjq8'), +('n6e781rxua7', 'lzxoy8ww8gn', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:37:49.816+00', '2021-09-12 08:37:49.816+00', 'fgwqvsi9w8x'), +('in3pghga8ux', 'bwwca9it1sq', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:37:49.846+00', '2021-09-12 08:37:49.846+00', 'wynbtyklal2'), +('ka2aiu7q623', 'n0edqj1ge28', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_bysgds7j36p":{"$dateNotBefore":"1989-12-31"}},{"f_bysgds7j36p":{"$dateBefore":"2000-01-01"}}]}}}', '0', 1, '2021-09-12 08:37:49.692+00', '2021-09-12 08:38:42.678+00', 'jj6krn50iqy'), +('mmhhiscomkb', 'l0uufautgle', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:38:45.925+00', '2021-09-12 08:38:45.925+00', 'ka2aiu7q623'), +('2fkhpnufmnd', 'dm5yyw23tj0', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:38:46.863+00', '2021-09-12 08:38:46.863+00', 'ka2aiu7q623'), +('gwcyhvpqiqa', 'o8pypkohdpx', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:38:47.339+00', '2021-09-12 08:38:47.339+00', 'ka2aiu7q623'), +('97hhehv118e', 'vrw7ayglqmg', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:38:50.619+00', '2021-09-12 08:38:50.619+00', 'ka2aiu7q623'), +('1vvorx5wh0r', 'e5craiw1eet', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:38:51.82+00', '2021-09-12 08:38:51.82+00', 'ka2aiu7q623'), +('q9cnmgoizs4', 'u5ul0zadqry', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:39:06.532+00', '2021-09-12 08:39:06.532+00', 'lyrtcuhap91'), +('iz9bagj342d', 'b561q4avrrr', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:39:06.545+00', '2021-09-12 08:39:06.545+00', 'q9cnmgoizs4'), +('3gmi5etie4d', 'zks395j22st', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:39:06.559+00', '2021-09-12 08:39:06.559+00', '9m75f7lvfy0'), +('3v0ag3zwisq', 'f0f5w11d7gj', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:39:06.605+00', '2021-09-12 08:39:06.605+00', 'rdrd85bjgpt'), +('35iu38q69j0', 'bt2i31fip9b', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:39:06.625+00', '2021-09-12 08:39:06.625+00', '9m75f7lvfy0'), +('5cbl3i9bm24', '7g7dsbegje2', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:39:06.633+00', '2021-09-12 08:39:06.633+00', '35iu38q69j0'), +('puap2erydje', '7h02pbuxniz', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-12 08:39:06.661+00', '2021-09-12 08:39:06.661+00', '0g1su1clv5p'), +('mwl3iuhzgkz', 's60vdsnhl21', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:39:06.673+00', '2021-09-12 08:39:06.673+00', 'puap2erydje'), +('83o4cgw0vxi', 'ovvwm5dy4uy', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:39:06.688+00', '2021-09-12 08:39:06.688+00', 'mwl3iuhzgkz'), +('0g1su1clv5p', '5zb6kd0kpkp', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:39:06.651+00', '2021-09-12 08:39:06.651+00', NULL), +('7v2om3nilic', '4yho31yyucl', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:39:06.72+00', '2021-09-12 08:39:06.72+00', NULL), +('wynbtyklal2', 'ft56xw1w8ke', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:37:49.84+00', '2021-09-12 08:37:49.84+00', NULL), +('64s7sekqjq8', '10zwbkklmzm', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:37:49.799+00', '2021-09-14 02:52:20.097+00', '0c8pimijjil'), +('nuy8j8m58u1', 'rxvhz3ivhpu', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_x9kmuovlm79","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-12 08:39:06.565+00', '2021-09-14 02:52:46.003+00', '3gmi5etie4d'), +('rdrd85bjgpt', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:39:06.598+00', '2021-09-12 08:39:06.598+00', NULL), +('ntcz14tcc8g', 'c1m26md1afh', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:39:06.73+00', '2021-09-12 08:39:06.73+00', '7v2om3nilic'), +('xx2hsjfzr6j', '7rgsjkjwy69', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:39:12.39+00', '2021-09-12 08:39:12.39+00', '9m75f7lvfy0'), +('8brcyp46kvh', 't7hxnqdukdt', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:39:13.996+00', '2021-09-12 08:39:13.996+00', '9m75f7lvfy0'), +('st8vl2ccivg', '493hg6k0iw2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:39:17.331+00', '2021-09-12 08:39:17.331+00', '9m75f7lvfy0'), +('n933io8pp55', '63aiub1zaya', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:39:19.423+00', '2021-09-12 08:39:19.423+00', '9m75f7lvfy0'), +('57vb25tmlzw', 'ffci7b4c37j', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:39:20.302+00', '2021-09-12 08:39:20.302+00', '9m75f7lvfy0'), +('9m75f7lvfy0', 'v2o9ow0w7er', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_bysgds7j36p":{"$dateNotBefore":"2000-01-01"}}]}}}', '0', 1, '2021-09-12 08:39:06.553+00', '2021-09-12 08:39:43.339+00', 'iz9bagj342d'), +('lfrjfv6f72v', 'as7qbahq4pp', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:40:14.632+00', '2021-09-12 08:40:14.632+00', 'c3cclt2yb97'), +('ccy102bzglw', '3qrtp9xrl1h', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:40:14.645+00', '2021-09-12 08:40:14.645+00', 'lfrjfv6f72v'), +('k8zd25pz9wi', 'd1l4bffnv3k', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:40:14.659+00', '2021-09-12 08:40:14.659+00', 'lywiji6g7zd'), +('zus6619jjig', 'mwqrjhva1o0', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:40:14.697+00', '2021-09-12 08:40:14.697+00', 'r9ha0s5f7wz'), +('qkpw9y85fm5', '3uwobh5w9uy', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:40:14.716+00', '2021-09-12 08:40:14.716+00', 'lywiji6g7zd'), +('37u68fhyidl', '24xcqfze282', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:40:14.724+00', '2021-09-12 08:40:14.724+00', 'qkpw9y85fm5'), +('jwac7selyvg', 'oa4dk9203mv', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:40:14.731+00', '2021-09-12 08:40:14.731+00', '37u68fhyidl'), +('l0w2v6b5nlo', '0ldvv5davdi', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:40:14.739+00', '2021-09-12 08:40:14.739+00', 'jwac7selyvg'), +('6cwzyf3vxnw', 'nk49bqwrzmh', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:40:14.751+00', '2021-09-12 08:40:14.751+00', 'hxa625xa36k'), +('8vy7mfaasul', 'ya1bxqe6ort', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:40:14.758+00', '2021-09-12 08:40:14.758+00', '6cwzyf3vxnw'), +('li4m0g6zkep', '76ada2v798p', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:40:14.788+00', '2021-09-12 08:40:14.788+00', 'ptvev6ddnik'), +('5f1ubby6wdj', 'hrambihbdvf', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:40:18.102+00', '2021-09-12 08:40:18.102+00', 'lywiji6g7zd'), +('mk99bqhjjdm', 'drzdgw02ba2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:40:18.799+00', '2021-09-12 08:40:18.799+00', 'lywiji6g7zd'), +('3sdszuprkr7', 'yc4bcwaglee', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:40:21.334+00', '2021-09-12 08:40:21.334+00', 'lywiji6g7zd'), +('gh7kjnkwh5x', 'cdj6libpwfn', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:40:24.559+00', '2021-09-12 08:40:24.559+00', 'lywiji6g7zd'), +('b2jy0490ewa', 'ond74oams59', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:40:26.032+00', '2021-09-12 08:40:26.032+00', 'lywiji6g7zd'), +('ptvev6ddnik', '86fyv5k3cx3', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:40:14.78+00', '2021-09-12 08:40:14.78+00', NULL), +('r9ha0s5f7wz', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:40:14.691+00', '2021-09-12 08:40:14.691+00', NULL), +('hxa625xa36k', 'gsfm26v4sfa', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:40:14.745+00', '2021-09-14 02:35:37.97+00', 'l0w2v6b5nlo'), +('r3ar2h3d1j8', 'i0eynpcavuf', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_x9kmuovlm79","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_kk4nspj1i28","f_tdoe0q00xc6"]}}', '0', 1, '2021-09-12 08:40:14.666+00', '2021-09-14 02:35:30.768+00', 'k8zd25pz9wi'), +('lywiji6g7zd', 'jqg2e89q7sk', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_61znsfh307m":{"eq":"plcxasw2xrs"}}]}}}', '0', 1, '2021-09-12 08:40:14.653+00', '2021-09-12 08:42:11.576+00', 'ccy102bzglw'), +('ucc0l51e1zx', 'xd842j8s4o4', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:42:23.602+00', '2021-09-12 08:42:23.602+00', 'gty6jdh9cgb'), +('d2wldjo2j80', 'jrrgp8yz88g', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:44:14.399+00', '2021-09-12 08:44:14.399+00', '4kypox1delu'), +('gty6jdh9cgb', 'kpcr2fkgycn', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:42:23.589+00', '2021-09-12 08:42:23.633+00', 'c3cclt2yb97'), +('8w19pkzz91t', 'b3cs8ptr4il', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:42:20.963+00', '2021-09-12 08:42:20.963+00', NULL), +('tr3yalxh5d9', '6wzb2cveiky', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**日暮会员** 是进入消费末期的会员,请对他们多一些关爱,少一些施压。 \n他们曾经在我们这里疯狂消费过,但现在已经没有钱消费了。","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 08:42:20.97+00', '2021-09-12 08:43:43.283+00', 'ucc0l51e1zx'), +('lqtxb6fmrl0', 'b4rxohyhneh', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:44:14.207+00', '2021-09-12 08:44:14.207+00', 'ydawn45xysc'), +('uy4mfq52mco', '8z51u2ih58s', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:44:14.227+00', '2021-09-12 08:44:14.227+00', 'lqtxb6fmrl0'), +('zm70l5x7g15', 'umo0zj9s1xp', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:44:14.247+00', '2021-09-12 08:44:14.247+00', '3vofd5jtiah'), +('lkq0dy1or82', '24f0tprbabh', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:44:14.298+00', '2021-09-12 08:44:14.298+00', 'xkdrtps4t10'), +('vyh1vhueqgu', 'lv0wouf53z5', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:44:14.315+00', '2021-09-12 08:44:14.315+00', '3vofd5jtiah'), +('50vcknxuoxt', '890jkty4tqn', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:44:14.325+00', '2021-09-12 08:44:14.325+00', 'vyh1vhueqgu'), +('uk4s56729qp', 'wfeh3uglan7', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:44:14.335+00', '2021-09-12 08:44:14.335+00', '50vcknxuoxt'), +('dxc6027epb5', '7vsidpjwl07', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:44:14.342+00', '2021-09-12 08:44:14.342+00', 'uk4s56729qp'), +('lsl7tsg6u3t', '406cf8t3936', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:44:14.355+00', '2021-09-12 08:44:14.355+00', '0xnvoepseqy'), +('5mhcfjjezro', 'zejmbxzo1ks', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:44:14.362+00', '2021-09-12 08:44:14.362+00', 'lsl7tsg6u3t'), +('fwc71lsgz6c', '183g1x3aihx', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:44:18.826+00', '2021-09-12 08:44:18.826+00', '3vofd5jtiah'), +('w9gnkyvtz0r', 'cqueo48hxxz', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:44:19.294+00', '2021-09-12 08:44:19.294+00', '3vofd5jtiah'), +('mub3aeydjk3', '7lnavhv4td2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:44:19.707+00', '2021-09-12 08:44:19.707+00', '3vofd5jtiah'), +('7gwvzo3moc1', 'i007ki9yh3x', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:44:20.171+00', '2021-09-12 08:44:20.171+00', '3vofd5jtiah'), +('bzyr8x1dcv7', '89gadccx8rd', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:44:21.105+00', '2021-09-12 08:44:21.105+00', '3vofd5jtiah'), +('3vofd5jtiah', 'a8vh6ygaz02', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_61znsfh307m":{"eq":"z7wq1mkwmmx"}}]}}}', '0', 1, '2021-09-12 08:44:14.237+00', '2021-09-12 08:44:34.944+00', 'uy4mfq52mco'), +('2qlklaopi83', 'f74yifwxtx0', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:44:39.547+00', '2021-09-12 08:44:39.547+00', NULL), +('xkdrtps4t10', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:44:14.29+00', '2021-09-12 08:44:14.29+00', NULL), +('0xnvoepseqy', '6plpenmwam2', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:44:14.348+00', '2021-09-14 02:34:04.477+00', 'dxc6027epb5'), +('xbtv9pgvlxi', 'fmpepkb6a0v', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:35:02.792+00', '2021-09-14 02:35:02.792+00', 'gr7i73b4ynb'), +('g2ukg354p1p', '5hcspseyptg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:02.8+00', '2021-09-14 02:35:02.8+00', 'xbtv9pgvlxi'), +('qr9p6p6en71', 'iq3f8l47var', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:35:02.807+00', '2021-09-14 02:35:02.807+00', 'g2ukg354p1p'), +('ucuvt8o6hi1', 'fr0ewjbu999', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:35:05.366+00', '2021-09-14 02:35:05.366+00', 'gr7i73b4ynb'), +('a9jfktggp59', 'e0q752c7fuv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:05.374+00', '2021-09-14 02:35:05.374+00', 'ucuvt8o6hi1'), +('c3xe5xx8tes', '9rd5qs80ff0', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:35:05.391+00', '2021-09-14 02:35:05.391+00', 'a9jfktggp59'), +('41mwvjbp3vq', 'scddppvxq6i', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:35:09.79+00', '2021-09-14 02:35:09.79+00', 'o8499ft1p9p'), +('2r53wb0oya9', 'ffucan3qm5s', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:03.832+00', '2021-09-14 02:35:03.832+00', NULL), +('5ghvaf4qa76', 'p4nyimogav6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:40:45.84+00', '2021-09-14 02:40:45.84+00', 'm3g53ifw6yn'), +('tbrkw7j67dv', 'kt8qlsur6ay', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:53:47.067+00', '2021-09-23 02:53:47.067+00', 'd0bz7d7vfpo'), +('je7dsgza1j9', 'adbiyyj09yd', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_tdoe0q00xc6"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 9, '2021-09-12 01:13:58.95+00', '2021-09-26 01:39:52.153+00', 'm25pry2yof2'), +('t52oxa3snwb', 'lauo71skjhg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:44:43.082+00', '2021-09-12 08:44:43.082+00', '8ecbs3dnun1'), +('3wv3paf0sge', 'new0v0nktzd', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:47:06.183+00', '2021-09-12 08:47:06.183+00', '2ov8u7juch7'), +('8ecbs3dnun1', 'e5kfncswel3', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:44:43.069+00', '2021-09-12 08:44:43.108+00', 'ydawn45xysc'), +('dyxqb85322d', 'wv09g7t500j', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**拂晓会员** 是新加入我们的、具备强大消费能力的会员。 \n请将八成以上的力气花在他们身上。","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 08:44:39.555+00', '2021-09-12 08:46:37.728+00', 't52oxa3snwb'), +('029s8xojujc', 'vg4c6euj5nu', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:46:50.489+00', '2021-09-12 08:46:50.489+00', 'r2cj4i4msqb'), +('oksi8kdhwcs', '4s9fop4si0a', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:46:50.501+00', '2021-09-12 08:46:50.501+00', '029s8xojujc'), +('aj47o80vux6', 'xg1kfrbr3nd', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:46:50.516+00', '2021-09-12 08:46:50.516+00', '2ov8u7juch7'), +('5vs1t2xw7ln', '9fcn27kak51', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:46:50.558+00', '2021-09-12 08:46:50.558+00', '9y41wrgu0ge'), +('x5pj3cvw7ru', 'xhfutcbc29x', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:46:50.572+00', '2021-09-12 08:46:50.572+00', '2ov8u7juch7'), +('1ixe761237h', 'qrp3make10i', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:46:50.578+00', '2021-09-12 08:46:50.578+00', 'x5pj3cvw7ru'), +('90m26h0xyt3', 'acz2d9cws16', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:46:50.584+00', '2021-09-12 08:46:50.584+00', '1ixe761237h'), +('gdtnu8u1497', 'vb8rlqu5hie', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:46:50.591+00', '2021-09-12 08:46:50.591+00', '90m26h0xyt3'), +('6pesbd7lqot', 'd6u4lyoylm1', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:46:50.608+00', '2021-09-12 08:46:50.608+00', 'eaartmbv01m'), +('nyqgdbg4i8d', '69m7gxwl7y6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:46:50.616+00', '2021-09-12 08:46:50.616+00', '6pesbd7lqot'), +('ny1bak52tdo', '3cr1ycdelin', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:46:50.644+00', '2021-09-12 08:46:50.644+00', 'eac4je339tn'), +('2vbfgjt94od', '2xbyviyj3ad', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:47:06.552+00', '2021-09-12 08:47:06.552+00', '2ov8u7juch7'), +('2ov8u7juch7', 's6fo9tw8twl', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_61znsfh307m":{"eq":"e3fb46gnarj"}}]}}}', '0', 1, '2021-09-12 08:46:50.509+00', '2021-09-12 08:47:03.033+00', 'oksi8kdhwcs'), +('vsnvo3fheu6', 'lfstm4lwy3w', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:47:07.146+00', '2021-09-12 08:47:07.146+00', '2ov8u7juch7'), +('tvmc3nathto', 'ggcpxv29rsa', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:47:07.574+00', '2021-09-12 08:47:07.574+00', '2ov8u7juch7'), +('hehv31gf34o', 'w5894zxy11w', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:47:08.44+00', '2021-09-12 08:47:08.44+00', '2ov8u7juch7'), +('byqcnkk1o0n', 'u461mmi6zni', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:48:45.962+00', '2021-09-12 08:48:45.962+00', 'lk4lsebzmgd'), +('lk4lsebzmgd', 'ozeaw2s2poe', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:48:45.95+00', '2021-09-12 08:48:45.989+00', 'r2cj4i4msqb'), +('iwvbhqkjowd', '0wxj5nnl4qp', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:48:42.622+00', '2021-09-12 08:48:42.622+00', NULL), +('75uiuzj3a2y', 'j2vz0od5rgs', '按年龄划分', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"usergroupdeleteoutlined"}}', '0', 4, '2021-09-12 08:33:19.08+00', '2021-09-12 08:52:35.711+00', 'k33sn747t75'), +('o6vjinhjhad', '0g0on8947mz', '顾客统计', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"barchartoutlined"}}', '0', 2, '2021-09-12 08:52:30.249+00', '2021-09-12 08:52:35.714+00', 'k33sn747t75'), +('nsnnb9hz5rm', 'ngcih0rah1n', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:52:45.495+00', '2021-09-12 08:52:45.495+00', 'nct31pcy7rs'), +('9y41wrgu0ge', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:46:50.553+00', '2021-09-12 08:46:50.553+00', NULL), +('eaartmbv01m', '7gjddddvgdh', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:46:50.602+00', '2021-09-14 02:34:48.61+00', 'gdtnu8u1497'), +('qfvm0kxnin2', 'oncwf49yxib', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_x9kmuovlm79","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_kk4nspj1i28","f_tdoe0q00xc6"]}}', '0', 1, '2021-09-12 08:46:50.523+00', '2021-09-14 02:40:32.268+00', 'aj47o80vux6'), +('xrlz31gzdpa', 'xm1rki1ti32', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**青柠会员** 不消费,但具备强大的传播能力。 \n请多跟他们进行良好互动,让更多人知道我们。","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 08:48:42.628+00', '2021-09-12 08:50:19.589+00', 'byqcnkk1o0n'), +('hzj9hm79jpb', 'nb4q3h4m6fm', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-12 08:50:24.46+00', '2021-09-12 08:50:24.46+00', 'mjbzwsp9hzr'), +('4owlt01laba', 'a037czgjmm7', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:50:24.472+00', '2021-09-12 08:50:24.472+00', 'hzj9hm79jpb'), +('vl32s3tc17u', 'l4rdtk83fq7', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-12 08:50:24.494+00', '2021-09-12 08:50:24.494+00', 'odl1fsxcrwo'), +('yxw8emezqkh', '28xxazk97t2', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:50:24.532+00', '2021-09-12 08:50:24.532+00', 'jrhau26x5rm'), +('xpf2lims5g4', 'k9qcsnwx7cf', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-12 08:50:24.55+00', '2021-09-12 08:50:24.55+00', 'odl1fsxcrwo'), +('ac275k2rut4', 'kw2l8r3jzat', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-12 08:50:24.557+00', '2021-09-12 08:50:24.557+00', 'xpf2lims5g4'), +('blycm8t9llw', '4e5ozb2rs2w', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-12 08:50:24.566+00', '2021-09-12 08:50:24.566+00', 'ac275k2rut4'), +('03zmue92le1', 'uqedaj59qrn', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-12 08:50:24.573+00', '2021-09-12 08:50:24.573+00', 'blycm8t9llw'), +('o2975lp13lc', '4z0xqjkknfh', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-12 08:50:24.587+00', '2021-09-12 08:50:24.587+00', 'n4ejbe56vdm'), +('xrr3hv2e35h', '6xf2t7dmkr9', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-12 08:50:24.594+00', '2021-09-12 08:50:24.594+00', 'o2975lp13lc'), +('yp6emewwtht', 'af915frez3y', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-12 08:50:24.627+00', '2021-09-12 08:50:24.627+00', 'h4jpb66cjdm'), +('a2ayp2d56oy', 'bnqdfr1t27g', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-12 08:50:27.966+00', '2021-09-12 08:50:27.966+00', 'odl1fsxcrwo'), +('yvk7fhy71uh', '7xzy3sse7ii', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-12 08:50:28.377+00', '2021-09-12 08:50:28.377+00', 'odl1fsxcrwo'), +('3er0hhltgky', '7kh3b64vlsz', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-12 08:50:28.802+00', '2021-09-12 08:50:28.802+00', 'odl1fsxcrwo'), +('82v0rcn61w5', 'g0tfn2t5ptx', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-12 08:50:29.189+00', '2021-09-12 08:50:29.189+00', 'odl1fsxcrwo'), +('mgwhf5su8os', 'c4xupsxz31h', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 7, '2021-09-12 08:50:30.509+00', '2021-09-12 08:50:30.509+00', 'odl1fsxcrwo'), +('odl1fsxcrwo', 'wmdgtv0nagf', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269","defaultFilter":{"and":[{"f_61znsfh307m":{"eq":"h5cxo6g48lj"}}]}}}', '0', 1, '2021-09-12 08:50:24.484+00', '2021-09-12 08:50:41.597+00', '4owlt01laba'), +('lqzy524xdei', 'o8zs925kqc5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:50:57.053+00', '2021-09-12 08:50:57.053+00', 'e5dvxaq0388'), +('uqu3rlkcvq1', '8948hy916a0', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**酱紫会员** 没有消费能力,脾气又很差,会给我们带来负面作用。 \n请尽量远离酱紫会员。","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 08:50:53.634+00', '2021-09-12 08:51:44.094+00', 'lqzy524xdei'), +('e5dvxaq0388', 'kbx96257xtg', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:50:57.039+00', '2021-09-12 08:50:57.092+00', 'mjbzwsp9hzr'), +('ahmifute8tf', 'a6juzklvqwn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:50:53.624+00', '2021-09-12 08:50:53.624+00', NULL), +('63kxtsn2jev', 'mw51lyxfing', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-12 08:52:30.259+00', '2021-09-12 08:52:30.259+00', 'o6vjinhjhad'), +('nct31pcy7rs', '15kyt3px950', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-12 08:52:30.266+00', '2021-09-12 08:52:30.266+00', '63kxtsn2jev'), +('jrhau26x5rm', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-12 08:50:24.525+00', '2021-09-12 08:50:24.525+00', NULL), +('n4ejbe56vdm', '1xvrm1o4dle', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-12 08:50:24.581+00', '2021-09-14 02:40:43.981+00', '03zmue92le1'), +('tzgzestskwi', '28nnixcgcet', NULL, 'void', 'Chart.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"type","yField":"sales","label":{"position":"middle","style":{"fill":"#FFFFFF","opacity":0.6}},"xAxis":{"label":{"autoHide":true,"autoRotate":false}},"meta":{"type":{"alias":"类别"},"sales":{"alias":"销售额"}}}}}', '0', 1, '2021-09-12 08:52:45.514+00', '2021-09-12 08:52:45.514+00', 'oetza8cgh74'), +('bpn9q3lvezd', '4cnlkye7dum', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-12 08:52:50.453+00', '2021-09-12 08:52:50.453+00', 'nsnnb9hz5rm'), +('ps3wofqqdyo', 'kg2stbqe92v', NULL, 'void', 'Chart.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"sales","yField":"type","legend":{"position":"top-left"},"barBackground":{"style":{"fill":"rgba(0,0,0,0.1)"}},"interactions":[{"type":"active-region","enable":false}]}}}', '0', 1, '2021-09-12 08:52:48.243+00', '2021-09-12 08:52:50.463+00', 'bpn9q3lvezd'), +('8clz7vdwv56', 'mn521r0kooi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:52:48.235+00', '2021-09-12 08:52:48.235+00', NULL), +('iwr8wv7xozi', '8lytdanae07', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:53:17.312+00', '2021-09-12 08:53:17.312+00', 'isbff6cje34'), +('9aymm0ny90a', 'ph259yxdu7v', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"这是一段演示文字,**支持使用 Markdown 语法**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-12 08:53:14.935+00', '2021-09-12 08:53:17.32+00', 'iwr8wv7xozi'), +('isbff6cje34', 'drlid9bhtio', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-12 08:53:17.303+00', '2021-09-12 08:53:17.333+00', 'nct31pcy7rs'), +('w6ntyw1h4z8', 'spjeqbwq4t7', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 08:53:14.924+00', '2021-09-12 08:53:14.924+00', NULL), +('eac4je339tn', 'np0gvonqfw5', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:46:50.638+00', '2021-09-12 08:46:50.638+00', NULL), +('kjhvnw35agn', 'rfctdbd1bft', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-12 09:38:49.33+00', '2021-09-12 09:38:49.33+00', NULL), +('hflx0w3au4w', '6cym8cwqq2j', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**订单录入规则** \n在收到订单 30 分钟内录入系统。","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 2, '2021-09-12 09:38:49.34+00', '2021-09-12 09:39:52.537+00', 'bzhnwtjmhbr'), +('m2mvr899l9c', 'o6t2oubr7co', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 08:11:20.41+00', '2021-09-13 08:59:46.49+00', 'vohbzoj2m15'), +('zmnyf7leu5e', '8yzpvptl0cs', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-12 08:11:24.188+00', '2021-09-13 08:59:46.512+00', 'qys5cfp3mdj'), +('9i11iq68qtg', 'e0rf5eyvp9m', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-12 08:11:25.084+00', '2021-09-13 08:59:46.535+00', 'qys5cfp3mdj'), +('z1wudbtmbsa', 'aizbpt370n0', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_hwenour8ara"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-12 07:56:52.836+00', '2021-09-13 08:59:46.609+00', 'ounz7zpirge'), +('by5yqbrtpx7', '652hwtnf3xm', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_hznqtmqljb2"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 07:56:58.113+00', '2021-09-13 08:59:46.613+00', 'ounz7zpirge'), +('ueys85hkayt', 'bfj84hrbfg3', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_u4i0jrp4uo6"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 5, '2021-09-12 07:56:58.665+00', '2021-09-13 08:59:46.618+00', 'ounz7zpirge'), +('b4xp5bvjtjg', '1wr43vlsh76', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 1, '2021-09-13 09:00:00.283+00', '2021-09-13 09:00:00.448+00', 'xiv40kadnzo'), +('09u015raapx', 'jffw6pblhor', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-13 08:59:46.431+00', '2021-09-13 08:59:46.431+00', NULL), +('knyew80qe7m', 'ur4p1j6l28k', '无限级菜单', 'void', 'Menu.SubMenu', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 6, '2021-09-14 00:37:34.725+00', '2021-09-14 00:37:34.725+00', 'on7wtx4zj4i'), +('43f9otxtq42', 'ha38i2gnhwo', '无限级菜单', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar"}', '0', 1, '2021-09-14 00:37:52.049+00', '2021-09-14 00:37:52.049+00', 'knyew80qe7m'), +('k4am0ffi23m', 'wfvv125hmzv', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-14 00:37:52.063+00', '2021-09-14 00:37:52.063+00', '43f9otxtq42'), +('8goe49d2eg2', '2w5cx1jvxe0', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-14 00:37:52.07+00', '2021-09-14 00:37:52.07+00', 'k4am0ffi23m'), +('t4cr6rlmwj3', 'bnnkwq094ay', '查看', 'void', 'Action', '{"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-14 01:04:52.964+00', '2021-09-14 01:04:52.964+00', '5cbl3i9bm24'), +('jsgge2uoolc', 'kubyju669s9', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 01:04:52.974+00', '2021-09-14 01:04:52.974+00', 't4cr6rlmwj3'), +('naf0ppl429i', 'biqievaalho', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 01:04:52.988+00', '2021-09-14 01:04:52.988+00', 'euoi6osj9q0'), +('8g6acfti9ia', 'ngz0a2kkuya', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 01:04:52.996+00', '2021-09-14 01:04:52.996+00', 'naf0ppl429i'), +('4kypox1delu', 'i0us2220e4z', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:44:14.388+00', '2021-09-12 08:44:14.388+00', NULL), +('h4jpb66cjdm', 'y1zsw9rp7df', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-12 08:50:24.62+00', '2021-09-12 08:50:24.62+00', NULL), +('wattie3ufvx', 'ie1pst9ypaj', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 01:05:40.531+00', '2021-09-14 01:05:40.531+00', '14p976cxng2'), +('euoi6osj9q0', 'vra6vd4r7jb', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-14 01:04:52.982+00', '2021-09-14 02:52:55.141+00', 'jsgge2uoolc'), +('viymd750t02', 'fhhijhhecaj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:06:46.581+00', '2021-09-14 01:06:46.581+00', 'uoivj5ie1p6'), +('0lgjw5rm1dm', 'ok9ix85jbw6', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**个人信息**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"FormItem","x-read-pretty":true}', '0', 1, '2021-09-14 01:06:26.461+00', '2021-09-14 01:06:46.592+00', 'viymd750t02'), +('uoivj5ie1p6', 'zirm1wm2zi1', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-14 01:06:46.571+00', '2021-09-14 01:06:46.615+00', 'blgc7o07897'), +('8rp2l6eh3gi', 'abczjhjxap3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-12 01:21:34.517+00', '2021-09-14 01:06:56.379+00', 'n02x4dcefxx'), +('jmid3ozvdyd', '7zp762mjdda', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 1, '2021-09-14 01:06:56.353+00', '2021-09-14 01:06:56.385+00', 'n02x4dcefxx'), +('14p976cxng2', 'modal', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-14 01:05:40.525+00', '2021-09-14 01:05:40.525+00', NULL), +('n7vkysn4ud3', 'vcyu0l7gdug', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 01:07:12.522+00', '2021-09-14 01:07:12.522+00', '9rbzxinxfru'), +('z5ccmldxsxa', '1qohdk68f37', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 01:07:12.533+00', '2021-09-14 01:07:12.533+00', 'n7vkysn4ud3'), +('hy9iyhq8vv3', '16ubffk35wq', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 01:07:12.543+00', '2021-09-14 01:07:12.543+00', 'n7vkysn4ud3'), +('cp6iif41h73', 'm0g1cgn8se9', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 01:07:19.34+00', '2021-09-14 01:07:19.34+00', 'hy9iyhq8vv3'), +('t8v7ibd2nr4', 'cn7zh7pg2bt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:07:19.352+00', '2021-09-14 01:07:19.352+00', 'cp6iif41h73'), +('ra54ry8y783', 'w8retmrk25p', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 01:07:19.359+00', '2021-09-14 01:07:19.359+00', 't8v7ibd2nr4'), +('n00c46suv85', '3djhyemwxnh', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 01:07:20.319+00', '2021-09-14 01:07:20.319+00', 'hy9iyhq8vv3'), +('d58wvj42s30', 'ovy8h3n5o9i', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:07:20.325+00', '2021-09-14 01:07:20.325+00', 'n00c46suv85'), +('cchcemfjyqu', 'laci4uz903f', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 01:07:20.332+00', '2021-09-14 01:07:20.332+00', 'd58wvj42s30'), +('9rbzxinxfru', '7cfy07dtdec', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:07:12.515+00', '2021-09-14 01:07:12.515+00', NULL), +('2kjmofsjfit', '1r7pnfedk6v', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-14 01:55:03.923+00', '2021-09-14 01:55:03.923+00', 'gd7t6lt75n9'), +('tz1wchh95xl', '0vosh4dxkv7', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-14 01:55:03.932+00', '2021-09-14 01:55:03.932+00', '2kjmofsjfit'), +('vahh7rzizdm', 'capdm3zx7iu', '任务日历', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"compassoutlined"}}', '0', 3, '2021-09-03 08:19:14.481+00', '2021-09-14 01:55:03.959+00', '0b73gccskc2'), +('gd7t6lt75n9', '90iqp6z3ila', '第二个里程碑', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"appstoreoutlined"}}', '0', 2, '2021-09-14 01:55:03.906+00', '2021-09-14 01:55:03.964+00', '0b73gccskc2'), +('cohm0upjgc9', 'xr6cqhvbhrw', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:56:02.169+00', '2021-09-14 01:56:02.169+00', '1bv96nx2pwc'), +('8c9p7enbt80', 'nq6zmnsd66j', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**日期**:2021-05-31 \n**目标**:开领放六水队区,于加理位,即T董低深。 日由然育式持何切","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-14 01:55:17.013+00', '2021-09-14 01:56:02.179+00', 'cohm0upjgc9'), +('1bv96nx2pwc', 'fwsls517jxn', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-14 01:56:02.159+00', '2021-09-14 01:56:02.195+00', 'hhhofusmllb'), +('002utxdjm93', 'efotr2xmk41', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:55:17.007+00', '2021-09-14 01:55:17.007+00', NULL), +('62f02qtst2s', '9808j83yjnk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 01:56:37.796+00', '2021-09-14 01:56:37.796+00', 'tz1wchh95xl'), +('p1ntehotqg6', 'o4jjf8rmt4v', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:56:37.807+00', '2021-09-14 01:56:37.807+00', '62f02qtst2s'), +('e58g69uougo', 'tqsxj181sly', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 01:56:55.447+00', '2021-09-14 01:56:55.447+00', 'thkmlkrgwwl'), +('s80r3qfhyv6', 'yqzkjklu5k0', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"**日期**:2022-05-31 \n**目标**:开领放六水队区,于加理位,即T董低深。 日由然育式持何切","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-14 01:56:37.816+00', '2021-09-14 01:56:50.995+00', 'p1ntehotqg6'), +('timjbxw10au', 'f34nakln6f2', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 01:56:55.394+00', '2021-09-14 01:56:55.394+00', 'tz1wchh95xl'), +('0yxjs26qk7k', '2tg680ai0rg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 01:56:55.407+00', '2021-09-14 01:56:55.407+00', 'timjbxw10au'), +('wejcgcx0pg4', 'k9ihxzxb4wj', NULL, 'array', 'Kanban', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Kanban.DesignableBar","x-component-props":{"resource":"t_2uhu4szs1kq","collectionName":"t_2uhu4szs1kq","groupField":{"name":"f_u4i0jrp4uo6"}},"x-decorator":"CardItem","x-decorator-props":{"style":{"background":"none"},"bodyStyle":{"padding":0}}}', '0', 1, '2021-09-14 01:56:55.418+00', '2021-09-14 01:56:55.418+00', '0yxjs26qk7k'), +('9kyk74ciaqd', 'create', '添加卡片', 'void', 'Kanban.Card.AddNew', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"text","icon":"PlusOutlined"}}', '0', 1, '2021-09-14 01:56:55.432+00', '2021-09-14 01:56:55.432+00', 'wejcgcx0pg4'), +('thkmlkrgwwl', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Kanban.useCreateResource }}"},"x-component-props":{"useOkAction":"{{ Kanban.useCreateAction }}"}}', '0', 1, '2021-09-14 01:56:55.441+00', '2021-09-14 01:56:55.441+00', '9kyk74ciaqd'), +('ztai7k9f8pw', 'card1', NULL, 'void', 'Kanban.Card', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-designable-bar":"Kanban.Card.DesignableBar","x-read-pretty":true,"x-decorator-props":{"useResource":"{{ Kanban.useRowResource }}"}}', '0', 2, '2021-09-14 01:56:55.462+00', '2021-09-14 01:56:55.462+00', 'wejcgcx0pg4'), +('fji4cvhzhvw', 'view1', '编辑数据', 'void', 'Kanban.Card.View', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Kanban.useUpdateAction }}"},"x-decorator-props":{"useResource":"{{ Kanban.useSingleResource }}"}}', '0', 3, '2021-09-14 01:56:55.475+00', '2021-09-14 01:56:55.475+00', 'wejcgcx0pg4'), +('wnk2grmfyn9', '6lg0e07epd7', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 01:56:55.486+00', '2021-09-14 01:56:55.486+00', 'fji4cvhzhvw'), +('fenzt8bvs9n', 'utc4wifeoxq', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:19.702+00', '2021-09-14 02:49:19.702+00', 'qatepyha1sc'), +('dx882txy8gl', 'qcmlbgb4boc', '任务', 'void', 'Form.Field', '{"version":"2.0","x-decorator":"Form.Field.Item","x-decorator-props":{"draggable":false},"x-designable-bar":"Kanban.FieldDesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"}}', '0', 1, '2021-09-14 01:57:07.616+00', '2021-09-14 01:57:28.164+00', 'ztai7k9f8pw'), +('s3y580rwbos', '1nh1yrqpq77', NULL, 'void', 'Form.Field', '{"version":"2.0","x-decorator":"Form.Field.Item","x-decorator-props":{"draggable":false},"x-designable-bar":"Kanban.FieldDesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 2, '2021-09-14 01:58:51.539+00', '2021-09-14 01:58:51.539+00', 'ztai7k9f8pw'), +('dhye1xbbr3n', 'ifwcn158lws', 'A 套餐订单', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"filetextoutlined"}}', '0', 2, '2021-09-14 02:00:39.299+00', '2021-09-14 02:00:39.299+00', 'im4un32remd'), +('151ehug7hih', 'dnm4q4ap87c', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-14 02:00:39.308+00', '2021-09-14 02:00:39.308+00', 'dhye1xbbr3n'), +('u23f26ldf54', 'lpc9t7dmkxi', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-14 02:00:39.317+00', '2021-09-14 02:00:39.317+00', '151ehug7hih'), +('1i8da3k889z', '57rmh9147gr', 'B 套餐订单', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"filetextoutlined"}}', '0', 3, '2021-09-14 02:00:53.878+00', '2021-09-14 02:00:53.878+00', 'im4un32remd'), +('0aknnii9t4g', 'uvjxmgglac8', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-14 02:00:53.889+00', '2021-09-14 02:00:53.889+00', '1i8da3k889z'), +('jwe7l7mwhnz', 'ust944ajsjg', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-14 02:00:53.897+00', '2021-09-14 02:00:53.897+00', '0aknnii9t4g'), +('mqr5sytnrex', 'o4rplckg250', 'C 套餐订单', 'void', 'Menu.Link', '{"version":"2.0","x-designable-bar":"Menu.DesignableBar","x-component-props":{"icon":"filetextoutlined"}}', '0', 4, '2021-09-14 02:01:48.336+00', '2021-09-14 02:01:48.336+00', 'im4un32remd'), +('3upg4rqeh4m', 'zuso8ayd0xa', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-14 02:01:48.344+00', '2021-09-14 02:01:48.344+00', 'mqr5sytnrex'), +('1s7iwbmt5wf', 'bkzwg4pwvce', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-14 02:01:48.354+00', '2021-09-14 02:01:48.354+00', '3upg4rqeh4m'), +('xqntv31c34m', 'c7dfrug0yob', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:02:02.638+00', '2021-09-14 02:02:02.638+00', '1q3zjv8vufg'), +('ok3br0urqys', 'nyvtmsx2jwd', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-14 02:07:08.346+00', '2021-09-14 02:07:08.346+00', 'e9mlxdrj2bn'), +('1q3zjv8vufg', 'qfdhwnu16n8', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 0, '2021-09-14 02:02:02.63+00', '2021-09-14 02:02:02.665+00', '3gtya6xukdi'), +('4reyrn1vaxu', 'rs545q75op5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:01:56.998+00', '2021-09-14 02:01:56.998+00', NULL), +('7sxlnsuct7c', 'si15h23v5jh', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-14 02:01:57.006+00', '2021-09-14 02:02:04.965+00', 'xqntv31c34m'), +('jayh1evc8j9', 'bb7h4kh1lmo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:07:08.24+00', '2021-09-14 02:07:08.24+00', 'u23f26ldf54'), +('b5ih0u8e4z6', 'fqr0rhi09gc', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:07:08.251+00', '2021-09-14 02:07:08.251+00', 'jayh1evc8j9'), +('d4jbza292g8', 'ti5gggpmb1o', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:07:08.275+00', '2021-09-14 02:07:08.275+00', 'e9mlxdrj2bn'), +('dxc8ooudc3x', 'ygv4cbc5d00', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:07:08.33+00', '2021-09-14 02:07:08.33+00', '5afapcj9bs5'), +('8ltq1366ub4', '9nme93a72mg', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-14 02:07:08.353+00', '2021-09-14 02:07:08.353+00', 'ok3br0urqys'), +('ru704q8r12j', '9ao5cigoc94', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:07:08.373+00', '2021-09-14 02:07:08.373+00', 'v547zjkxmil'), +('a21afryk2l5', 'c0rb3ey689s', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:07:08.379+00', '2021-09-14 02:07:08.379+00', 'ru704q8r12j'), +('k94022ak2ak', 'zqsi4kb50wk', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:07:08.387+00', '2021-09-14 02:07:08.387+00', 'a21afryk2l5'), +('0sdhkdn333w', 'am0t67qtj90', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-14 02:07:08.405+00', '2021-09-14 02:07:08.405+00', '8ltq1366ub4'), +('r7d7efu9gh5', 'mt4g2qcykv0', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-14 02:07:08.411+00', '2021-09-14 02:07:08.411+00', '0sdhkdn333w'), +('v547zjkxmil', '590lle13nvc', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:07:08.368+00', '2021-09-14 02:07:08.368+00', NULL), +('wh687jm4cxf', 'noqhvqu7xvv', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["1jkpjg7vkgi","qbe1q17p9kh","f_umjewufbyhj","f_kkopbnfdd0v","f_nlgk67tpdql","f_niymyj0no38"]}}', '0', 1, '2021-09-14 02:07:08.293+00', '2021-09-14 02:39:17.179+00', 'd4jbza292g8'), +('5afapcj9bs5', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-14 02:07:08.325+00', '2021-09-14 02:07:08.325+00', NULL), +('tjyy5l9ki1i', '0w1looxnzfb', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:07:08.418+00', '2021-09-14 02:07:08.418+00', 'r7d7efu9gh5'), +('o4tg2peokd5', 'rhjbxr855n8', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:07:37.803+00', '2021-09-14 02:07:37.803+00', 'e9mlxdrj2bn'), +('5r8eu3nqd4d', 'utlhs4ih13p', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:07:39.961+00', '2021-09-14 02:07:39.961+00', 'e9mlxdrj2bn'), +('damo9g06lc7', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:07:41.632+00', '2021-09-14 02:07:41.632+00', 'jolxyuyknoz'), +('c9jze12qbks', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:07:41.641+00', '2021-09-14 02:07:41.641+00', 'damo9g06lc7'), +('dh1pbbmw0my', 'q7fwijgwdy8', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:07:41.649+00', '2021-09-14 02:07:41.649+00', 'c9jze12qbks'), +('p9v4t30i4ys', 'fapsacmaynq', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-14 02:07:41.656+00', '2021-09-14 02:07:41.656+00', 'dh1pbbmw0my'), +('5zr743c9xue', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:07:41.67+00', '2021-09-14 02:07:41.67+00', 'jolxyuyknoz'), +('4qmx5ip2098', 'y2e0dbiqcmq', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:07:41.68+00', '2021-09-14 02:07:41.68+00', '5zr743c9xue'), +('fv42hsbf5r6', 'cj5udd0g3wz', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:07:41.701+00', '2021-09-14 02:07:41.701+00', 'q1j7fk4wlcw'), +('9xm9ir4ylwo', 'f6fisl2bijq', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:07:41.708+00', '2021-09-14 02:07:41.708+00', 'fv42hsbf5r6'), +('dhj0l1h9wgo', 'cy5im7to7bn', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-14 02:07:42.161+00', '2021-09-14 02:07:42.161+00', 'e9mlxdrj2bn'), +('jolxyuyknoz', 'us4irvjlnsl', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e"}},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-14 02:07:41.623+00', '2021-09-14 02:08:18.352+00', 'e9mlxdrj2bn'), +('e9mlxdrj2bn', '74i1aojloju', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9","defaultFilter":{"and":[{"f_nlgk67tpdql":{"eq":"i2xjqmnwrsu"}}]}}}', '0', 1, '2021-09-14 02:07:08.266+00', '2021-09-14 02:08:59.99+00', 'b5ih0u8e4z6'), +('y50drnzf0v6', 'ezn2biv8sfe', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:09:16.89+00', '2021-09-14 02:09:16.89+00', 'jwe7l7mwhnz'), +('fh67smk8zg5', 'ssgjvjh23o5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:09:16.908+00', '2021-09-14 02:09:16.908+00', 'y50drnzf0v6'), +('enp44wj4lo3', 'rfmxa0oqxwx', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:09:16.925+00', '2021-09-14 02:09:16.925+00', 'q9yftfai4d1'), +('ff8v6fj121d', 'dle42ibjswv', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:09:16.966+00', '2021-09-14 02:09:16.966+00', '77ve1cwj3bp'), +('uisubwsu25i', 'ja3ct2odrmv', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-14 02:09:16.982+00', '2021-09-14 02:09:16.982+00', 'q9yftfai4d1'), +('dy9304lki72', 'vmdwuhwunnn', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-14 02:09:16.992+00', '2021-09-14 02:09:16.992+00', 'uisubwsu25i'), +('tkuh93yjiq9', '1tg3j0k20kg', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:09:17.021+00', '2021-09-14 02:09:17.021+00', 'orju7878qmn'), +('1lwdufq0f1x', 'ebmsuzf9zp1', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:09:17.028+00', '2021-09-14 02:09:17.028+00', 'tkuh93yjiq9'), +('77ve1cwj3bp', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-14 02:09:16.959+00', '2021-09-14 02:09:16.959+00', NULL), +('orju7878qmn', '6jlnemo5sr2', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:09:17.014+00', '2021-09-14 02:09:17.014+00', NULL), +('q1j7fk4wlcw', 'gpkbej0n524', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-14 02:07:41.688+00', '2021-09-14 03:14:42.24+00', '4qmx5ip2098'), +('yjqn0hmxh0u', 'bo13tex6beo', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:09:17.036+00', '2021-09-14 02:09:17.036+00', '1lwdufq0f1x'), +('d2l2wpf9776', '6xvhz5efm8o', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-14 02:09:17.057+00', '2021-09-14 02:09:17.057+00', 'dy9304lki72'), +('m4hzdcu8grv', 'aak0c7s8mfz', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-14 02:09:17.064+00', '2021-09-14 02:09:17.064+00', 'd2l2wpf9776'), +('ia04dgr8sz7', 'eaf6lf8qd8x', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:09:17.07+00', '2021-09-14 02:09:17.07+00', 'm4hzdcu8grv'), +('kae8e4o1hxz', 'toqoq12e0ga', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:09:20.965+00', '2021-09-14 02:09:20.965+00', 'q9yftfai4d1'), +('kseicj7iysk', 'h9y9ejy0i3i', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:09:24.184+00', '2021-09-14 02:09:24.184+00', 'q9yftfai4d1'), +('k4g9l87ljr8', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:09:27.26+00', '2021-09-14 02:09:27.26+00', 'ahcn7zdd3dv'), +('r4ika0ccev6', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:09:27.267+00', '2021-09-14 02:09:27.267+00', 'k4g9l87ljr8'), +('sbytqwdz0nb', 'p81pk5cjdan', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:09:27.274+00', '2021-09-14 02:09:27.274+00', 'r4ika0ccev6'), +('sb1tnzivz5d', 'zchag75nr3a', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-14 02:09:27.28+00', '2021-09-14 02:09:27.28+00', 'sbytqwdz0nb'), +('ozo2r5999eb', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:09:27.3+00', '2021-09-14 02:09:27.3+00', 'ahcn7zdd3dv'), +('bkjuejg5d6h', 'vgjgm06v8k5', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:09:27.307+00', '2021-09-14 02:09:27.307+00', 'ozo2r5999eb'), +('bevxxm42ovn', 'ggirntzvtsg', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:09:27.325+00', '2021-09-14 02:09:27.325+00', 'ocpn6b3lple'), +('fcpy7imnago', 'b6y4v42u9jq', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:09:27.332+00', '2021-09-14 02:09:27.332+00', 'bevxxm42ovn'), +('tbga43xe0zl', '2gwiytoxfb0', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-14 02:09:28.069+00', '2021-09-14 02:09:28.069+00', 'q9yftfai4d1'), +('ahcn7zdd3dv', 'kmcmoabsr4v', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e"}},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-14 02:09:27.252+00', '2021-09-14 02:09:40.131+00', 'q9yftfai4d1'), +('q9yftfai4d1', 'vfdi7c0xnha', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9","defaultFilter":{"and":[{"f_nlgk67tpdql":{"eq":"x4qnavatfai"}}]}}}', '0', 1, '2021-09-14 02:09:16.917+00', '2021-09-14 02:09:51.425+00', 'fh67smk8zg5'), +('ng42ag22ohx', 'l9ay7h6i47q', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:09:58.816+00', '2021-09-14 02:09:58.816+00', '1s7iwbmt5wf'), +('h8cm6cj9iq8', 'z3omduzrzvw', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:09:58.828+00', '2021-09-14 02:09:58.828+00', 'ng42ag22ohx'), +('zm35u9cu0dj', 'k5i7rf1pcra', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:09:58.852+00', '2021-09-14 02:09:58.852+00', 'lid02o3i3it'), +('f1eri48rmyg', 'z6qu2xnxojs', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:09:58.896+00', '2021-09-14 02:09:58.896+00', 'sag15ob9oep'), +('q15dftcuff4', '1atifnh2n82', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-14 02:09:58.914+00', '2021-09-14 02:09:58.914+00', 'lid02o3i3it'), +('zv0dxyomtil', '762ocudbyx2', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-14 02:09:58.92+00', '2021-09-14 02:09:58.92+00', 'q15dftcuff4'), +('sag15ob9oep', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-14 02:09:58.887+00', '2021-09-14 02:09:58.887+00', NULL), +('l9xfel5beq9', '2aiiooedvc3', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["1jkpjg7vkgi","qbe1q17p9kh","f_umjewufbyhj","f_kkopbnfdd0v","f_nlgk67tpdql","f_niymyj0no38"]}}', '0', 1, '2021-09-14 02:09:58.859+00', '2021-09-14 02:39:26.621+00', 'zm35u9cu0dj'), +('ocpn6b3lple', '333bc2f4k3g', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-14 02:09:27.317+00', '2021-09-14 03:15:41.427+00', 'bkjuejg5d6h'), +('bxdlx7his6h', 'd975wpk687r', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:09:58.942+00', '2021-09-14 02:09:58.942+00', 'qcf4olotfg4'), +('graewvh6zya', 'tnmch62t9n6', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:09:58.948+00', '2021-09-14 02:09:58.948+00', 'bxdlx7his6h'), +('oyt3pwwitwl', 'dvhkc4cmrny', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:09:58.956+00', '2021-09-14 02:09:58.956+00', 'graewvh6zya'), +('nmxpejypmzp', 'yncjsw7hul8', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-14 02:09:58.975+00', '2021-09-14 02:09:58.975+00', 'zv0dxyomtil'), +('qlvbmlugina', 'u8m7xurgx2l', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-14 02:09:58.984+00', '2021-09-14 02:09:58.984+00', 'nmxpejypmzp'), +('cmm4rlf147h', 'rtf9ou2tvve', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 02:09:58.991+00', '2021-09-14 02:09:58.991+00', 'qlvbmlugina'), +('z43cvnqn0w3', 'w6nq1pmq8wa', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:10:02.406+00', '2021-09-14 02:10:02.406+00', 'lid02o3i3it'), +('umcug24alkr', 'estgi0www12', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:10:04.852+00', '2021-09-14 02:10:04.852+00', 'lid02o3i3it'), +('280lxyzoir2', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:10:07.762+00', '2021-09-14 02:10:07.762+00', 'w6mruw1t8hi'), +('zwkphsuyx2l', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:10:07.769+00', '2021-09-14 02:10:07.769+00', '280lxyzoir2'), +('7vxwpwbplvc', '9qsx07bny89', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:10:07.776+00', '2021-09-14 02:10:07.776+00', 'zwkphsuyx2l'), +('mkez96qhvco', '2gkvd176uyd', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-14 02:10:07.786+00', '2021-09-14 02:10:07.786+00', '7vxwpwbplvc'), +('w5ea27zspwm', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:10:07.813+00', '2021-09-14 02:10:07.813+00', 'w6mruw1t8hi'), +('82vnr4b2qj2', 'malsfticzdz', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:10:07.824+00', '2021-09-14 02:10:07.824+00', 'w5ea27zspwm'), +('89rrjmd74cf', 'feeyqrr1rqy', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:10:07.837+00', '2021-09-14 02:10:07.837+00', 'meh9l97y2nm'), +('xslmb0aczns', 'ofl08cgp5ag', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:10:07.846+00', '2021-09-14 02:10:07.846+00', '89rrjmd74cf'), +('eyrqwfkmh6a', 'vuhv8ruxch7', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 6, '2021-09-14 02:10:08.284+00', '2021-09-14 02:10:08.284+00', 'lid02o3i3it'), +('w6mruw1t8hi', 'npfwcoxra3m', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e"}},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-14 02:10:07.753+00', '2021-09-14 02:10:18.428+00', 'lid02o3i3it'), +('lid02o3i3it', 'mjyovo1npf3', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9","defaultFilter":{"and":[{"f_nlgk67tpdql":{"eq":"tqgda8p724l"}}]}}}', '0', 1, '2021-09-14 02:09:58.843+00', '2021-09-14 02:10:28.178+00', 'h8cm6cj9iq8'), +('l2uq7pgdrht', 'yaf5vsb5dz3', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"collectionName":"t_geso7fru7a9","resourceName":"f_c8mes0kp1zt","associatedName":"t_fsveob6p269","useResource":"{{ Association.useResource }}"}}', '0', 1, '2021-09-12 01:23:35.19+00', '2021-09-14 02:32:27.112+00', 'ugv0r28257r'), +('2o1qlpp5beu', 'ruimtpj8zwm', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:33:25.168+00', '2021-09-14 02:33:25.168+00', '5mhcfjjezro'), +('djpnuoszy3c', 'zprooua8j6y', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:25.182+00', '2021-09-14 02:33:25.182+00', '2o1qlpp5beu'), +('x8ldh7nt5g3', 'kh18lunyth5', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:33:25.19+00', '2021-09-14 02:33:25.19+00', 'djpnuoszy3c'), +('hj7pmkhelii', 'x0itzuj4824', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:33:25.198+00', '2021-09-14 02:33:25.198+00', 'x8ldh7nt5g3'), +('que938u74zn', 'qhe8h5g24el', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:33:25.213+00', '2021-09-14 02:33:25.213+00', 'x8ldh7nt5g3'), +('ds8p6lzzlv8', 'urviytqjrzk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:33:28.001+00', '2021-09-14 02:33:28.001+00', 'que938u74zn'), +('o17e3ym338y', '2ai68sqkgcm', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:28.011+00', '2021-09-14 02:33:28.011+00', 'ds8p6lzzlv8'), +('qcf4olotfg4', '57qhvjsew2f', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:09:58.936+00', '2021-09-14 02:09:58.936+00', NULL), +('meh9l97y2nm', 'bwuc9pb8ktg', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar","x-component-props":{"singleton":true}}', '0', 1, '2021-09-14 02:10:07.832+00', '2021-09-14 03:16:08.212+00', '82vnr4b2qj2'), +('928j436dz3s', '1ws27t248jt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:33:28.019+00', '2021-09-14 02:33:28.019+00', 'o17e3ym338y'), +('i02wlr5fphp', 'e7k0n3er7nk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:33:33.638+00', '2021-09-14 02:33:33.638+00', 'que938u74zn'), +('4m5ht8hhvdi', 'kwbswznqyv5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:33.646+00', '2021-09-14 02:33:33.646+00', 'i02wlr5fphp'), +('pcxkpsoszcv', 'iehhoi2kvfi', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:33:33.652+00', '2021-09-14 02:33:33.652+00', '4m5ht8hhvdi'), +('77tm0s99g4m', '6qcc16aclcs', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:33:39.8+00', '2021-09-14 02:33:39.8+00', 'que938u74zn'), +('mwrct1kkarf', 'mzcfw7tykbj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:39.806+00', '2021-09-14 02:33:39.806+00', '77tm0s99g4m'), +('4z0c0068a9t', 'vy851m8ttou', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:33:39.813+00', '2021-09-14 02:33:39.813+00', 'mwrct1kkarf'), +('j63qzk1ssnw', '4oklwaqpjpc', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:33:42.519+00', '2021-09-14 02:33:42.519+00', 'que938u74zn'), +('t98eob4eakr', 'f9y49mgn7ca', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:42.526+00', '2021-09-14 02:33:42.526+00', 'j63qzk1ssnw'), +('nkljjmc0mro', '75dsut03jh9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:33:42.534+00', '2021-09-14 02:33:42.534+00', 't98eob4eakr'), +('6cy5jyc9kn5', 'e9wall96av0', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:33:43.16+00', '2021-09-14 02:33:43.16+00', 'que938u74zn'), +('isz0szdilh9', 'ivnjzdlgqq6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:43.167+00', '2021-09-14 02:33:43.167+00', '6cy5jyc9kn5'), +('b6omyai1d4o', 'r99vh4ubzpw', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:33:43.174+00', '2021-09-14 02:33:43.174+00', 'isz0szdilh9'), +('oa9cha4eq85', 'oqmoexwmpfd', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:33:49.97+00', '2021-09-14 02:33:49.97+00', 'ds8p6lzzlv8'), +('z790f34pwxn', '4sgo40m6ndl', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:33:29.44+00', '2021-09-14 02:33:49.982+00', 'oa9cha4eq85'), +('zg6o3mwulvr', '7zjz1suzli0', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:29.432+00', '2021-09-14 02:33:29.432+00', NULL), +('vdtg8lnk123', 'a6og8y9rh5u', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:33:53.287+00', '2021-09-14 02:33:53.287+00', 'i02wlr5fphp'), +('gtsevfuusyp', '91qjsbe5k3l', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:33:36.514+00', '2021-09-14 02:33:53.3+00', 'vdtg8lnk123'), +('31brdcsmxw3', '6tm8xb73iu3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:36.507+00', '2021-09-14 02:33:36.507+00', NULL), +('b8rk2xvdryz', '8a9xemyu2lg', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:33:56.11+00', '2021-09-14 02:33:56.11+00', '77tm0s99g4m'), +('xrbvufwttrt', '3cg7pazrimy', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:33:40.765+00', '2021-09-14 02:33:56.118+00', 'b8rk2xvdryz'), +('m55oeth1uzr', 'imvi3do6zqg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:33:40.759+00', '2021-09-14 02:33:40.759+00', NULL), +('as67zrrpfwt', '6vc2z0hwm8g', '筛选', 'void', 'Table.Filter', '{"version":"2.0","x-align":"left","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_x9kmuovlm79","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_kk4nspj1i28","f_tdoe0q00xc6"]}}', '0', 1, '2021-09-14 02:33:08.678+00', '2021-09-14 02:34:22.33+00', 'zm70l5x7g15'), +('qzr4j6yc68r', '0uesmlp9lk7', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_x9kmuovlm79","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_kk4nspj1i28","f_tdoe0q00xc6"]}}', '0', 1, '2021-09-12 01:11:33.894+00', '2021-09-14 02:34:31.766+00', 'aslfo2li593'), +('w0csd3eo6ka', 'xcvjmi4dmei', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:34:50.405+00', '2021-09-14 02:34:50.405+00', 'nyqgdbg4i8d'), +('85yr90xanlt', '148iinofhjj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:34:50.415+00', '2021-09-14 02:34:50.415+00', 'w0csd3eo6ka'), +('rw191y49o3r', 'kvzn9uyvxuw', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:34:50.425+00', '2021-09-14 02:34:50.425+00', '85yr90xanlt'), +('h2msuc9om11', 'yv48iu6q77l', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:34:50.433+00', '2021-09-14 02:34:50.433+00', 'rw191y49o3r'), +('gr7i73b4ynb', '24o1teki8ew', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:34:50.445+00', '2021-09-14 02:34:50.445+00', 'rw191y49o3r'), +('o8499ft1p9p', 'ustz7jb1z3a', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:34:53.551+00', '2021-09-14 02:34:53.551+00', 'gr7i73b4ynb'), +('mzz271zlkp6', 'oaw5ywosybo', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:34:53.564+00', '2021-09-14 02:34:53.564+00', 'o8499ft1p9p'), +('h48fpskp236', 'ur2a9excqax', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:34:53.575+00', '2021-09-14 02:34:53.575+00', 'mzz271zlkp6'), +('gyzptki2fj3', 'n2feu8w088x', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:34:57.638+00', '2021-09-14 02:34:57.638+00', 'gr7i73b4ynb'), +('8xmup2y7dvi', 'izlteyv1f5t', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:34:57.646+00', '2021-09-14 02:34:57.646+00', 'gyzptki2fj3'), +('goe9u3mkc09', 'cjdj5rxbfek', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:34:57.655+00', '2021-09-14 02:34:57.655+00', '8xmup2y7dvi'), +('oml2je85jr1', 'vqn5ru79bus', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:34:56.458+00', '2021-09-14 02:34:56.458+00', NULL), +('yx7az2k2tnz', 'b6jszb7b814', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:35:05.928+00', '2021-09-14 02:35:05.928+00', 'gr7i73b4ynb'), +('skvt17ror16', 'frjvd7qdkeq', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:05.934+00', '2021-09-14 02:35:05.934+00', 'yx7az2k2tnz'), +('uy2z0s3jtsz', '0i591g2wlbe', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:35:05.94+00', '2021-09-14 02:35:05.94+00', 'skvt17ror16'), +('0be4vbhx2oz', 'p8a77d0mwm7', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:34:59.873+00', '2021-09-14 02:35:13.941+00', 'r1l6xnhdqq0'), +('fsjfoji1zb1', 'dmmra4zvcod', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:34:56.468+00', '2021-09-14 02:35:09.803+00', '41mwvjbp3vq'), +('r1l6xnhdqq0', 'zs6a72e4o1g', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:35:13.929+00', '2021-09-14 02:35:13.929+00', 'gyzptki2fj3'), +('k6m3piasr4y', '8upyca407oq', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:35:17.091+00', '2021-09-14 02:35:17.091+00', 'xbtv9pgvlxi'), +('90k7s8ylu4o', '41na2at2dde', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:35:03.841+00', '2021-09-14 02:35:17.101+00', 'k6m3piasr4y'), +('rhcpbx61ahk', 'pxa7jsdcvgn', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:35:36.16+00', '2021-09-14 02:35:36.16+00', '8vy7mfaasul'), +('hn8t7bduaye', '4ipt7ufeoor', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:36.167+00', '2021-09-14 02:35:36.167+00', 'rhcpbx61ahk'), +('wxik6h90m31', '9u9oi57xg3b', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:35:36.181+00', '2021-09-14 02:35:36.181+00', 'hn8t7bduaye'), +('d6iiwd1tc7h', 'an6g3d9w87p', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:35:36.189+00', '2021-09-14 02:35:36.189+00', 'wxik6h90m31'), +('k450jgmapko', 'w6fb06mqfqp', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:35:36.199+00', '2021-09-14 02:35:36.199+00', 'wxik6h90m31'), +('gzoy8oaqybn', 'btviea4hdib', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:35:40.487+00', '2021-09-14 02:35:40.487+00', 'k450jgmapko'), +('aur5angfspx', '66o2w9d31ru', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:40.493+00', '2021-09-14 02:35:40.493+00', 'gzoy8oaqybn'), +('ztt1ij2fw8e', 'pnpj9jg6025', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:35:40.5+00', '2021-09-14 02:35:40.5+00', 'aur5angfspx'), +('t8hnv75bh87', '48ulm4d84dz', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:35:42.883+00', '2021-09-14 02:35:42.883+00', 'k450jgmapko'), +('t7g27y27c8j', '8v40a4fqimz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:42.889+00', '2021-09-14 02:35:42.889+00', 't8hnv75bh87'), +('jkko8lt0dzr', 'w6awg8ks9wt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:35:42.895+00', '2021-09-14 02:35:42.895+00', 't7g27y27c8j'), +('8h7eyjj4muw', 'ayhrl4uap76', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-14 02:35:44.877+00', '2021-09-14 02:35:44.877+00', 'k450jgmapko'), +('a2uwqq0aubr', '4koofmn05l8', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:44.883+00', '2021-09-14 02:35:44.883+00', '8h7eyjj4muw'), +('58pdnkrc9c3', 'jdq6ejtvg6f', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:35:44.889+00', '2021-09-14 02:35:44.889+00', 'a2uwqq0aubr'), +('dxr1scs1cm2', 'e5e7u4fqr84', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:35:49.005+00', '2021-09-14 02:35:49.005+00', 'k450jgmapko'), +('0wrlvmjh9wz', 'fo12ki2wbjd', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:49.014+00', '2021-09-14 02:35:49.014+00', 'dxr1scs1cm2'), +('t75ivejidem', 'ugxc36s7ika', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:35:49.021+00', '2021-09-14 02:35:49.021+00', '0wrlvmjh9wz'), +('omcdo1sj2wj', 'z090kaif3d5', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:35:49.381+00', '2021-09-14 02:35:49.381+00', 'k450jgmapko'), +('jssqk5nm6jy', '0rwdnbkrxw1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:49.389+00', '2021-09-14 02:35:49.389+00', 'omcdo1sj2wj'), +('bxw1lo8oese', '9vz35226snr', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:35:49.401+00', '2021-09-14 02:35:49.401+00', 'jssqk5nm6jy'), +('t6y48ox5ek9', 'e5uawhnc1rn', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:35:51.808+00', '2021-09-14 02:35:51.808+00', 'gzoy8oaqybn'), +('ckwpqskkims', '0aedc8ndj1o', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:35:42.299+00', '2021-09-14 02:35:51.824+00', 't6y48ox5ek9'), +('jdch6mimcpe', '8w8tvfushn9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:42.287+00', '2021-09-14 02:35:42.287+00', NULL), +('n27tfa4y42m', 'vc66ctlglib', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:35:57.088+00', '2021-09-14 02:35:57.088+00', 't8hnv75bh87'), +('08qo3egyo9t', 'h7h78bggz9a', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:35:46.663+00', '2021-09-14 02:35:57.095+00', 'n27tfa4y42m'), +('y3ozhae71bl', 'djfvl7lz8fa', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:46.654+00', '2021-09-14 02:35:46.654+00', NULL), +('iawhadxi2ii', '25y2rqwnxff', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:35:47.857+00', '2021-09-14 02:35:59.379+00', 'nq1n50mtc06'), +('nq1n50mtc06', 'vu5quxfp2k2', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-14 02:35:59.372+00', '2021-09-14 02:35:59.401+00', '8h7eyjj4muw'), +('ngq3m2quch2', 'cr4gbbiz4uz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:35:47.848+00', '2021-09-14 02:35:47.848+00', NULL), +('b7xe0rmdh9k', 'yd1jtexpp5p', '筛选', 'void', 'Table.Filter', '{"version":"2.0","x-align":"left","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_x9kmuovlm79","f_3det6kr3vn8","f_61znsfh307m","f_bysgds7j36p","f_kk4nspj1i28","f_tdoe0q00xc6"]}}', '0', 4, '2021-09-14 02:36:08.175+00', '2021-09-14 02:38:57.216+00', 'vl32s3tc17u'), +('v43vdjuy1hi', '82gtozixasq', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["1jkpjg7vkgi","qbe1q17p9kh","f_umjewufbyhj","f_kkopbnfdd0v","f_nlgk67tpdql","f_niymyj0no38"]}}', '0', 1, '2021-09-14 02:09:16.933+00', '2021-09-14 02:39:23.043+00', 'enp44wj4lo3'), +('hfwc76otsp4', 'rvqmndd7b14', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:40:45.792+00', '2021-09-14 02:40:45.792+00', 'xrr3hv2e35h'), +('40tvf4u3vr1', 'sh9xqf1hzi7', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:40:45.807+00', '2021-09-14 02:40:45.807+00', 'hfwc76otsp4'), +('m3g53ifw6yn', 'mnzdsc4j4cv', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:40:45.815+00', '2021-09-14 02:40:45.815+00', '40tvf4u3vr1'), +('qatepyha1sc', 'pb34jurz9fl', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:49:19.688+00', '2021-09-14 02:49:19.688+00', '5ghvaf4qa76'), +('37rjxzpqvwj', '3vvt0ooraf9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:49:19.715+00', '2021-09-14 02:49:19.715+00', 'fenzt8bvs9n'), +('34p6e76ny0h', 'f6fkwvu1647', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:49:23.466+00', '2021-09-14 02:49:23.466+00', '5ghvaf4qa76'), +('57rb3nhpol4', 'dw6xtjxejd2', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:23.473+00', '2021-09-14 02:49:23.473+00', '34p6e76ny0h'), +('n0c0h7vlugl', 'ye26ptmca9s', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:49:23.481+00', '2021-09-14 02:49:23.481+00', '57rb3nhpol4'), +('y39vmjm9gi3', '2yuawrxjxbx', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:49:26.977+00', '2021-09-14 02:49:26.977+00', '5ghvaf4qa76'), +('3vjh0zkksa0', 'vovsvu836ej', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:26.985+00', '2021-09-14 02:49:26.985+00', 'y39vmjm9gi3'), +('u20x16pdjet', 'gpv91am7g58', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:49:26.991+00', '2021-09-14 02:49:26.991+00', '3vjh0zkksa0'), +('t5rz2klyssi', 'mxlvv6g6igo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:49:29.015+00', '2021-09-14 02:49:29.015+00', '5ghvaf4qa76'), +('4z5jabxk87c', '8i0ebo4imfa', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:29.023+00', '2021-09-14 02:49:29.023+00', 't5rz2klyssi'), +('2mvdd8pa4jb', 'wq3arzq29yq', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:49:29.029+00', '2021-09-14 02:49:29.029+00', '4z5jabxk87c'), +('arqtg1534lz', '4acft85jrws', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:49:29.566+00', '2021-09-14 02:49:29.566+00', '5ghvaf4qa76'), +('92e590oysof', '10fd7irvf6u', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:29.574+00', '2021-09-14 02:49:29.574+00', 'arqtg1534lz'), +('blvsyd82bye', 'za9gv4ozjnf', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:49:29.581+00', '2021-09-14 02:49:29.581+00', '92e590oysof'), +('e5ufhe8xm9w', 'rzxij1aaqj7', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:49:33.006+00', '2021-09-14 02:49:33.006+00', 'qatepyha1sc'), +('u6t381a6v7o', 'rjjohfss6ro', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:49:21.443+00', '2021-09-14 02:49:33.018+00', 'e5ufhe8xm9w'), +('6yudx84b0h0', 'zg7pymemo3r', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:21.432+00', '2021-09-14 02:49:21.432+00', NULL), +('0uv2rs6ibbr', 'niineejsmcd', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:49:34.97+00', '2021-09-14 02:49:34.97+00', '34p6e76ny0h'), +('qekn1k2j7ma', 'llg16rqa4u4', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:49:24.79+00', '2021-09-14 02:49:34.98+00', '0uv2rs6ibbr'), +('qc7l7z7ali3', 'qto5odswtbp', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:24.781+00', '2021-09-14 02:49:24.781+00', NULL), +('o195gt5t1v0', 'omgvnacqvbq', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:49:36.773+00', '2021-09-14 02:49:36.773+00', 'y39vmjm9gi3'), +('f47c7b9w1r2', 'ek67od4p3hp', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:49:27.859+00', '2021-09-14 02:49:36.789+00', 'o195gt5t1v0'), +('spode7pah10', 'exz39agmply', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:27.852+00', '2021-09-14 02:49:27.852+00', NULL), +('czuaolbcf90', 'ynp9yukyt2v', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:49:57.312+00', '2021-09-14 02:49:57.312+00', 'bx3m7q9cod3'), +('hvts6gnqh7o', '1vd9zhj099m', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:57.319+00', '2021-09-14 02:49:57.319+00', 'czuaolbcf90'), +('q7obl8uu2we', 'u6e9xpuhnfw', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:49:57.326+00', '2021-09-14 02:49:57.326+00', 'hvts6gnqh7o'), +('i1xjs6e5mz6', 'uftspdhvqfl', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:49:57.333+00', '2021-09-14 02:49:57.333+00', 'q7obl8uu2we'), +('hxhdhpobj8o', 'gmn8gv5u8i1', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:49:57.341+00', '2021-09-14 02:49:57.341+00', 'q7obl8uu2we'), +('kx2wfqro606', 'u7ii1qvu4gh', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:49:59.578+00', '2021-09-14 02:49:59.578+00', 'hxhdhpobj8o'), +('qf5b8qc48hw', '7aesp6jzev1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:49:59.586+00', '2021-09-14 02:49:59.586+00', 'kx2wfqro606'), +('zz5ahgihju2', 'ai2had7u7sa', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:49:59.592+00', '2021-09-14 02:49:59.592+00', 'qf5b8qc48hw'), +('b4kgukcwrt2', '1mvr3p9wppu', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:50:02.623+00', '2021-09-14 02:50:02.623+00', 'hxhdhpobj8o'), +('d7be9d7fot3', '63wz3syvqk3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:02.631+00', '2021-09-14 02:50:02.631+00', 'b4kgukcwrt2'), +('o3ed56mzrkj', '23y2ac4q9gw', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:50:02.639+00', '2021-09-14 02:50:02.639+00', 'd7be9d7fot3'), +('bpfi06q38s0', 'el13bp83nzc', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:50:05.133+00', '2021-09-14 02:50:05.133+00', 'hxhdhpobj8o'), +('q0bpojh64kh', 'ong1m1b61um', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:05.139+00', '2021-09-14 02:50:05.139+00', 'bpfi06q38s0'), +('6nc22hmh8zy', 'hb5r0om7r39', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:01.672+00', '2021-09-14 02:50:01.672+00', NULL), +('4p79ndgc8he', 'x7eoebihmve', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:50:03.428+00', '2021-09-14 02:50:16.279+00', '8za90otebg8'), +('vv99anlv2cz', 'izdgzjti4vt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:03.418+00', '2021-09-14 02:50:03.418+00', NULL), +('hpc9i7s5r2s', '2aait9gtymu', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:50:05.146+00', '2021-09-14 02:50:05.146+00', 'q0bpojh64kh'), +('59zimhmik1c', 'cerbf0pnmhd', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:50:08.957+00', '2021-09-14 02:50:08.957+00', 'hxhdhpobj8o'), +('9cfi91ifz8m', 'teodmxglicr', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:08.965+00', '2021-09-14 02:50:08.965+00', '59zimhmik1c'), +('kmdv5d6w4ct', 'o24ugxe5y3t', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:50:08.973+00', '2021-09-14 02:50:08.973+00', '9cfi91ifz8m'), +('8dkt3yxwc02', 'iq1vuvj51zg', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:50:09.698+00', '2021-09-14 02:50:09.698+00', 'hxhdhpobj8o'), +('phdvkfv1z5n', '6jp8cssnr7n', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:09.706+00', '2021-09-14 02:50:09.706+00', '8dkt3yxwc02'), +('vsueg1fbm3q', '2f3xidqerrd', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:50:09.715+00', '2021-09-14 02:50:09.715+00', 'phdvkfv1z5n'), +('ocg2ekkj9g0', 'pez2ld1klva', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:50:13.701+00', '2021-09-14 02:50:13.701+00', 'kx2wfqro606'), +('fmgdeobsr1g', '70667jjezeq', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:50:01.682+00', '2021-09-14 02:50:13.713+00', 'ocg2ekkj9g0'), +('8za90otebg8', 'kh2yasrxucc', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:50:16.263+00', '2021-09-14 02:50:16.263+00', 'b4kgukcwrt2'), +('a8cr9h0p88u', '6vmurewjr41', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:50:18.375+00', '2021-09-14 02:50:18.375+00', 'bpfi06q38s0'), +('62gsndwgb8m', '9na2sin023k', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:50:06.038+00', '2021-09-14 02:50:18.384+00', 'a8cr9h0p88u'), +('x81x4t7oph0', 'e9y3tclj3z6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:50:06.031+00', '2021-09-14 02:50:06.031+00', NULL), +('pkp923vigul', 'iqsks32ha79', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:52:21.773+00', '2021-09-14 02:52:21.773+00', 'n6e781rxua7'), +('0eifyltokzn', 'ukmyfpryczv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:21.783+00', '2021-09-14 02:52:21.783+00', 'pkp923vigul'), +('d1811c7rm9w', 'pesvukpvkrx', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:52:21.793+00', '2021-09-14 02:52:21.793+00', '0eifyltokzn'), +('cmm7r32xkg1', '9rrz2l647zu', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:52:21.803+00', '2021-09-14 02:52:21.803+00', 'd1811c7rm9w'), +('fknwsbn4yzz', 'y9rz9w5i3yb', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:52:21.814+00', '2021-09-14 02:52:21.814+00', 'd1811c7rm9w'), +('mdugt8s5fas', 'kvatj6hb53u', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:52:24.639+00', '2021-09-14 02:52:24.639+00', 'fknwsbn4yzz'), +('dfjlbfurboc', 'mryuw5by8nn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:24.651+00', '2021-09-14 02:52:24.651+00', 'mdugt8s5fas'), +('bxgzzxeumdk', 'oi965rpvy80', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:52:24.66+00', '2021-09-14 02:52:24.66+00', 'dfjlbfurboc'), +('8puu4thi5dt', 'fwy05fisme0', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:52:25.37+00', '2021-09-14 02:52:25.37+00', 'fknwsbn4yzz'), +('m27kntzdmto', 'velohfhcpvr', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:25.38+00', '2021-09-14 02:52:25.38+00', '8puu4thi5dt'), +('axkkdqj8a7n', '9tc23ag4yat', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:52:25.388+00', '2021-09-14 02:52:25.388+00', 'm27kntzdmto'), +('ucqssroqh42', 'dxwth9xd9q8', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:52:26.797+00', '2021-09-14 02:52:26.797+00', 'fknwsbn4yzz'), +('oli3vvnpix4', 'd5mwsnf8ujp', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:26.805+00', '2021-09-14 02:52:26.805+00', 'ucqssroqh42'), +('fqdqtiqw02s', 'qoblj7fv13s', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:52:26.812+00', '2021-09-14 02:52:26.812+00', 'oli3vvnpix4'), +('x0jivmu7u74', '5twdw19auxo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:52:27.636+00', '2021-09-14 02:52:27.636+00', 'fknwsbn4yzz'), +('9fgm6o3gnmz', '5ohcb5gvi87', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:27.644+00', '2021-09-14 02:52:27.644+00', 'x0jivmu7u74'), +('0q0gcs1t22b', '1tcap6ir3oe', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:52:27.651+00', '2021-09-14 02:52:27.651+00', '9fgm6o3gnmz'), +('zdnl5x4zyg8', 'yvricusc3or', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:52:28.296+00', '2021-09-14 02:52:28.296+00', 'fknwsbn4yzz'), +('t7qpkz12rf7', 'czl31v2u23t', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:28.308+00', '2021-09-14 02:52:28.308+00', 'zdnl5x4zyg8'), +('xk6ccjqu8sx', 'nwdbcdnl2u1', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:52:30.689+00', '2021-09-14 02:52:30.689+00', 'mdugt8s5fas'), +('rk31a6t4njx', '7lvibo3n8ty', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:25.007+00', '2021-09-14 02:52:25.007+00', NULL), +('xpdvyak3f6j', 't0e6d9sc39k', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:52:26.484+00', '2021-09-14 02:52:33.737+00', '543wsud34tu'), +('97o1daz9fw2', '0bp6f686lkd', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:26.476+00', '2021-09-14 02:52:26.476+00', NULL), +('8vfkgaqv3u9', 'te3u5rmdm9n', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:52:27.246+00', '2021-09-14 02:52:36.344+00', 'tqzj5ubutqz'), +('uxf3zmezr8w', '21naj96k9u5', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:27.238+00', '2021-09-14 02:52:27.238+00', NULL), +('fepww1brb35', 'mzhqi0ar6cb', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:52:28.318+00', '2021-09-14 02:52:28.318+00', 't7qpkz12rf7'), +('dym7k8a8iob', '30np2z8ib9m', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:52:57.309+00', '2021-09-14 02:52:57.309+00', '8g6acfti9ia'), +('tlhtfnyjrz4', 'igkr12e0uit', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:52:57.317+00', '2021-09-14 02:52:57.317+00', 'dym7k8a8iob'), +('qja16uexwnu', 'mqzlzv85zox', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:52:57.325+00', '2021-09-14 02:52:57.325+00', 'tlhtfnyjrz4'), +('sr4vy6roell', 'drccetij1j4', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:52:57.332+00', '2021-09-14 02:52:57.332+00', 'qja16uexwnu'), +('octj1sul7ne', 'c9nfveg4d25', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:52:57.34+00', '2021-09-14 02:52:57.34+00', 'qja16uexwnu'), +('4yd8260mym5', 'mfm32y86b40', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:53:00.333+00', '2021-09-14 02:53:00.333+00', 'octj1sul7ne'), +('b26l6rfu8u2', 'y8830ggg45d', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:00.342+00', '2021-09-14 02:53:00.342+00', '4yd8260mym5'), +('xiuere6ixnr', 'pz9vxee7x4h', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 02:53:00.349+00', '2021-09-14 02:53:00.349+00', 'b26l6rfu8u2'), +('4if9k6sefon', 'vqq6vgt6gh9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:53:00.758+00', '2021-09-14 02:53:06.217+00', 'r61a9rywlfj'), +('nlyn6ak8qss', 'o5ds482fxof', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:00.748+00', '2021-09-14 02:53:00.748+00', NULL), +('39qun2z0a3i', 'u4niflopntg', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 02:52:25.016+00', '2021-09-14 02:52:30.7+00', 'xk6ccjqu8sx'), +('543wsud34tu', 'bb5to89ea47', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:52:33.727+00', '2021-09-14 02:52:33.727+00', '8puu4thi5dt'), +('tqzj5ubutqz', '6q6wc7krd3p', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:52:36.334+00', '2021-09-14 02:52:36.334+00', 'ucqssroqh42'), +('1i65bumx468', 'z2ynlq4jab4', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:53:01.132+00', '2021-09-14 02:53:01.132+00', 'octj1sul7ne'), +('2207l5bdnli', 'wbp8x6eptok', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:01.14+00', '2021-09-14 02:53:01.14+00', '1i65bumx468'), +('jmqsbr1dbz1', 'em8mmskh1d5', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 02:53:01.149+00', '2021-09-14 02:53:01.149+00', '2207l5bdnli'), +('i5ddarfho9q', 'wh89brtg1zx', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 02:53:02.17+00', '2021-09-14 02:53:02.17+00', 'octj1sul7ne'), +('jnfmqu15ffg', 'hyero1rx2cf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:02.181+00', '2021-09-14 02:53:02.181+00', 'i5ddarfho9q'), +('6t8gzikegzc', 'aktrjscti9f', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 02:53:02.188+00', '2021-09-14 02:53:02.188+00', 'jnfmqu15ffg'), +('664a27s2489', 'kmocpf4iejf', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 02:53:03.082+00', '2021-09-14 02:53:03.082+00', 'octj1sul7ne'), +('dp5rgw4z9bd', 'pul1uxd36s4', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:03.089+00', '2021-09-14 02:53:03.089+00', '664a27s2489'), +('j09zhmxhbsh', '19yvt3ohjf4', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 02:53:03.096+00', '2021-09-14 02:53:03.096+00', 'dp5rgw4z9bd'), +('mybmkkb2c5u', 'zbisuuei21a', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 02:53:03.597+00', '2021-09-14 02:53:03.597+00', 'octj1sul7ne'), +('v896yxfql4g', 'ua6x5tk0eyq', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:03.604+00', '2021-09-14 02:53:03.604+00', 'mybmkkb2c5u'), +('5ugbbdp6u8h', 'e4n9t6kjsmi', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 02:53:03.612+00', '2021-09-14 02:53:03.612+00', 'v896yxfql4g'), +('r61a9rywlfj', '8oaywkoab3u', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:53:06.206+00', '2021-09-14 02:53:06.206+00', '4yd8260mym5'), +('x56xc1whz9p', 'siyqnn9ja79', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:53:08.708+00', '2021-09-14 02:53:08.708+00', '1i65bumx468'), +('s78uarba63i', '2o6nqulw6vk', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 02:53:01.776+00', '2021-09-14 02:53:08.719+00', 'x56xc1whz9p'), +('ldds06dzfh6', 'qcmellywdlt', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:01.769+00', '2021-09-14 02:53:01.769+00', NULL), +('thcmx1k2ogo', 'mf905wqaiot', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 02:53:11.054+00', '2021-09-14 02:53:11.054+00', 'i5ddarfho9q'), +('j5l9za6j449', 'ttxn85r118y', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 02:53:02.644+00', '2021-09-14 02:53:11.068+00', 'thcmx1k2ogo'), +('025oms5ngqt', 'noysknnv0mo', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:53:02.636+00', '2021-09-14 02:53:02.636+00', NULL), +('i21uah6q12r', 'h9vi5ebtw68', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:54:01.053+00', '2021-09-14 02:54:01.053+00', 'au8xgar9tv5'), +('kyhkzqy5dce', '7nu990vc8ap', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:54:01.062+00', '2021-09-14 02:54:01.062+00', 'i21uah6q12r'), +('at8wyqu69c8', '2p7s33f3ya5', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 02:54:01.069+00', '2021-09-14 02:54:01.069+00', 'kyhkzqy5dce'), +('iz57878c8nr', 'gc7bpcz2080', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:54:01.075+00', '2021-09-14 02:54:01.075+00', 'at8wyqu69c8'), +('xof2gq4yx2i', 'fsbps068s95', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 02:54:01.084+00', '2021-09-14 02:54:01.084+00', 'at8wyqu69c8'), +('ognw2ux560b', 'q5iy5ra2vgr', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:56:50.175+00', '2021-09-14 02:56:50.175+00', 'tjyy5l9ki1i'), +('ouhtcvpnkfj', '8kpzuxx7twi', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:56:50.189+00', '2021-09-14 02:56:50.189+00', 'ognw2ux560b'), +('ss5s5b1hkty', 'c6c5e4ftayb', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 02:56:52.921+00', '2021-09-14 02:56:52.921+00', 'tjyy5l9ki1i'), +('q6xtt1zj95w', 'abkgze9tpwx', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:56:52.93+00', '2021-09-14 02:56:52.93+00', 'ss5s5b1hkty'), +('1h2qucyrpla', 'j4sew08u46x', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:56:53.359+00', '2021-09-14 02:56:53.359+00', 'tjyy5l9ki1i'), +('p1syqheep5p', 'em5yfihhvjk', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:56:53.369+00', '2021-09-14 02:56:53.369+00', '1h2qucyrpla'), +('zluuwf38hpr', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:56:53.4+00', '2021-09-14 02:56:53.4+00', 'qv6gurevazx'), +('me7au9tg6d6', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:56:53.41+00', '2021-09-14 02:56:53.41+00', 'zluuwf38hpr'), +('9a7809c70i2', '25pef9g4xb8', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:56:53.418+00', '2021-09-14 02:56:53.418+00', 'me7au9tg6d6'), +('hanp880ukup', 'nxfdnc97evk', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-14 02:56:52.937+00', '2021-09-14 02:56:59.162+00', 'q6xtt1zj95w'), +('qv6gurevazx', 'lww2vsn2hjt', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-14 02:56:53.378+00', '2021-09-14 02:58:36.393+00', 'p1syqheep5p'), +('tjopnatbg4j', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:56:53.449+00', '2021-09-14 02:56:53.449+00', 'qv6gurevazx'), +('a8w7h2hkvlk', 'v7gb1mcipeg', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:56:53.456+00', '2021-09-14 02:56:53.456+00', 'tjopnatbg4j'), +('qwt8h4ea282', 'm702auy5zj4', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:56:53.464+00', '2021-09-14 02:56:53.464+00', 'a8w7h2hkvlk'), +('avlkujhzt5j', '7hkvs3veqct', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:56:53.471+00', '2021-09-14 02:56:53.471+00', 'qwt8h4ea282'), +('bag2lvhc1ex', 'i7f3c9tnw59', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:56:53.478+00', '2021-09-14 02:56:53.478+00', 'avlkujhzt5j'), +('7akwq5rvocr', 'glib0r17in4', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-14 02:56:53.979+00', '2021-09-14 02:56:53.979+00', 'tjyy5l9ki1i'), +('c0mf4j7rv99', 'blck2iynks6', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:56:53.989+00', '2021-09-14 02:56:53.989+00', '7akwq5rvocr'), +('99tx37o48uo', 'jggj54cqzrl', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-14 02:56:50.199+00', '2021-09-14 02:56:56.808+00', 'ouhtcvpnkfj'), +('wyaejt1fh26', '8zfxsyew5al', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-14 02:56:53.999+00', '2021-09-14 02:57:05.301+00', 'c0mf4j7rv99'), +('deq77qpor44', 'o2gs1dqknce', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:57:12.127+00', '2021-09-14 02:57:12.127+00', 'ia04dgr8sz7'), +('ml78qpom3sj', 'f4tlv1gggpj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:12.137+00', '2021-09-14 02:57:12.137+00', 'deq77qpor44'), +('naohoiipwtn', 'cwxufd1j2t9', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 02:57:12.511+00', '2021-09-14 02:57:12.511+00', 'ia04dgr8sz7'), +('g169osj887e', 's4chq46hcgb', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:12.518+00', '2021-09-14 02:57:12.518+00', 'naohoiipwtn'), +('kpfsv21buog', '8hcn583jtvr', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:57:12.94+00', '2021-09-14 02:57:12.94+00', 'ia04dgr8sz7'), +('tkx18c9nyws', '3ldzwv3dr49', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:12.949+00', '2021-09-14 02:57:12.949+00', 'kpfsv21buog'), +('d7ngzldd4m7', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:57:12.968+00', '2021-09-14 02:57:12.968+00', 'z2fxdgv1md1'), +('91nkxzmatpb', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:57:12.98+00', '2021-09-14 02:57:12.98+00', 'd7ngzldd4m7'), +('2b3qiwowhq0', '0a0amkig5d0', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:57:12.994+00', '2021-09-14 02:57:12.994+00', '91nkxzmatpb'), +('fvgfkbc7ofz', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:57:13.023+00', '2021-09-14 02:57:13.023+00', 'z2fxdgv1md1'), +('sihrwnlclh2', 'fxpi6e8pb3x', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:57:13.031+00', '2021-09-14 02:57:13.031+00', 'fvgfkbc7ofz'), +('ar6l0f2mpqz', 'b8ggkak0iy2', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:57:13.038+00', '2021-09-14 02:57:13.038+00', 'sihrwnlclh2'), +('ms8gdcdhhw3', '2ioikmkncva', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:57:13.047+00', '2021-09-14 02:57:13.047+00', 'ar6l0f2mpqz'), +('u1da1ulvgqo', 'qzf7trjvhoc', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:57:13.061+00', '2021-09-14 02:57:13.061+00', 'ms8gdcdhhw3'), +('amqwkw5omza', 'kqrkgnm5u4c', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-14 02:57:13.28+00', '2021-09-14 02:57:13.28+00', 'ia04dgr8sz7'), +('5jtjesn5d6b', 'y6q1v6pfazo', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:13.287+00', '2021-09-14 02:57:13.287+00', 'amqwkw5omza'), +('m876ewjbv73', 'x0n9hs5gkg3', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-14 02:57:12.15+00', '2021-09-14 02:57:15.636+00', 'ml78qpom3sj'), +('7b66l7ld9st', 'ivt2xxogfmr', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-14 02:57:12.525+00', '2021-09-14 02:57:17.489+00', 'g169osj887e'), +('gk1llifj7p1', 'wgjws0iwic6', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 2, '2021-09-14 02:57:35.027+00', '2021-09-14 02:57:35.027+00', '91nkxzmatpb'), +('y1a5ndr92w7', 'kubipth45gp', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-14 02:57:13.295+00', '2021-09-14 02:57:21.446+00', '5jtjesn5d6b'), +('z2fxdgv1md1', 'vz82bj2ec9n', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-14 02:57:12.958+00', '2021-09-14 02:57:29.092+00', 'tkx18c9nyws'), +('7bevuz5uqtf', 'jqsoofvpk9d', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:57:35.761+00', '2021-09-14 02:57:35.761+00', '91nkxzmatpb'), +('w58l1gfxa2d', 'vmj9356nhcl', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:57:36.681+00', '2021-09-14 02:57:36.681+00', '91nkxzmatpb'), +('396tzmn4wpm', '2h11fo3vrxx', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 03:01:14.897+00', '2021-09-14 03:01:14.897+00', '1z1ajwyr1bh'), +('lchsikzks35', 'g1aug92g39w', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 03:01:14.907+00', '2021-09-14 03:01:14.907+00', '1z1ajwyr1bh'), +('hwwttxrzf59', 'gy1a5y6n3te', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:01:19.893+00', '2021-09-14 03:01:19.893+00', 'lchsikzks35'), +('im7x3yhsqwu', 'a1vidwbdo2f', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:01:19.9+00', '2021-09-14 03:01:19.9+00', 'hwwttxrzf59'), +('u60i0uc5uar', 'j08zmnabdvx', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 9, '2021-09-12 01:17:09.321+00', '2021-09-26 01:39:52.153+00', 'm25pry2yof2'), +('z9avpqzri5e', 'ere74u2n1c6', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"},"required":true}', '0', 1, '2021-09-14 02:57:59.004+00', '2021-09-14 02:58:05.168+00', '8er6oaclt1b'), +('85hkix67lxp', 'kmpj24vqgd6', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-14 02:57:59.395+00', '2021-09-14 02:58:26.56+00', 'ut2pgeuhmum'), +('af68ejcotwh', 'xlhpifrinbm', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kkopbnfdd0v","fieldNames":{"label":"f_vgw4f62h16e","value":"id"}},"required":true}', '0', 1, '2021-09-14 02:57:59.369+00', '2021-09-14 02:58:14.348+00', 'mkr1dqxa5oo'), +('z8yuyb98f7d', 'f9uvq5b9wxg', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-14 02:57:13.004+00', '2021-09-14 02:57:44.692+00', '2b3qiwowhq0'), +('10xr7dz2i9v', 'xegz740mxfu', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 02:57:58.62+00', '2021-09-14 02:57:58.62+00', 'cmm4rlf147h'), +('5ykn3qt96ft', '4utca2au9b3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:58.629+00', '2021-09-14 02:57:58.629+00', '10xr7dz2i9v'), +('tcm9163rf87', 's5xj1sn4bg5', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 02:57:58.984+00', '2021-09-14 02:57:58.984+00', 'cmm4rlf147h'), +('8er6oaclt1b', '2nkq6ir884z', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:58.995+00', '2021-09-14 02:57:58.995+00', 'tcm9163rf87'), +('iwqdaq92dhx', 'd5gnruw1etn', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 02:57:59.353+00', '2021-09-14 02:57:59.353+00', 'cmm4rlf147h'), +('mkr1dqxa5oo', '4xwfw3h7y0b', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:59.361+00', '2021-09-14 02:57:59.361+00', 'iwqdaq92dhx'), +('oxmedxn0es1', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-14 02:57:59.375+00', '2021-09-14 02:57:59.375+00', 'af68ejcotwh'), +('xcwmhsshror', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","useRowSelection":"{{ Select.useRowSelection }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-14 02:57:59.381+00', '2021-09-14 02:57:59.381+00', 'oxmedxn0es1'), +('ut2pgeuhmum', '1u78578rztr', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-14 02:57:59.389+00', '2021-09-14 02:57:59.389+00', 'xcwmhsshror'), +('dpayathxeyv', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-14 02:57:59.413+00', '2021-09-14 02:57:59.413+00', 'af68ejcotwh'), +('z84twp8kp1u', 'c59rehtu4yh', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-14 02:57:59.42+00', '2021-09-14 02:57:59.42+00', 'dpayathxeyv'), +('rwv4ckaqnv0', '9hyv14oj20e', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-14 02:57:59.427+00', '2021-09-14 02:57:59.427+00', 'z84twp8kp1u'), +('5wpk80tsu2a', 'izzc9k957xm', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 02:57:59.436+00', '2021-09-14 02:57:59.436+00', 'rwv4ckaqnv0'), +('b5jfi3xgh3e', 'b4r87tjlbrc', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-14 02:57:59.444+00', '2021-09-14 02:57:59.444+00', '5wpk80tsu2a'), +('o86sr6yhmzu', 'rfs09vm57yu', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-14 02:57:59.781+00', '2021-09-14 02:57:59.781+00', 'cmm4rlf147h'), +('bm1xggtdkkv', '3ysfxugkzau', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 02:57:59.789+00', '2021-09-14 02:57:59.789+00', 'o86sr6yhmzu'), +('zdajr4hjd5r', 'rwnp7u3hcy9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"},"required":true}', '0', 1, '2021-09-14 02:57:58.636+00', '2021-09-14 02:58:02.996+00', '5ykn3qt96ft'), +('x9dgyp4648c', 'nx0d7r3qadr', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"},"required":true}', '0', 1, '2021-09-14 02:57:59.796+00', '2021-09-14 02:58:16.535+00', 'bm1xggtdkkv'), +('nrum3hudx4c', 'gcr9apldxo1', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 2, '2021-09-14 02:58:20.373+00', '2021-09-14 02:58:20.373+00', 'xcwmhsshror'), +('1u9vgw1tsj7', 'r4c9bld2org', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:58:21.141+00', '2021-09-14 02:58:21.141+00', 'xcwmhsshror'), +('0c3e0q89yx5', 'lcy59bjr6ng', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:58:21.66+00', '2021-09-14 02:58:21.66+00', 'xcwmhsshror'), +('941wh645g49', 'pfb8nxijt85', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_vgw4f62h16e"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 2, '2021-09-14 02:58:41.523+00', '2021-09-14 02:58:41.523+00', 'me7au9tg6d6'), +('2fsv7o24ijy', 'd51fclf0zci', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 02:58:41.967+00', '2021-09-14 02:58:41.967+00', 'me7au9tg6d6'), +('l3m4t1elzfa', 'svxnlk2t8jl', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 4, '2021-09-14 02:58:42.421+00', '2021-09-14 02:58:42.421+00', 'me7au9tg6d6'), +('ipk0dmm6rjo', 'yzgroqnyddh', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":["xkllcgbvvmt","vygajfyejo0","f_c8mes0kp1zt","f_vgw4f62h16e","f_3det6kr3vn8","f_61znsfh307m","f_tdoe0q00xc6","f_kk4nspj1i28"]}}', '0', 1, '2021-09-14 02:56:53.427+00', '2021-09-14 02:58:47.907+00', '9a7809c70i2'), +('2jrztm2bmwj', 'bj6g49whfdo', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:01:14.875+00', '2021-09-14 03:01:14.875+00', 'ac8hulvrzph'), +('7z2817clls2', 'rq53cgvgtzg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:01:14.883+00', '2021-09-14 03:01:14.883+00', '2jrztm2bmwj'), +('1z1ajwyr1bh', 'lvqv0o3bq2v', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 03:01:14.891+00', '2021-09-14 03:01:14.891+00', '7z2817clls2'), +('qu8paoeg0rd', '83wbf9vagnl', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:17.581+00', '2021-09-14 03:15:17.581+00', '9jbo63nk1c5'), +('ymg28wp9eyb', 'c84wf0j5a1r', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_niymyj0no38"}}', '0', 1, '2021-09-14 03:01:19.907+00', '2021-09-14 03:01:19.907+00', 'im7x3yhsqwu'), +('gjlf7xuw49k', 'opeu676xaqd', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 03:01:20.673+00', '2021-09-14 03:01:20.673+00', 'lchsikzks35'), +('lj5kmrax512', '91kway0ehvv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:01:20.679+00', '2021-09-14 03:01:20.679+00', 'gjlf7xuw49k'), +('2zf89bw1743', 'swzs2ta827p', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_nlgk67tpdql"}}', '0', 1, '2021-09-14 03:01:20.686+00', '2021-09-14 03:01:20.686+00', 'lj5kmrax512'), +('j0nxz1q1cg6', 'pxlbbhzreh9', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 03:01:21.753+00', '2021-09-14 03:01:21.753+00', 'lchsikzks35'), +('wbeh0iwzm41', 'w4svcdpluoj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:01:21.796+00', '2021-09-14 03:01:21.796+00', 'j0nxz1q1cg6'), +('vnzxm3empyq', 'ua2d4dee0cl', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_umjewufbyhj"}}', '0', 1, '2021-09-14 03:01:21.817+00', '2021-09-14 03:01:21.817+00', 'wbeh0iwzm41'), +('gkxln6nwbmb', 'd9d0q0rah1h', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 3, '2021-09-14 03:01:45.774+00', '2021-09-14 03:01:50.456+00', 'l2uq7pgdrht'), +('71um0g73q1b', 'ut8h1ufwhzz', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-component-props":{"useResource":"{{ Select.Drawer.useResource }}","showDefaultButtons":true},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 03:14:43.931+00', '2021-09-14 03:14:43.931+00', 'jltqcuedy93'), +('wnygdfsg0w6', 'drz0tqemsc1', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-14 03:14:43.939+00', '2021-09-14 03:14:43.939+00', '71um0g73q1b'), +('jltqcuedy93', 'ha49zqg3zz1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:14:43.924+00', '2021-09-14 03:14:43.924+00', NULL), +('5w22zrzttsr', '3q9jvt2vzmd', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:14:50.654+00', '2021-09-14 03:14:50.654+00', '9xm9ir4ylwo'), +('btzaro1l46k', 'q4jgxeh979m', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:14:50.665+00', '2021-09-14 03:14:50.665+00', '5w22zrzttsr'), +('ifc68n7za5c', 'ql3o9pfh657', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Select.Drawer.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 03:14:50.673+00', '2021-09-14 03:14:50.673+00', 'btzaro1l46k'), +('wi9rw5igxnr', 'szso6p02gdd', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 03:14:50.679+00', '2021-09-14 03:14:50.679+00', 'ifc68n7za5c'), +('95vq3nedrhc', 'simqhjlkskc', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 03:14:50.688+00', '2021-09-14 03:14:50.688+00', 'ifc68n7za5c'), +('9jbo63nk1c5', 'r9nodt6m5ho', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:15:09.189+00', '2021-09-14 03:15:09.189+00', '95vq3nedrhc'), +('ws0yfwd4fut', 'jp34ews8kry', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:09.207+00', '2021-09-14 03:15:09.207+00', '9jbo63nk1c5'), +('4w7nt86fbzs', '1310etl7le9', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 03:15:09.216+00', '2021-09-14 03:15:09.216+00', 'ws0yfwd4fut'), +('t42evzylubb', '31tihjj0wc0', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 03:15:12.74+00', '2021-09-14 03:15:12.74+00', '95vq3nedrhc'), +('epcgwo7a25d', 'zw32f36og4o', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:12.747+00', '2021-09-14 03:15:12.747+00', 't42evzylubb'), +('a9e7ifvz2d2', 'gfdgkaatf7m', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 03:15:12.753+00', '2021-09-14 03:15:12.753+00', 'epcgwo7a25d'), +('unzgfod79wx', 't20odk2gfp2', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 03:15:13.563+00', '2021-09-14 03:15:13.563+00', '95vq3nedrhc'), +('k1pc38b8cko', 'ddctfjua8tp', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:13.571+00', '2021-09-14 03:15:13.571+00', 'unzgfod79wx'), +('vvybwgy5k35', 'b7doey35w6m', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 03:15:13.577+00', '2021-09-14 03:15:13.577+00', 'k1pc38b8cko'), +('ovygfeuk9o9', 'pnlpqhz7cey', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 03:15:14.472+00', '2021-09-14 03:15:14.472+00', '95vq3nedrhc'), +('je8cipnku8t', '8zninh84u7u', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:14.478+00', '2021-09-14 03:15:14.478+00', 'ovygfeuk9o9'), +('zxj5xieysyx', 'q8azuiv4x22', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 03:15:14.484+00', '2021-09-14 03:15:14.484+00', 'je8cipnku8t'), +('qbkbrne5s7r', 'klbmcno5cw8', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 03:15:14.85+00', '2021-09-14 03:15:14.85+00', '95vq3nedrhc'), +('au1l6p9tysj', 'qzba5oqryim', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:14.858+00', '2021-09-14 03:15:14.858+00', 'qbkbrne5s7r'), +('8ccuruu8u02', '6nu5pjexhis', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 03:15:14.864+00', '2021-09-14 03:15:14.864+00', 'au1l6p9tysj'), +('4710lmvat2c', '7ryruas50tj', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:12.393+00', '2021-09-14 03:15:12.393+00', NULL), +('ndxc8b8iz3a', 'h5h9il6t21v', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:20.607+00', '2021-09-14 03:15:20.607+00', 't42evzylubb'), +('p7sn9ozcd6f', '2t81pdow8o7', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 03:15:13.188+00', '2021-09-14 03:15:20.615+00', 'ndxc8b8iz3a'), +('rtykjdr6zyc', 't3tgagax0dn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:13.182+00', '2021-09-14 03:15:13.182+00', NULL), +('a1nx9u7qnz1', '7ko8u8eikc4', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:22.529+00', '2021-09-14 03:15:22.529+00', 'unzgfod79wx'), +('empk9z3zsub', 'ycdtc6gdi1x', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 03:15:14.061+00', '2021-09-14 03:15:22.544+00', 'a1nx9u7qnz1'), +('3wdp1yrk3gz', '72g2q27kgzv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:14.054+00', '2021-09-14 03:15:14.054+00', NULL), +('s8pf1s5oc63', '3myz2oak34l', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 03:15:12.4+00', '2021-09-14 03:15:17.59+00', 'qu8paoeg0rd'), +('i9bsmvbk5tm', '31ijyhmpr32', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:15:44.488+00', '2021-09-14 03:15:44.488+00', 'fcpy7imnago'), +('1i72p5415lj', 'zr483wvakae', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:44.5+00', '2021-09-14 03:15:44.5+00', 'i9bsmvbk5tm'), +('p4houluwoyj', 'cdes4zukeef', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Select.Drawer.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 03:15:44.507+00', '2021-09-14 03:15:44.507+00', '1i72p5415lj'), +('h7ugjk8ctig', 'd8wd2dgl4ph', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 03:15:44.514+00', '2021-09-14 03:15:44.514+00', 'p4houluwoyj'), +('ig7wvx0l33g', 'awp39oz4e1f', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 03:15:44.523+00', '2021-09-14 03:15:44.523+00', 'p4houluwoyj'), +('61f9nhr4uz8', '44qwvcq09tc', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:15:47.881+00', '2021-09-14 03:15:47.881+00', 'ig7wvx0l33g'), +('xvhafqmk6rb', 'p3nwmz3kct3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:47.888+00', '2021-09-14 03:15:47.888+00', '61f9nhr4uz8'), +('okcsves2h2u', '8mq0sycan2k', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 03:15:47.896+00', '2021-09-14 03:15:47.896+00', 'xvhafqmk6rb'), +('7km297v41wr', 't348dnv0xbp', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 03:15:48.63+00', '2021-09-14 03:15:48.63+00', 'ig7wvx0l33g'), +('mdfzjesbj1j', 'gl2l8hy065z', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:48.636+00', '2021-09-14 03:15:48.636+00', '7km297v41wr'), +('olgjoz9ohgp', 'x1gbsxtye0z', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-14 03:15:48.643+00', '2021-09-14 03:15:48.643+00', 'mdfzjesbj1j'), +('frirjdwz5ak', 'f3ymggv12uu', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 03:15:49.467+00', '2021-09-14 03:15:49.467+00', 'ig7wvx0l33g'), +('iq0m8ocerga', 'd21u4gs7p0x', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:49.475+00', '2021-09-14 03:15:49.475+00', 'frirjdwz5ak'), +('ykbnhn5d1pd', '0d7jm8r6rvj', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 03:15:49.481+00', '2021-09-14 03:15:49.481+00', 'iq0m8ocerga'), +('uuuswtl112u', 'u30ajc22g5h', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 03:15:50.446+00', '2021-09-14 03:15:50.446+00', 'ig7wvx0l33g'), +('cfu7pdvrr23', 'zl29tsikvsz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:50.456+00', '2021-09-14 03:15:50.456+00', 'uuuswtl112u'), +('lv7knaw2639', 'dx155hdwrxq', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 03:15:50.464+00', '2021-09-14 03:15:50.464+00', 'cfu7pdvrr23'), +('7r6eey8e78u', '9may8k1imgp', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 03:15:50.863+00', '2021-09-14 03:15:50.863+00', 'ig7wvx0l33g'), +('2p77dtmwhbe', 'gci5nxzzglz', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:50.869+00', '2021-09-14 03:15:50.869+00', '7r6eey8e78u'), +('w3ijixwyszi', 'vhl44s1654g', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 03:15:50.876+00', '2021-09-14 03:15:50.876+00', '2p77dtmwhbe'), +('fbyncnp93f2', 'mef1jwag5jd', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:54.368+00', '2021-09-14 03:15:54.368+00', '61f9nhr4uz8'), +('zw2at0rc8vc', 'r29mmpttl26', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 03:15:48.249+00', '2021-09-14 03:15:54.378+00', 'fbyncnp93f2'), +('2v2fhrdlmph', '2b5ldjlu3me', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:48.241+00', '2021-09-14 03:15:48.241+00', NULL), +('9qtuu19i5vn', 'suevhhzhgoq', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:56.263+00', '2021-09-14 03:15:56.263+00', '7km297v41wr'), +('3qorbvlefyn', 'ducgflo7thj', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 03:15:49.063+00', '2021-09-14 03:15:56.273+00', '9qtuu19i5vn'), +('qwk6exlv1rg', 'xkfxev9bdru', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:49.056+00', '2021-09-14 03:15:49.056+00', NULL), +('8zea3zck03g', 'vagxy38g7sn', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:15:58.021+00', '2021-09-14 03:15:58.021+00', 'frirjdwz5ak'), +('rgblu104262', 'ifhu36znyjp', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 03:15:50.022+00', '2021-09-14 03:15:58.031+00', '8zea3zck03g'), +('hho9gupbvrl', 'i429xn89npf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:15:50.014+00', '2021-09-14 03:15:50.014+00', NULL), +('iy8fi0ftund', '93adl1r0ush', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:16:12.195+00', '2021-09-14 03:16:12.195+00', 'xslmb0aczns'), +('66o8gxlcz3s', 'jeja53c2aa9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:12.202+00', '2021-09-14 03:16:12.202+00', 'iy8fi0ftund'), +('4fhgep7thla', '1f1ghpqxi3y', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Select.Drawer.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-14 03:16:12.21+00', '2021-09-14 03:16:12.21+00', '66o8gxlcz3s'), +('yiipo5npuia', 'lqghhs8004l', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-14 03:16:12.217+00', '2021-09-14 03:16:12.217+00', '4fhgep7thla'), +('4tbaimvtzis', 'roa4bp2dfg5', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-14 03:16:12.227+00', '2021-09-14 03:16:12.227+00', '4fhgep7thla'), +('g2osimypxu7', '8nfhp0em6yy', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 03:16:15.632+00', '2021-09-14 03:16:15.632+00', '4tbaimvtzis'), +('k886gsbaqcz', '9ganvjrwptu', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:15.639+00', '2021-09-14 03:16:15.639+00', 'g2osimypxu7'), +('bs8u1z59c35', '1nisupklrxu', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-14 03:16:15.646+00', '2021-09-14 03:16:15.646+00', 'k886gsbaqcz'), +('6t0gwc86uru', 'pvnyesr6syg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:16.025+00', '2021-09-14 03:16:16.025+00', NULL), +('ctsgysgdgua', 'yidblp9stih', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-14 03:16:17.158+00', '2021-09-14 03:16:17.158+00', '4tbaimvtzis'), +('5yllmk4s48p', 'u6fjxweevch', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:17.167+00', '2021-09-14 03:16:17.167+00', 'ctsgysgdgua'), +('og9jqwftuoa', 'y46hrhekbra', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-14 03:16:17.173+00', '2021-09-14 03:16:17.173+00', '5yllmk4s48p'), +('6zex5qriv4o', '9gz8vzl8va3', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-14 03:16:18.688+00', '2021-09-14 03:16:18.688+00', '4tbaimvtzis'), +('hlqzi0dexxu', 'bcvazh2nye9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:18.695+00', '2021-09-14 03:16:18.695+00', '6zex5qriv4o'), +('nr0p4yvuugr', 'bt97l3lw5zg', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-14 03:16:18.702+00', '2021-09-14 03:16:18.702+00', 'hlqzi0dexxu'), +('q0i4uwe89cr', 'g9s4clsuj7t', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-14 03:16:19.075+00', '2021-09-14 03:16:19.075+00', '4tbaimvtzis'), +('gs2opv2qy9a', 'pc2xb80what', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:19.081+00', '2021-09-14 03:16:19.081+00', 'q0i4uwe89cr'), +('o3ypbk1v2iz', 'tdo3ef2m2l5', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-14 03:16:19.087+00', '2021-09-14 03:16:19.087+00', 'gs2opv2qy9a'), +('f4b3jcmmtag', '1oq6v8nlomu', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:16:21.73+00', '2021-09-14 03:16:21.73+00', 'g2osimypxu7'), +('ffluwo8mtjd', '71se0wbgg4p', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-14 03:16:16.032+00', '2021-09-14 03:16:21.742+00', 'f4b3jcmmtag'), +('761zwl9rydi', 't7w29yhwz33', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:16:23.691+00', '2021-09-14 03:16:23.691+00', '1jedgeo94xg'), +('45elon3v2y5', '5a2h3eb6lla', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-14 03:16:16.749+00', '2021-09-14 03:16:23.699+00', '761zwl9rydi'), +('gr9ilyydgls', '628zwohks9t', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:16.742+00', '2021-09-14 03:16:16.742+00', NULL), +('hmo54gqca70', 'es5o5oymzvf', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 2, '2021-09-14 03:16:25.456+00', '2021-09-14 03:16:25.456+00', 'ctsgysgdgua'), +('fm1tku8f8hb', 'mbpe2opqix1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-14 03:16:17.605+00', '2021-09-14 03:16:25.471+00', 'hmo54gqca70'), +('nfn75gejqc9', 'yix1r64q1zv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 03:16:17.596+00', '2021-09-14 03:16:17.596+00', NULL), +('dreifkpgmez', '02at6b0uupk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-14 14:34:58.523+00', '2021-09-14 14:34:58.523+00', 'wnk2grmfyn9'), +('3h0pz68et1y', 'ey2g2zuzbuh', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 14:34:58.541+00', '2021-09-14 14:34:58.541+00', 'dreifkpgmez'), +('ryp3luyen1o', 'rdkizi74rd1', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-14 14:35:01.63+00', '2021-09-14 14:35:01.63+00', 'wnk2grmfyn9'), +('y1smagrndos', 'f6o5scvnwz4', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 14:35:01.639+00', '2021-09-14 14:35:01.639+00', 'ryp3luyen1o'), +('ulbppl9ctyh', 'j1b08rxirus', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hznqtmqljb2"}}', '0', 1, '2021-09-14 14:35:01.648+00', '2021-09-14 14:35:01.648+00', 'y1smagrndos'), +('5v4xkorg6dp', 'lkpb0rat834', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-14 14:35:02.509+00', '2021-09-14 14:35:02.509+00', 'wnk2grmfyn9'), +('qxbmp5ufv6l', 'mlamizpk8a4', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 14:35:02.517+00', '2021-09-14 14:35:02.517+00', '5v4xkorg6dp'), +('lk9jw553ykf', 'f3mnz600gke', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_u4i0jrp4uo6"}}', '0', 1, '2021-09-14 14:35:02.525+00', '2021-09-14 14:35:02.525+00', 'qxbmp5ufv6l'), +('yl5b45063mx', 'ei06q9weypf', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-14 14:35:03.688+00', '2021-09-14 14:35:03.688+00', 'wnk2grmfyn9'), +('o2p3jgnyw2x', '5fxdpz96n0h', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-14 14:35:03.695+00', '2021-09-14 14:35:03.695+00', 'yl5b45063mx'), +('lgqwvd6c703', 'wpdzr0mx8v1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_l8uuiwcnlw9"}}', '0', 1, '2021-09-14 14:35:03.704+00', '2021-09-14 14:35:03.704+00', 'o2p3jgnyw2x'), +('bf4jl642wo2', 'heep4obadyx', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_hwenour8ara"},"required":true}', '0', 1, '2021-09-14 14:34:58.55+00', '2021-09-14 14:35:08.57+00', '3h0pz68et1y'), +('ral7ulw6bwu', '59zv3vk86wi', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-read-pretty":true,"x-component-props":{"useResource":"{{ Table.useResource }}"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-15 01:30:20.597+00', '2021-09-15 01:30:20.597+00', 'xa306vq72rh'), +('kc6rfz8lm24', 'hr5a28etmjd', NULL, 'void', 'Action.Bar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Action.Bar.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-15 01:30:20.608+00', '2021-09-15 01:30:20.608+00', 'ral7ulw6bwu'), +('9ukejkowsjn', 'mu2amdv4ync', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 2, '2021-09-15 01:30:20.621+00', '2021-09-15 01:30:20.621+00', 'ral7ulw6bwu'), +('j1acj5c4vor', 'lg4vkienb6h', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-15 01:30:35.06+00', '2021-09-15 01:30:35.06+00', '9ukejkowsjn'), +('11jxm8qgjh1', 'dzoycm17yoe', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:35.072+00', '2021-09-15 01:30:35.072+00', 'j1acj5c4vor'), +('ndwa1ivurh8', '57vttmrzhj2', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-15 01:30:35.081+00', '2021-09-15 01:30:35.081+00', '11jxm8qgjh1'), +('79etkabgk75', 'xvpekgn9d4t', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 2, '2021-09-15 01:30:38.368+00', '2021-09-15 01:30:38.368+00', '9ukejkowsjn'), +('ynf3nqdhrun', '00th3077cvg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:38.375+00', '2021-09-15 01:30:38.375+00', '79etkabgk75'), +('7t1exc3o5oz', 'b7kjz66sdhm', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_3det6kr3vn8"}}', '0', 1, '2021-09-15 01:30:38.381+00', '2021-09-15 01:30:38.381+00', 'ynf3nqdhrun'), +('nyyzex3s9s9', 'bfi3moeoklj', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-15 01:30:40.618+00', '2021-09-15 01:30:40.618+00', '9ukejkowsjn'), +('iu455ra2a0m', 'kvcezcnv3ni', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:40.628+00', '2021-09-15 01:30:40.628+00', 'nyyzex3s9s9'), +('fk4k9u2smly', 'fl7pp5h0gqa', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-15 01:30:40.636+00', '2021-09-15 01:30:40.636+00', 'iu455ra2a0m'), +('ctjr4f8o44k', 'zvwkdgg4u3u', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 4, '2021-09-15 01:30:43.844+00', '2021-09-15 01:30:43.844+00', '9ukejkowsjn'), +('pal46dv9a2k', 'yees2blawp2', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:43.853+00', '2021-09-15 01:30:43.853+00', 'ctjr4f8o44k'), +('zssaog2nc44', '744tw3rt86k', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_bysgds7j36p"}}', '0', 1, '2021-09-15 01:30:43.862+00', '2021-09-15 01:30:43.862+00', 'pal46dv9a2k'), +('utnxct4dexb', 'fb7fga0uplm', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 5, '2021-09-15 01:30:44.547+00', '2021-09-15 01:30:44.547+00', '9ukejkowsjn'), +('utzirvvtjlz', 'q1hi6c21o3x', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:44.556+00', '2021-09-15 01:30:44.556+00', 'utnxct4dexb'), +('sjc30pdc460', 'cw10qgqjjd4', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_n6snaop9d4y"}}', '0', 1, '2021-09-15 01:30:44.564+00', '2021-09-15 01:30:44.564+00', 'utzirvvtjlz'), +('rftia3hh8qf', 'kf2fj7xdjdk', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 6, '2021-09-15 01:30:45.283+00', '2021-09-15 01:30:45.283+00', '9ukejkowsjn'), +('wmkha8e57ub', 'uxs6wvff6yg', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:45.292+00', '2021-09-15 01:30:45.292+00', 'rftia3hh8qf'), +('mxsmckk9rar', 'xlprd9s8wwq', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-15 01:30:45.298+00', '2021-09-15 01:30:45.298+00', 'wmkha8e57ub'), +('z5xabnpir72', 'vv8yze2yz0r', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 7, '2021-09-15 01:30:46.393+00', '2021-09-15 01:30:46.393+00', '9ukejkowsjn'), +('ejbco82p5bo', 'a93hwpr6c8k', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:46.401+00', '2021-09-15 01:30:46.401+00', 'z5xabnpir72'), +('qyru2pv27ln', 'qty4w1epoin', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_tdoe0q00xc6"}}', '0', 1, '2021-09-15 01:30:46.407+00', '2021-09-15 01:30:46.407+00', 'ejbco82p5bo'), +('y4t7kmie8gx', '1s5fjtr1q5s', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 8, '2021-09-15 01:30:46.995+00', '2021-09-15 01:30:46.995+00', '9ukejkowsjn'), +('7xs83h9kwta', 'ghoo2l8qmub', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:47.002+00', '2021-09-15 01:30:47.002+00', 'y4t7kmie8gx'), +('jj3it8sebos', 'qrj997gqtea', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_kk4nspj1i28"}}', '0', 1, '2021-09-15 01:30:47.011+00', '2021-09-15 01:30:47.011+00', '7xs83h9kwta'), +('qgw7extxc95', '2e9bzmep9d4', '查看', 'void', 'Action', '{"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-15 01:32:27.677+00', '2021-09-15 01:32:27.677+00', 'b8h6m1a0b0i'), +('nd5sdb2rdnw', '3ye2buhvfgs', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-15 01:32:27.687+00', '2021-09-15 01:32:27.687+00', 'qgw7extxc95'), +('1vl5ofqvgmz', '2hjugbgc0r5', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-15 01:32:27.696+00', '2021-09-15 01:32:27.696+00', 'nd5sdb2rdnw'), +('ga5v9sntrro', 'ee8yompanlg', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-15 01:32:27.704+00', '2021-09-15 01:32:27.704+00', '1vl5ofqvgmz'), +('al3yo09twje', 'o0gcjs5is1i', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-15 01:32:27.711+00', '2021-09-15 01:32:27.711+00', 'ga5v9sntrro'), +('i8maupbyrqr', 'qa6jg2a8n7b', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":false,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9","defaultFilter":{"and":[],"or":[{"f_nlgk67tpdql":{"eq":"i2xjqmnwrsu"}},{"f_nlgk67tpdql":{"eq":"x4qnavatfai"}}]}}}', '0', 3, '2021-09-12 01:10:12.026+00', '2021-09-15 01:43:56.611+00', 'bzhnwtjmhbr'), +('jqxsam42wwh', 'tnqyiwm4yh9', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_61znsfh307m"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-12 07:35:43.601+00', '2021-09-15 01:39:29+00', 'eyohmo8psbx'), +('hm3u9dkmmzt', 'w87ena3x76x', NULL, 'void', 'Grid.Col', '{"version":"2.0"}', '0', 0, '2021-09-15 01:42:34.541+00', '2021-09-15 01:42:34.541+00', 'sjc5uxxtwkm'), +('2ncnii6mb2x', 'hrx4f0vg9ow', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"这是一段演示文字,**支持使用 Markdown 语法**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-23 03:00:55.088+00', '2021-09-23 03:00:55.088+00', 'mrkvuu4e3yn'), +('4a2qaxp1yh2', 'yoc1csgln37', NULL, 'void', 'Grid.Col', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-15 01:39:31.036+00', '2021-09-15 01:42:34.67+00', 'o936terfdi3'), +('xb6eh6iklcg', '97rtb0kx8r9', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:44:18.684+00', '2021-09-15 01:44:18.684+00', 'cxnaqb2y83b'), +('cxnaqb2y83b', '1e8hcv3xbua', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 3, '2021-09-15 01:44:18.673+00', '2021-09-15 01:44:18.763+00', 'j3vyu7mwewx'), +('0dbewi4kxr7', '06nhkfcem7a', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:55:51.416+00', '2021-09-15 01:55:51.416+00', NULL), +('p87fcj3ojfs', '66mlqacbng4', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-component-props":{"showDefaultButtons":true,"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9"},"x-designable-bar":"Form.DesignableBar","__insertAfter__":"hflx0w3au4w"}', '0', 3, '2021-09-12 07:34:21.499+00', '2021-09-15 01:56:06.223+00', 'hm3u9dkmmzt'), +('w1yeys2xsrh', 'hwpkn7jiik8', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:45:48.362+00', '2021-09-15 01:45:48.362+00', NULL), +('cygllm6jljs', 'gn69h2fkpo7', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_x9kmuovlm79"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 5, '2021-09-26 01:39:45.11+00', '2021-09-26 01:40:16.273+00', 'm25pry2yof2'), +('srpwfbwa848', 'ytj7fb32dzv', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-28 07:31:42.393+00', '2021-09-28 07:31:42.393+00', 'tuqese9cy51'), +('1v96b3bt8sh', 'cnmm1j8h7i8', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-28 07:31:42.403+00', '2021-09-28 07:31:42.403+00', 'srpwfbwa848'), +('zenz25opw03', '7gznmt956cu', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-28 07:31:42.421+00', '2021-09-28 07:31:42.421+00', 'srpwfbwa848'), +('x1n1jg4c7pk', '45kd3c5ea3k', NULL, 'void', 'Chart.Column', '{"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"type","yField":"sales","label":{"position":"middle","style":{"fill":"#FFFFFF","opacity":0.6}},"xAxis":{"label":{"autoHide":true,"autoRotate":false}},"meta":{"type":{"alias":"类别"},"sales":{"alias":"销售额"}}}},"_isJSONSchemaObject":true,"__insertAfter__":"v9u0xsjsy5k"}', '0', 3, '2021-09-17 07:05:40.283+00', '2021-09-17 07:05:43.326+00', NULL), +('yjtisjjtb4c', 'uql3iglmxg7', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-16 00:27:43.717+00', '2021-09-16 00:27:43.717+00', '3j0y723cg8v'), +('3j0y723cg8v', '9sk6oakg238', NULL, 'void', 'Grid.Row', '{"version":"2.0"}', '0', 1, '2021-09-16 00:27:43.696+00', '2021-09-16 00:27:43.749+00', 'owygfbxi3f0'), +('r86ztpuwg1h', 'vd9kfiba1rf', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.CardItem"}}', '0', 1, '2021-09-17 07:02:23.814+00', '2021-09-17 07:02:23.814+00', 'l8ckfeoxvo1'), +('f2x3u0qhn13', 'eqj075p3g75', '导出', 'void', 'Action', '{"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"export"},"x-action-type":"export","x-designable-bar":"Table.ExportActionDesignableBar","x-component-props":{"fieldNames":[],"icon":"ExportOutlined","useAction":"{{ Table.useTableExportAction }}"}}', '0', 2, '2021-09-18 03:54:57.72+00', '2021-09-18 03:54:57.72+00', 'd4jbza292g8'), +('4uba9orm98n', 'ubz7s218k6v', '添加', 'void', 'Action', '{"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"type":"primary","icon":"PlusOutlined"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-18 03:55:00.115+00', '2021-09-18 03:55:00.115+00', 'd4jbza292g8'), +('trnt52e9uez', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-18 03:55:00.126+00', '2021-09-18 03:55:00.126+00', '4uba9orm98n'), +('5xfxr81mnik', '2eaxih8o92g', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-18 03:55:00.136+00', '2021-09-18 03:55:00.136+00', 'trnt52e9uez'), +('36lwrso65v3', '3owe0pewu6e', '删除', 'void', 'Action', '{"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-action-type":"destroy","x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 4, '2021-09-18 03:55:02.246+00', '2021-09-18 03:55:02.246+00', 'd4jbza292g8'), +('guls135kh0u', 'aw8rybtfzq3', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:53:04.337+00', '2021-09-23 02:53:04.337+00', 'll26mlaeknd'), +('xa306vq72rh', '9qxxjumxunh', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-15 01:30:20.588+00', '2021-09-15 01:30:20.588+00', NULL), +('k50qsygrdju', 'qj6x2b20sv6', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-23 02:52:54.469+00', '2021-09-23 02:52:54.469+00', 'xg91r1bu4yc'), +('7by3vocoo23', '35dhvd59lzc', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_3det6kr3vn8"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 8, '2021-09-12 01:13:57.721+00', '2021-09-26 01:40:16.268+00', 'm25pry2yof2'), +('l8ckfeoxvo1', 'j21m2kvnb42', NULL, 'void', 'Page', '{"_isJSONSchemaObject":true,"version":"2.0"}', '1', 1, '2021-09-17 07:02:23.804+00', '2021-09-17 07:02:23.804+00', NULL), +('v9u0xsjsy5k', 'lhzxmr43sbf', NULL, 'void', 'Chart.Bar', '{"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"sales","yField":"type","legend":{"position":"top-left"},"barBackground":{"style":{"fill":"rgba(0,0,0,0.1)"}},"interactions":[{"type":"active-region","enable":false}]}},"_isJSONSchemaObject":true,"__insertAfter__":"usav4xf4i5b"}', '0', 2, '2021-09-17 07:05:31.04+00', '2021-09-17 07:05:34.215+00', NULL), +('b6yfyzzj97t', 'j0qndfe5se1', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:52:59.658+00', '2021-09-23 02:52:59.658+00', 'xdlyudg1lql'), +('ekr7c95ezz0', 'h27rzgebcbo', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_vgw4f62h16e"}}', '0', 1, '2021-09-23 02:52:59.669+00', '2021-09-23 02:52:59.669+00', 'b6yfyzzj97t'), +('8689mwuwlm4', 'ovt8drv491j', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_61znsfh307m"}}', '0', 1, '2021-09-23 02:53:04.352+00', '2021-09-23 02:53:04.352+00', 'guls135kh0u'), +('0zne1h0m9om', 'w4villdnvam', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:53:11.408+00', '2021-09-23 02:53:11.408+00', 'y9pc4sua6q7'), +('p7z4vdxamgy', 'z8mbt1gmyv1', NULL, 'void', 'Form.Field', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form.Field.Item","x-designable-bar":"Form.Field.DesignableBar","x-component-props":{"fieldName":"f_x9kmuovlm79"}}', '0', 1, '2021-09-23 02:53:11.416+00', '2021-09-23 02:53:11.416+00', '0zne1h0m9om'), +('d0bz7d7vfpo', '07zints3fy5', NULL, 'void', 'Grid.Row', '{"version":"2.0","x-component-props":{"colsize":[77.01329163408913,22.986708365910868]}}', '0', 0, '2021-09-23 02:53:47.059+00', '2021-09-23 02:54:18.462+00', 'fyku58l8svs'), +('xdlyudg1lql', '6a3bwvf7xzs', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 1, '2021-09-23 02:52:59.634+00', '2021-09-23 02:53:16.56+00', 'k50qsygrdju'), +('ll26mlaeknd', '3uv7akige6q', NULL, 'void', 'Grid.Row', '{"version":"2.0","_isJSONSchemaObject":true}', '0', 2, '2021-09-23 02:53:04.322+00', '2021-09-23 02:53:16.596+00', 'k50qsygrdju'), +('dfheixhrh73', 'mn9jnx88ylm', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:52:54.448+00', '2021-09-23 02:52:54.448+00', NULL), +('s0hyddev1yd', '90b5p86ihwv', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 02:53:40.895+00', '2021-09-23 02:53:40.895+00', NULL), +('mrkvuu4e3yn', 'sk6z4ez095e', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-23 03:00:55.08+00', '2021-09-23 03:00:55.08+00', NULL), +('xg91r1bu4yc', '80ietb2xw05', NULL, 'void', 'Form', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-component-props":{"showDefaultButtons":true,"resource":"t_fsveob6p269","collectionName":"t_fsveob6p269"},"x-designable-bar":"Form.DesignableBar"}', '0', 1, '2021-09-23 02:52:54.46+00', '2021-09-23 02:53:52.789+00', NULL), +('f52w6mktfha', '3jhrbrwsm67', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_bysgds7j36p"},"x-designable-bar":"Table.Column.DesignableBar"}', '0', 10, '2021-09-26 01:39:45.644+00', '2021-09-26 01:39:45.644+00', 'm25pry2yof2'), +('tuqese9cy51', 'm7o9ywka37s', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"users","collectionName":"users"}}', '0', 1, '2021-09-28 07:31:42.374+00', '2021-09-28 07:31:42.374+00', 'wfutrgolvls'), +('30wf2drh766', 'gvpicpdl6q2', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-28 07:31:42.436+00', '2021-09-28 07:31:42.436+00', 'srpwfbwa848'), +('0hvg7ragxl3', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-28 07:31:42.45+00', '2021-09-28 07:31:42.45+00', '30wf2drh766'), +('mxa4xx3yyoz', '5wzq913ivsf', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-28 07:31:42.462+00', '2021-09-28 07:31:42.462+00', '0hvg7ragxl3'), +('so891i2scx8', 'qanji0r760h', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-28 07:31:42.486+00', '2021-09-28 07:31:42.486+00', 'tuqese9cy51'), +('jcl4upi8c0k', '1g3xl2a0dyh', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-28 07:31:42.498+00', '2021-09-28 07:31:42.498+00', 'so891i2scx8'), +('fpbg99d81zp', 'pjecvce3599', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-28 07:31:42.511+00', '2021-09-28 07:31:42.511+00', 'jcl4upi8c0k'), +('b3rjtsn179c', 'xjoncuya2ty', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-28 07:31:42.521+00', '2021-09-28 07:31:42.521+00', 'fpbg99d81zp'), +('6bjru8t640j', 'b53moyja54y', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-28 07:31:42.531+00', '2021-09-28 07:31:42.531+00', 'b3rjtsn179c'), +('ma4ckjpypjs', 'odgcv4yxcma', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-28 07:31:42.541+00', '2021-09-28 07:31:42.541+00', '6bjru8t640j'), +('8swp1tfnvev', 'plt6u2epdxv', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-28 07:31:42.55+00', '2021-09-28 07:31:42.55+00', 'ma4ckjpypjs'), +('uy1r0yo0cel', 'kn66bpkn9w7', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-28 07:31:42.575+00', '2021-09-28 07:31:42.575+00', 'jcl4upi8c0k'), +('6g2w45lfd76', '1wx811y1so8', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-28 07:31:42.585+00', '2021-09-28 07:31:42.585+00', 'uy1r0yo0cel'), +('boo65v9yrdm', '1ithve7flw7', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-28 07:31:42.596+00', '2021-09-28 07:31:42.596+00', '6g2w45lfd76'), +('lt2ywg5a6d1', 's4000bd2bc7', NULL, 'void', 'Markdown.Void', '{"_isJSONSchemaObject":true,"version":"2.0","default":"这是一段演示文字,**支持使用 Markdown 语法**","x-designable-bar":"Markdown.Void.DesignableBar","x-decorator":"CardItem","x-read-pretty":true}', '0', 1, '2021-09-28 07:31:46.697+00', '2021-09-28 07:31:46.697+00', 'fphav5476fd'), +('cf8ykdgpv0c', '0de8m92erut', NULL, 'void', 'Chart.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"CardItem","x-designable-bar":"Chart.DesignableBar","x-component-props":{"config":{"data":[{"type":"家具家电","sales":38},{"type":"粮油副食","sales":52},{"type":"生鲜水果","sales":61},{"type":"美容洗护","sales":145},{"type":"母婴用品","sales":48},{"type":"进口食品","sales":38},{"type":"食品饮料","sales":38},{"type":"家庭清洁","sales":38}],"xField":"type","yField":"sales","label":{"position":"middle","style":{"fill":"#FFFFFF","opacity":0.6}},"xAxis":{"label":{"autoHide":true,"autoRotate":false}},"meta":{"type":{"alias":"类别"},"sales":{"alias":"销售额"}}}}}', '0', 1, '2021-09-28 07:32:03.145+00', '2021-09-28 07:32:03.145+00', '8gggtua2wvh'), +('wfutrgolvls', 'gievpmqi28u', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-28 07:31:42.363+00', '2021-09-28 07:31:42.363+00', NULL), +('21nm4c2oypx', 'wqox6ds1h3u', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-28 07:32:16.651+00', '2021-09-28 07:32:16.651+00', 'b4mdjxweb8m'), +('l5sclain3qf', 'fpoc4sg4rzw', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-28 07:32:16.668+00', '2021-09-28 07:32:16.668+00', '21nm4c2oypx'), +('cobdwkws3ye', 'uf0iplyr128', '删除', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"destroy"},"x-designable-bar":"Table.Action.DesignableBar","x-component-props":{"icon":"DeleteOutlined","confirm":{"title":"删除数据","content":"删除后无法恢复,确定要删除吗?"},"useAction":"{{ Table.useTableDestroyAction }}"}}', '0', 2, '2021-09-28 07:32:16.682+00', '2021-09-28 07:32:16.682+00', '21nm4c2oypx'), +('6m73js9ryzk', 'enboy8qehz0', '添加', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-align":"right","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"create"},"x-component-props":{"icon":"PlusOutlined","type":"primary"},"x-designable-bar":"Table.Action.DesignableBar"}', '0', 3, '2021-09-28 07:32:16.698+00', '2021-09-28 07:32:16.698+00', '21nm4c2oypx'), +('onei5csxzdf', 'modal', '添加数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Table.useTableCreateAction }}"}}', '0', 1, '2021-09-28 07:32:16.709+00', '2021-09-28 07:32:16.709+00', '6m73js9ryzk'), +('nmn2zk10j9u', 'sxiizv90lid', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-28 07:32:16.717+00', '2021-09-28 07:32:16.717+00', 'onei5csxzdf'), +('juc2vvib1ef', 'pdpx0gbclap', '操作', 'void', 'Table.Column', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{},"x-designable-bar":"Table.Operation.DesignableBar"}', '0', 2, '2021-09-28 07:32:16.741+00', '2021-09-28 07:32:16.741+00', 'b4mdjxweb8m'), +('akph7mgaspk', '4fgwwym4u2z', NULL, 'void', 'Action.Group', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"}}', '0', 1, '2021-09-28 07:32:16.752+00', '2021-09-28 07:32:16.752+00', 'juc2vvib1ef'), +('bpdf3iczgfd', '8hxzqbp16bn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-28 07:32:16.624+00', '2021-09-28 07:32:16.624+00', NULL), +('fphav5476fd', '9sihw7sqpwn', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-28 07:31:46.687+00', '2021-09-28 07:31:46.687+00', NULL), +('8gggtua2wvh', 'eux13k5p7zf', NULL, 'void', 'Grid.Col', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 1, '2021-09-28 07:32:03.134+00', '2021-09-28 07:32:03.134+00', NULL), +('pkpmgadcjnc', 'lymq4clkqut', '查看', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"view"}', '0', 1, '2021-09-28 07:32:16.765+00', '2021-09-28 07:32:16.765+00', 'akph7mgaspk'), +('w2z3pp7s8wm', 'x2ilqmpqobh', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-28 07:32:16.776+00', '2021-09-28 07:32:16.776+00', 'pkpmgadcjnc'), +('yqyya846ipy', 'a7a4nl8bpjf', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-28 07:32:16.789+00', '2021-09-28 07:32:16.789+00', 'w2z3pp7s8wm'), +('oqrxhfl2nv8', 'jkw8a1fjcy5', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-28 07:32:16.799+00', '2021-09-28 07:32:16.799+00', 'yqyya846ipy'), +('pfxyxyvc82b', 'x4w9i91xqwa', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-28 07:32:16.812+00', '2021-09-28 07:32:16.812+00', 'oqrxhfl2nv8'), +('myxsypp6ewm', '6rh8wd63xuy', '编辑', 'void', 'Action', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"type":"link"},"x-designable-bar":"Table.Action.DesignableBar","x-action-type":"update"}', '0', 2, '2021-09-28 07:32:16.837+00', '2021-09-28 07:32:16.837+00', 'akph7mgaspk'), +('9ohukjdo6wd', 'giqrp4nan41', '编辑数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-decorator-props":{"useResource":"{{ Table.useResource }}","useValues":"{{ Table.useTableRowRecord }}"},"x-component-props":{"useOkAction":"{{ Table.useTableUpdateAction }}"}}', '0', 1, '2021-09-28 07:32:16.845+00', '2021-09-28 07:32:16.845+00', 'myxsypp6ewm'), +('3djuv6syvmo', 'jo42gl9x9pz', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.FormItem"}}', '0', 1, '2021-09-28 07:32:16.854+00', '2021-09-28 07:32:16.854+00', '9ohukjdo6wd'), +('8rvzpcp7u5k', 'options', '关联数据', 'void', 'Select.Options.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"Form","x-component-props":{"useOkAction":"{{ Select.useOkAction }}"}}', '0', 1, '2021-09-28 07:32:23.083+00', '2021-09-28 07:32:23.083+00', 't0972ciedkm'), +('m2i146a9kp2', 'table', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"BlockItem","x-decorator-props":{"draggable":false},"default":[],"x-component-props":{"rowKey":"id","useRowSelection":"{{ Select.useRowSelection }}","useSelectedRowKeys":"{{ Select.useSelectedRowKeys }}","onSelect":"{{ Select.useSelect() }}","collectionName":"t_fsveob6p269","refreshRequestOnChange":true,"pagination":{"pageSize":10}}}', '0', 1, '2021-09-28 07:32:23.104+00', '2021-09-28 07:32:23.104+00', '8rvzpcp7u5k'), +('3m8jeqw5pg6', 'ue9qiq3c2yx', NULL, 'void', 'Table.ActionBar', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.ActionBar.DesignableBar"}', '0', 1, '2021-09-28 07:32:23.117+00', '2021-09-28 07:32:23.117+00', 'm2i146a9kp2'), +('diln863m17a', '2vshnr3e38n', '筛选', 'void', 'Table.Filter', '{"_isJSONSchemaObject":true,"version":"2.0","x-decorator":"AddNew.Displayed","x-decorator-props":{"displayName":"filter"},"x-align":"left","x-designable-bar":"Table.Filter.DesignableBar","x-component-props":{"fieldNames":[]}}', '0', 1, '2021-09-28 07:32:23.128+00', '2021-09-28 07:32:23.128+00', '3m8jeqw5pg6'), +('3dhn312agul', 'option', NULL, 'void', 'Select.OptionTag', '{"_isJSONSchemaObject":true,"version":"2.0"}', '0', 2, '2021-09-28 07:32:23.157+00', '2021-09-28 07:32:23.157+00', 't0972ciedkm'), +('378oa3qwvna', '627z7fcsoik', '查看数据', 'void', 'Action.Drawer', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"bodyStyle":{"background":"#f0f2f5"}}}', '0', 1, '2021-09-28 07:32:23.169+00', '2021-09-28 07:32:23.169+00', '3dhn312agul'), +('4w8zzzfz9ib', '6brbhwjm0yj', NULL, 'void', 'Tabs', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.DesignableBar"}', '0', 1, '2021-09-28 07:32:23.222+00', '2021-09-28 07:32:23.222+00', '378oa3qwvna'), +('1rar6tnjeco', 'llpcg3ltqdo', '详情', 'void', 'Tabs.TabPane', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Tabs.TabPane.DesignableBar","x-component-props":{}}', '0', 1, '2021-09-28 07:32:23.232+00', '2021-09-28 07:32:23.232+00', '4w8zzzfz9ib'), +('o96l97flc7j', 'bxe1z3dukkd', NULL, 'void', 'Grid', '{"_isJSONSchemaObject":true,"version":"2.0","x-component-props":{"addNewComponent":"AddNew.PaneItem"}}', '0', 1, '2021-09-28 07:32:23.248+00', '2021-09-28 07:32:23.248+00', '1rar6tnjeco'), +('dw6okmsl0iq', 'i2utmjot145', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"5bjnabydou3"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 3, '2021-09-28 07:32:21.413+00', '2021-09-28 07:32:34.582+00', 'b4mdjxweb8m'), +('64mgwdjjo1j', '1xz8w4mt7z2', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_umjewufbyhj"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 4, '2021-09-28 07:32:22.58+00', '2021-09-28 07:32:34.586+00', 'b4mdjxweb8m'), +('t0972ciedkm', 'nu661iw9dro', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_kkopbnfdd0v"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 5, '2021-09-28 07:32:23.038+00', '2021-09-28 07:32:34.598+00', 'b4mdjxweb8m'), +('kquckgvhqru', 'b3ag4a054ah', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_nlgk67tpdql"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 6, '2021-09-28 07:32:23.505+00', '2021-09-28 07:32:34.669+00', 'b4mdjxweb8m'), +('afy1ws6mg60', 'ac5vk22kprp', NULL, 'void', 'Table.Column', '{"version":"2.0","x-component-props":{"fieldName":"f_niymyj0no38"},"x-designable-bar":"Table.Column.DesignableBar","_isJSONSchemaObject":true}', '0', 7, '2021-09-28 07:32:24.043+00', '2021-09-28 07:32:34.676+00', 'b4mdjxweb8m'), +('b4mdjxweb8m', '78xasyzpukz', NULL, 'array', 'Table', '{"_isJSONSchemaObject":true,"version":"2.0","x-designable-bar":"Table.DesignableBar","x-decorator":"CardItem","default":[],"x-component-props":{"rowKey":"id","dragSort":true,"showIndex":true,"refreshRequestOnChange":true,"pagination":{"pageSize":10},"resource":"t_geso7fru7a9","collectionName":"t_geso7fru7a9"}}', '0', 1, '2021-09-28 07:32:16.642+00', '2021-09-28 07:32:34.482+00', NULL); diff --git a/packages/plugin-client/src/db/part1/02-collections.sql b/packages/plugin-client/src/db/part1/02-collections.sql new file mode 100644 index 0000000000000000000000000000000000000000..ebc2bbfa8233e2c6fe22cabf0b33c1ade30f854b --- /dev/null +++ b/packages/plugin-client/src/db/part1/02-collections.sql @@ -0,0 +1,6 @@ +DELETE FROM "collections"; +INSERT INTO "collections" ("name", "logging", "title", "privilege", "sortable", "options", "sort", "created_at", "updated_at", "ui_schema_key") VALUES +('users', '1', '用户', 'undelete', '"sort"', '{"createdBy":false,"updatedBy":false}', 2, '2021-09-02 15:07:56.914+00', '2021-09-15 00:59:20.676+00', NULL), +('t_fsveob6p269', '1', '顾客', NULL, '"sort"', '{}', 5, '2021-09-12 01:05:52.722+00', '2021-09-18 04:15:23.113+00', NULL), +('t_geso7fru7a9', '1', '订单', NULL, '"sort"', '{}', 4, '2021-09-12 01:06:05.19+00', '2021-09-18 04:15:42.566+00', NULL), +('t_2uhu4szs1kq', '1', '任务', NULL, '"sort"', '{}', 3, '2021-09-03 08:17:30.495+00', '2021-09-18 04:15:42.572+00', NULL); diff --git a/packages/plugin-client/src/db/part1/03-fields.sql b/packages/plugin-client/src/db/part1/03-fields.sql new file mode 100644 index 0000000000000000000000000000000000000000..d822d7f8feeca7976bb0a833ebaed9a0dfaf80f3 --- /dev/null +++ b/packages/plugin-client/src/db/part1/03-fields.sql @@ -0,0 +1,55 @@ +DELETE FROM "fields"; +INSERT INTO "fields" ("key", "name", "interface", "data_type", "privilege", "state", "options", "sort", "created_at", "updated_at", "parent_key", "collection_name", "ui_schema_key", "reverse_key") VALUES +('aun85p76s0v', 'f_l8uuiwcnlw9', 'textarea', 'text', NULL, 1, '{}', 8, '2021-09-12 08:18:46.92+00', '2021-09-12 08:18:46.935+00', NULL, 't_2uhu4szs1kq', 'c2pallk0lge', NULL), +('sj5p2y4ac06', '70enejazumv', 'updatedAt', 'date', 'undelete', 1, '{"field":"updated_at"}', 2, '2021-09-03 08:17:30.543+00', '2021-09-03 08:17:30.555+00', NULL, 't_2uhu4szs1kq', 'lchrxtjm3d5', NULL), +('1fvb1qre4ut', 'baa90jd887d', 'updatedBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"updated_by_id"}', 3, '2021-09-03 08:17:30.579+00', '2021-09-18 04:16:11.834+00', NULL, 't_2uhu4szs1kq', 'd3zwndj0gdt', NULL), +('78h1q25dt1h', 'wtojfhp8nwl', 'createdBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"created_by_id"}', 2, '2021-09-03 08:17:30.563+00', '2021-09-18 04:16:11.834+00', NULL, 't_2uhu4szs1kq', 'uxcvj4473q9', NULL), +('s30o2rkxcht', 'f_hwenour8ara', 'string', 'string', NULL, 1, '{}', 5, '2021-09-03 08:18:44.958+00', '2021-09-03 08:18:44.975+00', NULL, 't_2uhu4szs1kq', 'c6qmyf4uzl9', NULL), +('e76mvcf7a1r', 'f_hznqtmqljb2', 'datetime', 'date', NULL, 1, '{}', 6, '2021-09-03 08:18:44.984+00', '2021-09-03 08:18:45+00', NULL, 't_2uhu4szs1kq', '7u0cu6nfu44', NULL), +('c385a9rhd6d', 'f_u4i0jrp4uo6', 'radioGroup', 'string', NULL, 1, '{}', 7, '2021-09-03 08:18:45.009+00', '2021-09-03 08:18:45.028+00', NULL, 't_2uhu4szs1kq', '5de6xmem8vw', NULL), +('8ms3ivkxaku', '8ke6k4er30w', 'createdAt', 'date', 'undelete', 1, '{"field":"created_at"}', 1, '2021-09-03 08:17:30.522+00', '2021-09-03 08:17:30.536+00', NULL, 't_2uhu4szs1kq', 'y9y4mgjy6ot', NULL), +('ymwwuuje5cf', 'vygajfyejo0', 'updatedBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"updated_by_id"}', 3, '2021-09-12 01:05:52.791+00', '2021-09-18 04:16:11.834+00', NULL, 't_fsveob6p269', 'g6fgjhxwqdt', NULL), +('kru7yomwffj', 'f_kk4nspj1i28', 'textarea', 'text', NULL, 1, '{}', 13, '2021-09-12 01:13:43.315+00', '2021-09-14 02:50:54.757+00', NULL, 't_fsveob6p269', 'ic1crmml3ww', NULL), +('xjnnqtckv6o', 'f_x9kmuovlm79', 'radioGroup', 'string', NULL, 1, '{}', 11, '2021-09-12 01:13:43.241+00', '2021-09-14 02:50:54.738+00', NULL, 't_fsveob6p269', 'cntdgyegzk1', NULL), +('hfry2ook2w4', 'f_n6snaop9d4y', 'chinaRegion', 'belongsToMany', NULL, 1, '{"target":"china_regions","targetKey":"code","through":"t_p13gbi31uux","foreignKey":"f_86s65mbw93e","otherKey":"f_hwx3hgg5b5t","sourceKey":"id"}', 10, '2021-09-12 01:17:01.062+00', '2021-09-14 02:50:54.728+00', NULL, 't_fsveob6p269', 'o21p57oi4ci', NULL), +('zobi3o3dqzp', 'f_61znsfh307m', 'select', 'string', NULL, 1, '{}', 8, '2021-09-12 01:17:01.042+00', '2021-09-14 02:50:54.697+00', NULL, 't_fsveob6p269', 'zncs2fmi3md', NULL), +('gjc3mks1xvj', 'f_bysgds7j36p', 'datetime', 'date', NULL, 1, '{}', 9, '2021-09-12 01:13:43.26+00', '2021-09-14 02:50:54.713+00', NULL, 't_fsveob6p269', 'wy9l25k1k8n', NULL), +('lie1tta3peq', 'f_3det6kr3vn8', 'phone', 'string', NULL, 1, '{}', 7, '2021-09-12 01:13:43.221+00', '2021-09-14 02:50:54.686+00', NULL, 't_fsveob6p269', 'd0vxh9zspr0', NULL), +('9cpd377df7t', 'f_tdoe0q00xc6', 'attachment', 'belongsToMany', NULL, 1, '{"target":"attachments","through":"t_jh7a28dsfzi","foreignKey":"f_xg3mysbjfra","otherKey":"f_gc7ppj0b7n1","sourceKey":"id","targetKey":"id"}', 12, '2021-09-12 01:13:43.292+00', '2021-09-12 08:41:20.155+00', NULL, 't_fsveob6p269', 'mz5lwuvl3ne', NULL), +('mnglxpxjqs4', 'f_vgw4f62h16e', 'string', 'string', NULL, 1, '{}', 6, '2021-09-12 01:13:43.204+00', '2021-09-12 01:13:43.215+00', NULL, 't_fsveob6p269', 'r9i0nuz6gaa', NULL), +('f_c8mes0kp1zt', 'f_c8mes0kp1zt', 'linkTo', 'belongsToMany', NULL, 1, '{"through":"t_bphcojtl8bx","foreignKey":"f_cn6a3p0wq2p","otherKey":"f_4x6u1waa8r6","sourceKey":"id","targetKey":"id","target":"t_geso7fru7a9"}', 5, '2021-09-12 01:09:26.259+00', '2021-09-12 01:13:43.195+00', NULL, 't_fsveob6p269', 'h73wygfixrg', 'nb09uq85geu'), +('bz701wfev96', 'xkllcgbvvmt', 'createdBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"created_by_id"}', 2, '2021-09-12 01:05:52.77+00', '2021-09-18 04:16:11.834+00', NULL, 't_fsveob6p269', 'si4x29vvkeb', NULL), +('mqcm1jb1ziw', '77trwzoaaei', 'createdAt', 'date', 'undelete', 1, '{"field":"created_at"}', 1, '2021-09-12 01:05:52.734+00', '2021-09-12 01:05:52.746+00', NULL, 't_fsveob6p269', '6zt8a6vfmeg', NULL), +('2abol7bhbmj', 'uahfxi6okcs', 'updatedAt', 'date', 'undelete', 1, '{"field":"updated_at"}', 2, '2021-09-12 01:05:52.753+00', '2021-09-12 01:05:52.765+00', NULL, 't_fsveob6p269', 'q1bwolkkq5w', NULL), +('19r6wt5b4m3', 'f_nlgk67tpdql', 'select', 'string', NULL, 1, '{}', 7, '2021-09-12 01:09:26.235+00', '2021-09-12 01:09:26.245+00', NULL, 't_geso7fru7a9', 'e5r226qqi20', NULL), +('nb09uq85geu', 'f_kkopbnfdd0v', 'linkTo', 'belongsToMany', NULL, 1, '{"through":"t_bphcojtl8bx","foreignKey":"f_4x6u1waa8r6","otherKey":"f_cn6a3p0wq2p","sourceKey":"id","targetKey":"id","target":"t_fsveob6p269"}', 6, '2021-09-12 01:09:26.221+00', '2021-09-12 01:09:26.278+00', NULL, 't_geso7fru7a9', 'kmx147xwkrp', 'f_c8mes0kp1zt'), +('nv0iw8wdxmz', '5bjnabydou3', 'createdAt', 'date', 'undelete', 1, '{"field":"created_at"}', 1, '2021-09-12 01:06:05.199+00', '2021-09-12 01:06:05.21+00', NULL, 't_geso7fru7a9', 'u1767w73vdn', NULL), +('lu1ibrb0yi2', '44fpkg5ga5n', 'updatedAt', 'date', 'undelete', 1, '{"field":"updated_at"}', 2, '2021-09-12 01:06:05.215+00', '2021-09-12 01:06:05.225+00', NULL, 't_geso7fru7a9', 'fmweeu589m9', NULL), +('fp2hcdcmxzm', 'qbe1q17p9kh', 'updatedBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"updated_by_id"}', 3, '2021-09-12 01:06:05.245+00', '2021-09-18 04:16:11.834+00', NULL, 't_geso7fru7a9', 'dzc486mzccr', NULL), +('qpme60wf4lt', '1jkpjg7vkgi', 'createdBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"created_by_id"}', 2, '2021-09-12 01:06:05.23+00', '2021-09-18 04:16:11.834+00', NULL, 't_geso7fru7a9', 'bi9n4qdvvk2', NULL), +('0qx4mudmft8', 'f_umjewufbyhj', 'datetime', 'date', NULL, 1, '{}', 5, '2021-09-12 01:09:26.202+00', '2021-09-12 01:09:26.215+00', NULL, 't_geso7fru7a9', 'yo6wjwgsfx2', NULL), +('ckyhgqq0jru', 'f_niymyj0no38', 'string', 'string', NULL, 1, '{}', 8, '2021-09-12 07:36:53.506+00', '2021-09-12 07:36:53.518+00', NULL, 't_geso7fru7a9', 'x6j2o6xw1by', NULL), +('f_80zv5suy9t6', 'email', 'email', 'string', 'undelete', 1, '{"unique":true}', 4, '2021-09-02 15:07:57.001+00', '2021-09-18 04:16:11.839+00', NULL, 'users', '5nqs5glgn5c', NULL), +('f_dpll75sxhu6', 'token', 'password', 'string', 'undelete', 0, '{"unique":true,"hidden":true}', 5, '2021-09-02 15:07:57.052+00', '2021-09-02 15:07:57.052+00', NULL, 'users', NULL, NULL), +('f_v3pog2zsalc', 'reset_token', 'password', 'string', 'undelete', 0, '{"unique":true,"hidden":true}', 6, '2021-09-02 15:07:57.059+00', '2021-09-02 15:07:57.059+00', NULL, 'users', NULL, NULL), +('f_6rhh0scyw9k', 'nickname', 'string', 'string', NULL, 1, '{}', 1, '2021-09-02 15:07:56.974+00', '2021-09-12 00:56:41.776+00', NULL, 'users', 'dtu7erjj0q8', NULL), +('f_j367murpzm9', 'password', 'password', 'password', 'undelete', 1, '{}', 2, '2021-09-02 15:07:57.029+00', '2021-09-18 04:16:11.834+00', NULL, 'users', 'a65exd8qcuo', NULL), +('6rm0lspbpeh', 'f_l6xhfn14zji', 'subTable', 'hasMany', NULL, 1, '{"target":"t_an8gnr603c0","foreignKey":"f_d57qfk4yfaz"}', 3, '2021-09-12 00:56:41.818+00', '2021-09-18 04:16:11.834+00', NULL, 'users', '412w3sy7u91', NULL), +('lmls9t34zne', 'f_xmjn5cfl9co', 'textarea', 'text', NULL, 1, '{}', 10, '2021-09-02 22:28:32.838+00', '2021-09-02 22:28:32.855+00', NULL, NULL, 'hej1gpzthf3', NULL), +('sq3hj75dnmk', 'f_jdlw4uf6vfv', 'number', 'float', NULL, 1, '{}', 9, '2021-09-02 22:28:32.82+00', '2021-09-02 22:28:32.83+00', NULL, NULL, 'e5t9w7t3rxu', NULL), +('xwhnxsil7b1', 'f_n0snwtdes3r', 'chinaRegion', 'belongsToMany', NULL, 1, '{"target":"china_regions","targetKey":"code","through":"t_by1bsepp8p4","foreignKey":"f_vqbqkbjmucq","otherKey":"f_ux2lh2en547","sourceKey":"id"}', 8, '2021-09-02 22:28:32.8+00', '2021-09-02 22:28:32.814+00', NULL, NULL, '4an73nd4bxh', NULL), +('wolxy2l6xp2', 'f_jbqopur80lk', 'attachment', 'belongsToMany', NULL, 1, '{"target":"attachments","through":"t_mrsootcimgg","foreignKey":"f_moakulo9ak1","otherKey":"f_27xvqwj1o9s","sourceKey":"id","targetKey":"id"}', 7, '2021-09-02 22:28:32.777+00', '2021-09-02 22:28:32.792+00', NULL, NULL, '4blpztuxkha', NULL), +('2wpjada7upn', 'f_lov82rwvxgk', 'multipleSelect', 'json', NULL, 1, '{}', 6, '2021-09-02 22:27:03.764+00', '2021-09-02 22:27:03.776+00', NULL, NULL, 'exjytl34657', NULL), +('ybbxmw9ifwf', 'f_lwyvh77c122', 'string', 'string', NULL, 1, '{}', 5, '2021-09-02 22:27:03.741+00', '2021-09-02 22:27:03.758+00', NULL, NULL, 'xe5j6tk6y52', NULL), +('cy37tmd1aa5', '2e5im9hsrau', 'updatedAt', 'date', 'undelete', 1, '{"field":"updated_at"}', 2, '2021-09-02 22:24:30.263+00', '2021-09-02 22:24:30.282+00', NULL, NULL, 'ue90wlv7r26', NULL), +('9zmg4gsrbs0', 'ccdop3v4iqw', 'createdAt', 'date', 'undelete', 1, '{"field":"created_at"}', 1, '2021-09-02 22:24:30.239+00', '2021-09-02 22:24:30.255+00', NULL, NULL, 'qc0b0d2xfo4', NULL), +('f_1eni2gp5w3g', 'action_logs', 'linkTo', 'hasMany', NULL, 0, '{"target":"action_logs","title":"数据动态","foreignKey":"index","scope":{"collection_name":"t_n93qitmhzty"},"constraints":false}', 7, '2021-09-02 22:24:30.219+00', '2021-09-02 22:24:30.219+00', NULL, NULL, NULL, NULL), +('exfseozu257', '3s4pr34nuvz', 'updatedBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"updated_by_id"}', 3, '2021-09-12 01:06:55.172+00', '2021-09-18 04:16:11.834+00', NULL, NULL, 'k40ozwnisyr', NULL), +('f_u5fajgprjha', 'action_logs', 'linkTo', 'hasMany', NULL, 0, '{"target":"action_logs","title":"数据动态","foreignKey":"index","scope":{"collection_name":"users"},"constraints":false}', 1, '2021-09-02 15:07:56.957+00', '2021-09-02 15:07:57.071+00', NULL, NULL, NULL, NULL), +('b818d9mhozu', '8ly3cyiosfe', 'createdBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"created_by_id"}', 2, '2021-09-02 22:24:30.286+00', '2021-09-18 04:16:11.834+00', NULL, NULL, '32q17i8jcg9', NULL), +('x3rcr6i0hy1', 'c9mtu486512', 'updatedBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"updated_by_id"}', 3, '2021-09-02 22:24:30.301+00', '2021-09-18 04:16:11.834+00', NULL, NULL, '1keis1kmsh9', NULL), +('qv7j30tzjcu', 'f_m04t8iyg9kc', 'textarea', 'text', NULL, 1, '{}', 2, '2021-09-12 00:56:41.988+00', '2021-09-12 00:56:42.003+00', '6rm0lspbpeh', NULL, '0tq5fymokmh', NULL), +('v3hp0idmkuh', 'f_fo0l5irbdt5', 'string', 'string', NULL, 1, '{}', 1, '2021-09-12 00:56:41.958+00', '2021-09-12 00:56:41.976+00', '6rm0lspbpeh', NULL, 'u2m5d5e68n0', NULL), +('t6knha71oq1', 'fcgtvpd3jr9', 'createdBy', 'belongsTo', 'undelete', 1, '{"target":"users","foreignKey":"created_by_id"}', 2, '2021-09-12 01:06:55.154+00', '2021-09-18 04:16:11.834+00', NULL, NULL, 'ya58lec57fp', NULL), +('drhtax7pxlw', 'nbxtd3jzbw1', 'updatedAt', 'date', 'undelete', 1, '{"field":"updated_at"}', 2, '2021-09-12 01:06:55.14+00', '2021-09-12 01:06:55.149+00', NULL, NULL, '1l9qav1f97v', NULL), +('sbrf1cdkpb9', 'h1f9o1xvevb', 'createdAt', 'date', 'undelete', 1, '{"field":"created_at"}', 1, '2021-09-12 01:06:55.123+00', '2021-09-12 01:06:55.133+00', NULL, NULL, 'oo7ejuze28i', NULL); diff --git a/packages/plugin-client/src/db/part1/04-routes.sql b/packages/plugin-client/src/db/part1/04-routes.sql new file mode 100644 index 0000000000000000000000000000000000000000..a2125c255d6f82783d79935b71eb08c725f143c6 --- /dev/null +++ b/packages/plugin-client/src/db/part1/04-routes.sql @@ -0,0 +1,7 @@ +DELETE FROM "routes"; +INSERT INTO "routes" ("key", "type", "options", "sort", "created_at", "updated_at", "parent_key", "ui_schema_key") VALUES +('r_94b8nz6evyh', 'redirect', '{"from":"/","to":"/admin","exact":true}', 1, '2021-09-02 15:07:57.162+00', '2021-09-02 15:07:57.162+00', NULL, NULL), +('r_w1sa2lfk44v', 'route', '{"path":"/admin/:name(.+)?","component":"AdminLayout","title":"后台"}', 2, '2021-09-02 15:07:57.17+00', '2021-09-02 15:07:57.185+00', NULL, 'qqzzjakwkwl'), +('r_nt33b3m6ptk', 'route', '{"component":"AuthLayout"}', 3, '2021-09-02 15:07:57.19+00', '2021-09-02 15:07:57.19+00', NULL, NULL), +('r_5l9yp15wjk9', 'route', '{"path":"/login","component":"RouteSchemaRenderer","title":"登录"}', 1, '2021-09-02 15:07:57.196+00', '2021-09-02 15:07:57.252+00', 'r_nt33b3m6ptk', 'dtf9j0b8p9u'), +('r_9gqm4d8wpuw', 'route', '{"path":"/register","component":"RouteSchemaRenderer","title":"注册"}', 2, '2021-09-02 15:07:57.256+00', '2021-09-02 15:07:57.343+00', 'r_nt33b3m6ptk', '46qlxqam3xk'); diff --git a/packages/plugin-client/src/db/part1/05-attachments.sql b/packages/plugin-client/src/db/part1/05-attachments.sql new file mode 100644 index 0000000000000000000000000000000000000000..b2bb0fa3745600fb192de151c8e8f808435d67c6 --- /dev/null +++ b/packages/plugin-client/src/db/part1/05-attachments.sql @@ -0,0 +1,30 @@ +DELETE FROM "attachments"; +INSERT INTO "attachments" ("id", "title", "filename", "extname", "size", "mimetype", "path", "meta", "url", "created_at", "updated_at", "created_by_id", "updated_by_id", "storage_id") VALUES +(2, 'Nocobase', 'dac1165de10a3373a87ae4e5da9788ab.png', '.png', NULL, 'image/png', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/dac1165de10a3373a87ae4e5da9788ab.png', '2021-09-04 01:33:38.878+00', '2021-09-04 01:33:38.878+00', NULL, NULL, 2), +(3, 'grapes-276070_1280', '3451976fea63a882b5fd661aa211693e.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3451976fea63a882b5fd661aa211693e.jpg', '2021-09-04 01:34:50.388+00', '2021-09-04 01:34:50.388+00', NULL, 1, 2), +(4, 'purple-grapes-553464_1280', 'f2b7ace2b03d2808b5adddcb5f81f4e2.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/f2b7ace2b03d2808b5adddcb5f81f4e2.jpg', '2021-09-04 01:34:50.435+00', '2021-09-04 01:34:50.435+00', NULL, 1, 2), +(6, 'tomatoes-1603611_1280', '0c98117a122ed99ad78a9f2d754c6b62.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/0c98117a122ed99ad78a9f2d754c6b62.jpg', '2021-09-12 01:20:43.878+00', '2021-09-12 01:20:43.878+00', NULL, 1, 2), +(5, '合同', '1bbab8facf3e43cbfd530b362df60714.pdf', '.pdf', NULL, 'application/pdf', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/1bbab8facf3e43cbfd530b362df60714.pdf', '2021-09-12 01:20:43.869+00', '2021-09-12 01:20:43.869+00', NULL, 1, 2), +(7, '简历', 'd9f6ad6669902a9a8a1229d9f362235a.docx', '.docx', NULL, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/d9f6ad6669902a9a8a1229d9f362235a.docx', '2021-09-12 01:22:06.229+00', '2021-09-12 01:22:06.229+00', NULL, 1, 2), +(9, 'snack-1561578_1280', 'dea2463a3e11fc0c548ef4173f0477b4.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/dea2463a3e11fc0c548ef4173f0477b4.jpg', '2021-09-12 07:41:02.59+00', '2021-09-12 07:41:02.59+00', NULL, 1, 2), +(10, 'tomatoes-447170_1280', 'f25b21c6476b2161818f9b6013438c53.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/f25b21c6476b2161818f9b6013438c53.jpg', '2021-09-12 07:41:02.628+00', '2021-09-12 07:41:02.628+00', NULL, 1, 2), +(8, 'tomatoes-1603611_1280', '3fa777ce653ee844d3c44a435d96415e.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3fa777ce653ee844d3c44a435d96415e.jpg', '2021-09-12 07:41:02.587+00', '2021-09-12 07:41:02.587+00', NULL, 1, 2), +(12, '合同', '3345d3ffc5277c25fa4339dc889e03e0.pdf', '.pdf', NULL, 'application/pdf', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3345d3ffc5277c25fa4339dc889e03e0.pdf', '2021-09-12 07:41:50.531+00', '2021-09-12 07:41:50.531+00', NULL, 1, 2), +(11, '简历', '9e21210c35bc0cb6e8da3a7e32ec6250.docx', '.docx', NULL, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/9e21210c35bc0cb6e8da3a7e32ec6250.docx', '2021-09-12 07:41:50.529+00', '2021-09-12 07:41:50.529+00', NULL, 1, 2), +(15, 'collage-1572905_1280', '4edc12d2e2cb84fd50fb248f01e2153a.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/4edc12d2e2cb84fd50fb248f01e2153a.jpg', '2021-09-12 07:42:34.807+00', '2021-09-12 07:42:34.807+00', NULL, 1, 2), +(14, 'eat-1603660_1280', '8b38db60e88f280373c4e3afcbfd7929.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/8b38db60e88f280373c4e3afcbfd7929.jpg', '2021-09-12 07:42:34.8+00', '2021-09-12 07:42:34.8+00', NULL, 1, 2), +(13, 'fruit-712729_1280', 'c467a64ad4e62d4d383c4476677a9cf6.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/c467a64ad4e62d4d383c4476677a9cf6.jpg', '2021-09-12 07:42:34.776+00', '2021-09-12 07:42:34.776+00', NULL, 1, 2), +(16, 'fruit-1213041_1280', 'f7f0f982e58c84b1ff83b66fd40b8e60.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/f7f0f982e58c84b1ff83b66fd40b8e60.jpg', '2021-09-12 07:42:34.825+00', '2021-09-12 07:42:34.825+00', NULL, 1, 2), +(17, '合同', '3576f9d529a6c62e1467349b50354f51.pdf', '.pdf', NULL, 'application/pdf', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3576f9d529a6c62e1467349b50354f51.pdf', '2021-09-12 07:43:16.925+00', '2021-09-12 07:43:16.925+00', NULL, 1, 2), +(18, 'cherry-1567876_1280', '5758c412cb32f6999627f49a82789939.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/5758c412cb32f6999627f49a82789939.jpg', '2021-09-12 07:43:51.559+00', '2021-09-12 07:43:51.559+00', NULL, 1, 2), +(19, 'collage-1572831_1280', 'e4384263693120ef0aa3f51c378f836a.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/e4384263693120ef0aa3f51c378f836a.jpg', '2021-09-12 07:43:51.57+00', '2021-09-12 07:43:51.57+00', NULL, 1, 2), +(20, 'apple-1609693_1280', 'a83da53e04eb59fac213ae2a3e636d05.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/a83da53e04eb59fac213ae2a3e636d05.jpg', '2021-09-12 07:44:27.467+00', '2021-09-12 07:44:27.467+00', NULL, 1, 2), +(22, '合同', '16d9a18d6dd0a98660f5da3e3d522ff1.pdf', '.pdf', NULL, 'application/pdf', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/16d9a18d6dd0a98660f5da3e3d522ff1.pdf', '2021-09-12 07:45:04.258+00', '2021-09-12 07:45:04.258+00', NULL, 1, 2), +(21, '简历', 'a80c83871ea5a20bcd570edc5bc2787b.docx', '.docx', NULL, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/a80c83871ea5a20bcd570edc5bc2787b.docx', '2021-09-12 07:45:04.252+00', '2021-09-12 07:45:04.252+00', NULL, 1, 2), +(23, 'fruit-712729_1280', '3e826354cc466f12c307f775b566834f.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3e826354cc466f12c307f775b566834f.jpg', '2021-09-12 07:45:37.26+00', '2021-09-12 07:45:37.26+00', NULL, 1, 2), +(25, 'fruit-1213041_1280', '478a8a479af1b757bcba75f20301469d.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/478a8a479af1b757bcba75f20301469d.jpg', '2021-09-12 07:45:37.284+00', '2021-09-12 07:45:37.284+00', NULL, 1, 2), +(24, 'grapes-276070_1280', 'd1a33ccf36ea01a9b705a6e779c279a1.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/d1a33ccf36ea01a9b705a6e779c279a1.jpg', '2021-09-12 07:45:37.273+00', '2021-09-12 07:45:37.273+00', NULL, 1, 2), +(27, 'grapes-276070_1280', '3349c4695e99a983ef817fe25934f080.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/3349c4695e99a983ef817fe25934f080.jpg', '2021-09-12 07:47:39.636+00', '2021-09-12 07:47:39.636+00', NULL, 1, 2), +(26, 'kaffeerad-1543158_1280', '8b94dd8cbecdbbd03e4c2fcfbd1067e7.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/8b94dd8cbecdbbd03e4c2fcfbd1067e7.jpg', '2021-09-12 07:47:39.63+00', '2021-09-12 07:47:39.63+00', NULL, 1, 2), +(28, 'apple-1609693_1280', '31b7dee511a8d6364fee18411763c188.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/31b7dee511a8d6364fee18411763c188.jpg', '2021-09-12 07:48:41.367+00', '2021-09-12 07:48:41.367+00', NULL, 1, 2), +(29, 'cappuccino-1609932_1280', '8f480c4f1bd3d292ef78fb6847669e51.jpg', '.jpg', NULL, 'image/jpeg', '', '{}', 'https://nocobase.oss-cn-beijing.aliyuncs.com/8f480c4f1bd3d292ef78fb6847669e51.jpg', '2021-09-12 07:48:41.372+00', '2021-09-12 07:48:41.372+00', NULL, 1, 2); diff --git a/packages/plugin-client/src/db/part2/06-t_2uhu4szs1kq.sql b/packages/plugin-client/src/db/part2/06-t_2uhu4szs1kq.sql new file mode 100644 index 0000000000000000000000000000000000000000..f9a399b8e6e0c468a19071e15a91f864504b863d --- /dev/null +++ b/packages/plugin-client/src/db/part2/06-t_2uhu4szs1kq.sql @@ -0,0 +1,8 @@ +DELETE FROM "t_2uhu4szs1kq"; +INSERT INTO "t_2uhu4szs1kq" ("id", "created_at", "updated_at", "sort", "created_by_id", "updated_by_id", "f_hwenour8ara", "f_hznqtmqljb2", "f_u4i0jrp4uo6", "f_l8uuiwcnlw9") VALUES +(1, '2021-09-03 08:19:53.163+00', '2021-09-18 07:50:34.039+00', 70, 1, 1, '这是我们要做的任务这是我们要做的', '2021-09-17 00:00:00+00', 'f1g3r41rdh8', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。'), +(2, '2021-09-12 08:01:16.467+00', '2021-09-18 07:50:34.039+00', 71, 1, 1, '批量上传附件', '2021-09-24 00:00:00+00', 'f1g3r41rdh8', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。'), +(5, '2021-09-12 08:02:51.903+00', '2021-09-18 07:50:34.039+00', 69, 1, 1, '张斯些况于非按并音习又极别解切参', '2021-09-08 00:00:00+00', 'lebkfnj3d9i', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。'), +(4, '2021-09-12 08:02:37.852+00', '2021-09-18 07:50:34.039+00', 72, 1, 1, '包派极都火题折究条', '2021-10-08 00:00:00+00', 'zfowtv6fnel', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。'), +(6, '2021-09-17 01:35:18.379+00', '2021-09-18 07:50:34.039+00', 73, 1, 1, '达到顶峰五十五分', '2021-09-17 00:00:00+00', 'zfowtv6fnel', NULL), +(3, '2021-09-12 08:02:20.501+00', '2021-09-18 07:50:34.042+00', 68, 1, 1, '往你周观青整积元路公', '2021-09-24 00:00:00+00', 'lebkfnj3d9i', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。'); diff --git a/packages/plugin-client/src/db/part2/07-t_fsveob6p269.sql b/packages/plugin-client/src/db/part2/07-t_fsveob6p269.sql new file mode 100644 index 0000000000000000000000000000000000000000..86abef1e8605b77781cab9429b0e2391b721d93a --- /dev/null +++ b/packages/plugin-client/src/db/part2/07-t_fsveob6p269.sql @@ -0,0 +1,21 @@ +DELETE FROM "t_fsveob6p269"; +INSERT INTO "t_fsveob6p269" ("id", "created_at", "updated_at", "sort", "created_by_id", "updated_by_id", "f_vgw4f62h16e", "f_3det6kr3vn8", "f_x9kmuovlm79", "f_bysgds7j36p", "f_kk4nspj1i28", "f_61znsfh307m") VALUES +(2, '2021-09-12 07:41:10.508+00', '2021-09-12 07:41:10.508+00', 2, 1, 1, '庆贝儿', '18910347327', 'khan8z430yx', '2000-02-03 00:00:00+00', '件段两声提局则着除所法军,为后出子石了期七小南领能革,表相F声化等水坑但F连。 今劳查速布你安约定值斗,运通声资区的选心认,部样7展期辅些正记。 + +少给学采议备料元民切,则建通加的志始资但线,些火医花史贡凝好。 易体报说着导收因派解,导亲动和人头之适,引都B按张观不适。 习想带证利识平率,不眼社且几质种,已U集杆X总。 及酸心知此劳记手,争小斗Z化传。 力例适支现流解斗,从经元行是南总,月辰走化习-。', 'plcxasw2xrs'), +(3, '2021-09-12 07:41:56.973+00', '2021-09-12 07:41:56.973+00', 3, 1, 1, '潘宏嘉', '18638372617', '59khrisonj6', '1983-08-27 00:00:00+00', 'Lorem ipsum dolor sit amet, no dolor graeco pro, te sea bonorum dolorum theophrastus. Vim ea utamur appetere molestiae, ad harum alienum indoctum ius. No quo laoreet laboramus comprehensam, eos paulo integre vivendo eu, an nam alia facilisi consetetur. Pro exerci iisque et, no amet magna iracundia vim. Vis erant consectetuer te, mei menandri liberavisse at, no latine consulatu deseruisse eos. Mel an novum nostrud scripserit, velit virtute delicata eam ad, eum ne etiam omnesque.', 'e3fb46gnarj'), +(4, '2021-09-12 07:42:41.303+00', '2021-09-12 07:42:41.303+00', 4, 1, 1, '碧鲁彦新', '13257489038', 'khan8z430yx', '2003-05-22 00:00:00+00', '厂斗志照部都越何事车前,斯队两将断极S点其会。方去即白林两团规,度关这步明管王至,但低承我质建求。 组了间族你那记的格压把,走张它然无便同儿把意,七土两叫询呜没报时。她引广书率出主且金,来万须采确部还活件,较M来霸豆板枝。政个值满物种被,共据运本很极然满,须E事眼目外。器约精机王传马,立目证权适色总,公屈过史类刺。体回每在或机发己极即,指办置们选会习十己,连难4持包厕知柜。 速还提红达知器金积外委下,况至片量派届扯过院响。', 'h5cxo6g48lj'), +(5, '2021-09-12 07:43:22.416+00', '2021-09-12 07:43:22.416+00', 5, 1, 1, '袭新平', '15673659911', '59khrisonj6', '2001-05-19 00:00:00+00', '角写现着积件果五几别,线思志济感解干事,总交录标来重它两。器参红按完通将段现强,张去克李构易。 铁年老合县始后该定报北,制和前将石四记并该道,学资建点论先打北体。 大较小商复号满以任明,青音期装所作作速,派期杨板水我办实。等人定所何那她所但,下根质状对力即光,目正-局百么片。根格土下级地育入等门适,眼使少调自用而取约,划花该三与理半音声。华包交少问毛公利书细当她每,你集者重百少蠢式箩需却。 重养人化严往主合况建', 'plcxasw2xrs'), +(8, '2021-09-12 07:45:09.415+00', '2021-09-12 07:45:09.415+00', 8, 1, 1, '礼根群', '13954209583', '59khrisonj6', '1992-07-29 00:00:00+00', '压界点小名理它车机两得,原查去证行村太孟道。求真强记织管装总论形感增委越,术市点便定肃容红个而写。代往门张照布活,期头劳量人,导8新建给。造装话和很片算只类论所,全变容时过地传达,术族刷车进变了邮盯。 在给情她积音新问整史图火验往,受王多式儿花6集听壳是呆。越县管积小与权内有红压,往你周观青整积元路公,包派极都火题折究条。张斯些况于非按并音习又极别解切参,气斗也新越几励小集及询报吧。整展研号公清文例资品会头', 'h5cxo6g48lj'), +(9, '2021-09-12 07:45:42.766+00', '2021-09-12 07:45:42.766+00', 9, 1, 1, '那涵', '18865092743', '59khrisonj6', '1994-05-25 00:00:00+00', '受界思律结周点老积,率方材论适处团认。角写现着积件果五几别,线思志济感解干事,总交录标来重它两。器参红按完通将段现强,张去克李构易。 铁年老合县始后该定报北,制和前将石四记并该道,学资建点论先打北体。 大较小商复号满以任明,青音期装所作作速,派期杨板水我办实。等人定所何那她所但,下根质状对力即光,目正-局百么片。根格土下级地育入等门适,眼使少调自用而取约,划花该三与理半音声。华包交少问毛公利书细当她每,你集者重百少蠢式箩需却。 重养人化严往主合况建, + +听严素林越口热使然术,接级4因丽七北财。 务西只发系海少族实满四观,八管对利美解克始切本厂,重公材边因箩需帐候励。管但众我音才使广力例体格越,条些影区合录雪辰社不。才术北知同路作然几积做油,研权满近示技O利分矿东。斗对志质众则记际青发,小结反状等教来导法造,该书Z束询或运复。', 'plcxasw2xrs'), +(10, '2021-09-12 07:47:46.417+00', '2021-09-12 07:47:46.417+00', 10, 1, 1, '定质花', '13582034729', '59khrisonj6', '2004-04-13 00:00:00+00', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。', 'h5cxo6g48lj'), +(7, '2021-09-12 07:44:35.496+00', '2021-09-12 08:36:23.783+00', 7, 1, 1, '储铭', '13898276018', '59khrisonj6', '1986-06-21 00:00:00+00', '外对Q备报通那先素。 接信效住京世划京快本更难见,快京象加不入月图或用角,式速增G抖则收露动芦我。事信花白直对青系白争,受界思律结周点老积,率方材论适处团认。角写现着积件果五几别,线思志济感解干事,总交录标来重它两。器参红按完通将段现强,张去克李构易。 铁年老合县始后该定报北,制和前将石四记并该道,学资建点论先打北体。', 'e3fb46gnarj'), +(1, '2021-09-12 01:21:03.457+00', '2021-09-12 08:36:45.007+00', 1, 1, 1, '星星霖', '13498034729', '59khrisonj6', '1980-08-08 00:00:00+00', '利本毛所线表体定质花,则根物大教斯经前,飞能D发科程W目。 阶直少看员片飞飞今西取亲本就条,持层品平米今ON孤你七2。 花离定可除展通向业很,斗术真节西严特矿,导养-N群长置便。 深规马细三强低按段,事作般习就代它,完技O布D枝快。 便报动斗改克离为具影研立特,养命规么才设步局方总较共张,时什Q肃声的者起开出话。', 'z7wq1mkwmmx'), +(11, '2021-09-12 07:48:47.021+00', '2021-09-12 07:48:47.021+00', 11, 1, 1, '段两声', '18910347327', 'khan8z430yx', '2001-06-07 00:00:00+00', '件段两声提局则着除所法军,为后出子石了期七小南领能革,表相F声化等水坑但F连。 今劳查速布你安约定值斗,运通声资区的选心认,部样7展期辅些正记。 + +少给学采议备料元民切,则建通加的志始资但线,些火医花史贡凝好。 易体报说着导收因派解,导亲动和人头之适,引都B按张观不适。 习想带证利识平率,不眼社且几质种,已U集杆X总。 及酸心知此劳记手,争小斗Z化传。 力例适支现流解斗,从经元行是南总,月辰走化习-。', 'e3fb46gnarj'), +(6, '2021-09-12 07:43:57.617+00', '2021-09-12 08:28:50.544+00', 6, 1, 1, '宓中仕', '13527645198', 'khan8z430yx', '1999-02-26 00:00:00+00', '压界点小名理它车机两得,原查去证行村太孟道。求真强记织管装总论形感增委越,术市点便定肃容红个而写。代往门张照布活,期头劳量人,导8新建给。造装话和很片算只类论所,全变容时过地传达,术族刷车进变了邮盯。 在给情她积音新问整史图火验往,受王多式儿花6集听壳是呆。越县管积小与权内有红压,往你周观青整积元路公,包派极都火题折究条。 + +张斯些况于非按并音习又极别解切参,气斗也新越几励小集及询报吧。整展研号公清文例资品会头,厂斗志照部都越何事车前,斯队两将断极S点其会。方去即白林两团规,度关这步明管王至,但低承我质建求。 组了间族你那记的格压把,走张它然无便同儿把意,七土两叫询呜没报时。她引广书率出主且金,来万须采确部还活件,较M来霸豆板枝。政个值满物种被,共据运本很极然满,须E事眼目外。器约精机王传马,立目证权适色总,公屈过史类刺。体回每在或机发己极即,指办置们选会习十己,连难4持包厕知柜。 速还提红达知器金积外委下', 'z7wq1mkwmmx'); diff --git a/packages/plugin-client/src/db/part2/08-t_geso7fru7a9.sql b/packages/plugin-client/src/db/part2/08-t_geso7fru7a9.sql new file mode 100644 index 0000000000000000000000000000000000000000..da859b79fb0665b080323fd2326ba86c6c47fec4 --- /dev/null +++ b/packages/plugin-client/src/db/part2/08-t_geso7fru7a9.sql @@ -0,0 +1,18 @@ +DELETE FROM "t_geso7fru7a9"; +INSERT INTO "t_geso7fru7a9" ("id", "created_at", "updated_at", "sort", "created_by_id", "updated_by_id", "f_umjewufbyhj", "f_nlgk67tpdql", "f_niymyj0no38") VALUES +(1, '2021-09-12 01:24:52.21+00', '2021-09-12 07:38:07.64+00', 1, 1, 1, '2021-09-10 11:26:28+00', 'x4qnavatfai', '751834123525'), +(2, '2021-09-12 07:36:07.647+00', '2021-09-12 07:38:15.812+00', 2, 1, 1, '2021-09-24 15:41:03+00', 'i2xjqmnwrsu', '751834123526'), +(3, '2021-09-14 02:02:47.091+00', '2021-09-14 02:02:47.091+00', 3, 1, 1, '2021-09-25 10:02:32+00', 'tqgda8p724l', '751834123527'), +(4, '2021-09-14 02:03:09.21+00', '2021-09-14 02:03:09.21+00', 4, 1, 1, '2021-09-08 15:03:01+00', 'i2xjqmnwrsu', '751834123528'), +(5, '2021-09-14 02:03:24.272+00', '2021-09-14 02:03:24.272+00', 5, 1, 1, '2021-09-08 10:03:17+00', 'i2xjqmnwrsu', '751834123529'), +(6, '2021-09-14 02:03:43.832+00', '2021-09-14 02:03:43.832+00', 6, 1, 1, '2021-09-23 10:03:36+00', 'x4qnavatfai', '751834123530'), +(7, '2021-09-14 02:03:58.744+00', '2021-09-14 02:03:58.744+00', 7, 1, 1, '2021-09-08 10:03:51+00', 'x4qnavatfai', '751834123531'), +(8, '2021-09-14 02:04:16.289+00', '2021-09-14 02:04:16.289+00', 8, 1, 1, '2021-09-02 10:04:07+00', 'tqgda8p724l', '751834123532'), +(9, '2021-09-14 02:04:35.679+00', '2021-09-14 02:04:35.679+00', 9, 1, 1, '2021-09-09 10:04:25+00', 'x4qnavatfai', '751834123533'), +(10, '2021-09-14 02:04:51.641+00', '2021-09-14 02:04:51.641+00', 10, 1, 1, '2021-09-02 10:04:44+00', 'tqgda8p724l', '751834123534'), +(11, '2021-09-14 02:05:13.807+00', '2021-09-14 02:05:13.807+00', 11, 1, 1, '2021-08-05 10:05:01+00', 'x4qnavatfai', '751834123534'), +(12, '2021-09-14 02:05:34.724+00', '2021-09-14 02:05:34.724+00', 12, 1, 1, '2021-09-12 10:05:26+00', 'tqgda8p724l', '751834123535'), +(13, '2021-09-14 02:05:52.789+00', '2021-09-14 02:05:52.789+00', 13, 1, 1, '2021-09-26 10:05:42+00', 'tqgda8p724l', '751834123536'), +(14, '2021-09-14 02:06:10.875+00', '2021-09-14 02:06:10.875+00', 14, 1, 1, '2021-09-07 10:06:06+00', 'x4qnavatfai', '751834123537'), +(15, '2021-09-14 02:06:29.102+00', '2021-09-14 02:06:29.102+00', 15, 1, 1, '2021-09-25 10:06:18+00', 'x4qnavatfai', '751834123538'), +(16, '2021-09-14 02:06:45.054+00', '2021-09-14 02:06:45.054+00', 16, 1, 1, '2021-09-09 10:06:41+00', 'i2xjqmnwrsu', '751834123539'); diff --git a/packages/plugin-client/src/db/part2/09-t_bphcojtl8bx.sql b/packages/plugin-client/src/db/part2/09-t_bphcojtl8bx.sql new file mode 100644 index 0000000000000000000000000000000000000000..bbc8187eec85d60e836eb84b3644836ea6d7d3fc --- /dev/null +++ b/packages/plugin-client/src/db/part2/09-t_bphcojtl8bx.sql @@ -0,0 +1,18 @@ +DELETE FROM "t_bphcojtl8bx"; +INSERT INTO "t_bphcojtl8bx" ("created_at", "updated_at", "f_cn6a3p0wq2p", "f_4x6u1waa8r6") VALUES +('2021-09-12 01:24:52.263+00', '2021-09-12 01:24:52.263+00', 1, 1), +('2021-09-12 07:36:07.681+00', '2021-09-12 07:36:07.681+00', 1, 2), +('2021-09-14 02:02:47.134+00', '2021-09-14 02:02:47.134+00', 2, 3), +('2021-09-14 02:03:09.241+00', '2021-09-14 02:03:09.241+00', 3, 4), +('2021-09-14 02:03:24.316+00', '2021-09-14 02:03:24.316+00', 4, 5), +('2021-09-14 02:03:43.87+00', '2021-09-14 02:03:43.87+00', 5, 6), +('2021-09-14 02:03:58.767+00', '2021-09-14 02:03:58.767+00', 8, 7), +('2021-09-14 02:04:16.32+00', '2021-09-14 02:04:16.32+00', 9, 8), +('2021-09-14 02:04:35.709+00', '2021-09-14 02:04:35.709+00', 10, 9), +('2021-09-14 02:04:51.667+00', '2021-09-14 02:04:51.667+00', 7, 10), +('2021-09-14 02:05:13.838+00', '2021-09-14 02:05:13.838+00', 1, 11), +('2021-09-14 02:05:34.758+00', '2021-09-14 02:05:34.758+00', 11, 12), +('2021-09-14 02:05:52.817+00', '2021-09-14 02:05:52.817+00', 6, 13), +('2021-09-14 02:06:10.916+00', '2021-09-14 02:06:10.916+00', 2, 14), +('2021-09-14 02:06:29.136+00', '2021-09-14 02:06:29.136+00', 3, 15), +('2021-09-14 02:06:45.093+00', '2021-09-14 02:06:45.093+00', 11, 16); diff --git a/packages/plugin-client/src/db/part2/10-t_jh7a28dsfzi.sql b/packages/plugin-client/src/db/part2/10-t_jh7a28dsfzi.sql new file mode 100644 index 0000000000000000000000000000000000000000..3923aa6d04d01cebc0b29a23f3dbf30260dc6d4d --- /dev/null +++ b/packages/plugin-client/src/db/part2/10-t_jh7a28dsfzi.sql @@ -0,0 +1,27 @@ +DELETE FROM "t_jh7a28dsfzi"; +INSERT INTO "t_jh7a28dsfzi" ("created_at", "updated_at", "f_xg3mysbjfra", "f_gc7ppj0b7n1") VALUES +('2021-09-12 01:21:03.65+00', '2021-09-12 01:21:03.65+00', 1, 6), +('2021-09-12 01:21:03.65+00', '2021-09-12 01:21:03.65+00', 1, 5), +('2021-09-12 01:22:07.886+00', '2021-09-12 01:22:07.886+00', 1, 7), +('2021-09-12 07:41:10.563+00', '2021-09-12 07:41:10.563+00', 2, 9), +('2021-09-12 07:41:10.563+00', '2021-09-12 07:41:10.563+00', 2, 10), +('2021-09-12 07:41:10.563+00', '2021-09-12 07:41:10.563+00', 2, 8), +('2021-09-12 07:41:57.025+00', '2021-09-12 07:41:57.025+00', 3, 12), +('2021-09-12 07:41:57.025+00', '2021-09-12 07:41:57.025+00', 3, 11), +('2021-09-12 07:42:41.36+00', '2021-09-12 07:42:41.36+00', 4, 15), +('2021-09-12 07:42:41.36+00', '2021-09-12 07:42:41.36+00', 4, 14), +('2021-09-12 07:42:41.36+00', '2021-09-12 07:42:41.36+00', 4, 13), +('2021-09-12 07:42:41.36+00', '2021-09-12 07:42:41.36+00', 4, 16), +('2021-09-12 07:43:22.467+00', '2021-09-12 07:43:22.467+00', 5, 17), +('2021-09-12 07:43:57.67+00', '2021-09-12 07:43:57.67+00', 6, 18), +('2021-09-12 07:43:57.67+00', '2021-09-12 07:43:57.67+00', 6, 19), +('2021-09-12 07:44:35.538+00', '2021-09-12 07:44:35.538+00', 7, 20), +('2021-09-12 07:45:09.463+00', '2021-09-12 07:45:09.463+00', 8, 22), +('2021-09-12 07:45:09.463+00', '2021-09-12 07:45:09.463+00', 8, 21), +('2021-09-12 07:45:42.818+00', '2021-09-12 07:45:42.818+00', 9, 23), +('2021-09-12 07:45:42.818+00', '2021-09-12 07:45:42.818+00', 9, 25), +('2021-09-12 07:45:42.818+00', '2021-09-12 07:45:42.818+00', 9, 24), +('2021-09-12 07:47:46.476+00', '2021-09-12 07:47:46.476+00', 10, 27), +('2021-09-12 07:47:46.476+00', '2021-09-12 07:47:46.476+00', 10, 26), +('2021-09-12 07:48:47.077+00', '2021-09-12 07:48:47.077+00', 11, 28), +('2021-09-12 07:48:47.077+00', '2021-09-12 07:48:47.077+00', 11, 29); diff --git a/packages/plugin-client/src/db/part2/11-t_p13gbi31uux.sql b/packages/plugin-client/src/db/part2/11-t_p13gbi31uux.sql new file mode 100644 index 0000000000000000000000000000000000000000..7b2073332c5f21313a82fdb3a0bb4ec1bfac3315 --- /dev/null +++ b/packages/plugin-client/src/db/part2/11-t_p13gbi31uux.sql @@ -0,0 +1,35 @@ +DELETE FROM "t_p13gbi31uux"; +INSERT INTO "t_p13gbi31uux" ("created_at", "updated_at", "f_86s65mbw93e", "f_hwx3hgg5b5t") VALUES +('2021-09-12 01:21:03.666+00', '2021-09-12 01:21:03.666+00', 1, '11'), +('2021-09-12 01:21:03.666+00', '2021-09-12 01:21:03.666+00', 1, '1101'), +('2021-09-12 01:21:03.666+00', '2021-09-12 01:21:03.666+00', 1, '110105'), +('2021-09-12 07:41:10.582+00', '2021-09-12 07:41:10.582+00', 2, '14'), +('2021-09-12 07:41:10.582+00', '2021-09-12 07:41:10.582+00', 2, '1401'), +('2021-09-12 07:41:10.582+00', '2021-09-12 07:41:10.582+00', 2, '140105'), +('2021-09-12 07:41:57.038+00', '2021-09-12 07:41:57.038+00', 3, '15'), +('2021-09-12 07:41:57.038+00', '2021-09-12 07:41:57.038+00', 3, '1502'), +('2021-09-12 07:41:57.038+00', '2021-09-12 07:41:57.038+00', 3, '150203'), +('2021-09-12 07:42:41.372+00', '2021-09-12 07:42:41.372+00', 4, '21'), +('2021-09-12 07:42:41.372+00', '2021-09-12 07:42:41.372+00', 4, '2102'), +('2021-09-12 07:42:41.372+00', '2021-09-12 07:42:41.372+00', 4, '210203'), +('2021-09-12 07:43:22.481+00', '2021-09-12 07:43:22.481+00', 5, '31'), +('2021-09-12 07:43:22.481+00', '2021-09-12 07:43:22.481+00', 5, '3101'), +('2021-09-12 07:43:22.481+00', '2021-09-12 07:43:22.481+00', 5, '310105'), +('2021-09-12 07:43:57.686+00', '2021-09-12 07:43:57.686+00', 6, '32'), +('2021-09-12 07:43:57.686+00', '2021-09-12 07:43:57.686+00', 6, '3203'), +('2021-09-12 07:43:57.686+00', '2021-09-12 07:43:57.686+00', 6, '320303'), +('2021-09-12 07:44:35.552+00', '2021-09-12 07:44:35.552+00', 7, '33'), +('2021-09-12 07:44:35.552+00', '2021-09-12 07:44:35.552+00', 7, '3302'), +('2021-09-12 07:44:35.552+00', '2021-09-12 07:44:35.552+00', 7, '330205'), +('2021-09-12 07:45:09.477+00', '2021-09-12 07:45:09.477+00', 8, '34'), +('2021-09-12 07:45:09.477+00', '2021-09-12 07:45:09.477+00', 8, '3402'), +('2021-09-12 07:45:09.477+00', '2021-09-12 07:45:09.477+00', 8, '340202'), +('2021-09-12 07:45:42.83+00', '2021-09-12 07:45:42.83+00', 9, '35'), +('2021-09-12 07:45:42.83+00', '2021-09-12 07:45:42.83+00', 9, '3503'), +('2021-09-12 07:45:42.83+00', '2021-09-12 07:45:42.83+00', 9, '350303'), +('2021-09-12 07:47:46.491+00', '2021-09-12 07:47:46.491+00', 10, '36'), +('2021-09-12 07:47:46.491+00', '2021-09-12 07:47:46.491+00', 10, '3602'), +('2021-09-12 07:47:46.491+00', '2021-09-12 07:47:46.491+00', 10, '360202'), +('2021-09-12 07:48:47.088+00', '2021-09-12 07:48:47.088+00', 11, '37'), +('2021-09-12 07:48:47.088+00', '2021-09-12 07:48:47.088+00', 11, '3703'), +('2021-09-12 07:48:47.088+00', '2021-09-12 07:48:47.088+00', 11, '370303'); diff --git a/packages/plugin-client/src/db/part2/12-roles.sql b/packages/plugin-client/src/db/part2/12-roles.sql new file mode 100644 index 0000000000000000000000000000000000000000..c203402d0b1b920f1e75c37b39aa7a98bd137cab --- /dev/null +++ b/packages/plugin-client/src/db/part2/12-roles.sql @@ -0,0 +1,4 @@ +DELETE FROM "roles"; +INSERT INTO "roles" ("name", "title", "sort", "created_at", "updated_at", "created_by_id", "updated_by_id") VALUES +('r_tfs4qtaxjcs', '管理员', 1, '2021-09-14 02:12:19.98+00', '2021-09-14 02:12:19.98+00', 1, 1), +('r_np59b00ex8z', '普通成员', 2, '2021-09-14 02:12:35.799+00', '2021-09-14 02:12:35.799+00', 1, 1); diff --git a/packages/plugin-client/src/db/part2/13-action_permissions.sql b/packages/plugin-client/src/db/part2/13-action_permissions.sql new file mode 100644 index 0000000000000000000000000000000000000000..e435f4a6eeb15566118f2c71da536c59e967fe74 --- /dev/null +++ b/packages/plugin-client/src/db/part2/13-action_permissions.sql @@ -0,0 +1,18 @@ +DELETE FROM "action_permissions"; +INSERT INTO "action_permissions" ("id", "action_name", "created_at", "updated_at", "collection_name", "user_id", "created_by_id", "updated_by_id", "role_name", "scope_id") VALUES +(1, 'create', '2021-09-14 02:19:38.019+00', '2021-09-14 02:19:45.64+00', 't_geso7fru7a9', NULL, 1, 1, NULL, NULL), +(2, 'get', '2021-09-14 02:19:38.04+00', '2021-09-14 02:19:45.64+00', 't_geso7fru7a9', NULL, 1, 1, NULL, NULL), +(3, 'update', '2021-09-14 02:19:38.053+00', '2021-09-14 02:19:45.64+00', 't_geso7fru7a9', NULL, 1, 1, NULL, NULL), +(4, 'destroy', '2021-09-14 02:19:38.067+00', '2021-09-14 02:19:45.64+00', 't_geso7fru7a9', NULL, 1, 1, NULL, NULL), +(5, 'create', '2021-09-14 02:19:45.601+00', '2021-09-14 02:19:53.3+00', 't_2uhu4szs1kq', NULL, 1, 1, NULL, NULL), +(6, 'get', '2021-09-14 02:19:45.616+00', '2021-09-14 02:19:53.3+00', 't_2uhu4szs1kq', NULL, 1, 1, NULL, NULL), +(7, 'update', '2021-09-14 02:19:45.625+00', '2021-09-14 02:19:53.3+00', 't_2uhu4szs1kq', NULL, 1, 1, NULL, NULL), +(8, 'destroy', '2021-09-14 02:19:45.633+00', '2021-09-14 02:19:53.3+00', 't_2uhu4szs1kq', NULL, 1, 1, NULL, NULL), +(13, 'create', '2021-09-14 02:20:00.337+00', '2021-09-14 02:20:00.337+00', 'users', NULL, 1, 1, 'r_tfs4qtaxjcs', NULL), +(14, 'get', '2021-09-14 02:20:00.347+00', '2021-09-14 02:20:00.347+00', 'users', NULL, 1, 1, 'r_tfs4qtaxjcs', NULL), +(15, 'update', '2021-09-14 02:20:00.356+00', '2021-09-14 02:20:00.356+00', 'users', NULL, 1, 1, 'r_tfs4qtaxjcs', NULL), +(16, 'destroy', '2021-09-14 02:20:00.364+00', '2021-09-14 02:20:00.364+00', 'users', NULL, 1, 1, 'r_tfs4qtaxjcs', NULL), +(9, 'create', '2021-09-14 02:19:53.259+00', '2021-09-14 02:20:00.371+00', 't_fsveob6p269', NULL, 1, 1, NULL, NULL), +(10, 'get', '2021-09-14 02:19:53.274+00', '2021-09-14 02:20:00.371+00', 't_fsveob6p269', NULL, 1, 1, NULL, NULL), +(11, 'update', '2021-09-14 02:19:53.284+00', '2021-09-14 02:20:00.371+00', 't_fsveob6p269', NULL, 1, 1, NULL, NULL), +(12, 'destroy', '2021-09-14 02:19:53.294+00', '2021-09-14 02:20:00.371+00', 't_fsveob6p269', NULL, 1, 1, NULL, NULL); diff --git a/packages/plugin-client/src/db/part2/14-field_permissions.sql b/packages/plugin-client/src/db/part2/14-field_permissions.sql new file mode 100644 index 0000000000000000000000000000000000000000..e0c5db477de6de6c99a3259833e70b664ed0fea2 --- /dev/null +++ b/packages/plugin-client/src/db/part2/14-field_permissions.sql @@ -0,0 +1,101 @@ +DELETE FROM "field_permissions"; +INSERT INTO "field_permissions" ("created_at", "updated_at", "action_permission_id", "field_key") VALUES +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'nv0iw8wdxmz'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'lu1ibrb0yi2'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'qpme60wf4lt'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'fp2hcdcmxzm'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, '0qx4mudmft8'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, '19r6wt5b4m3'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'nb09uq85geu'), +('2021-09-14 02:19:38.034+00', '2021-09-14 02:19:38.034+00', 1, 'ckyhgqq0jru'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'nv0iw8wdxmz'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'lu1ibrb0yi2'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'qpme60wf4lt'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'fp2hcdcmxzm'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, '0qx4mudmft8'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, '19r6wt5b4m3'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'nb09uq85geu'), +('2021-09-14 02:19:38.048+00', '2021-09-14 02:19:38.048+00', 2, 'ckyhgqq0jru'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'nv0iw8wdxmz'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'lu1ibrb0yi2'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'qpme60wf4lt'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'fp2hcdcmxzm'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, '0qx4mudmft8'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, '19r6wt5b4m3'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'nb09uq85geu'), +('2021-09-14 02:19:38.062+00', '2021-09-14 02:19:38.062+00', 3, 'ckyhgqq0jru'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, '8ms3ivkxaku'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, 'sj5p2y4ac06'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, '78h1q25dt1h'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, '1fvb1qre4ut'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, 's30o2rkxcht'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, 'e76mvcf7a1r'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, 'c385a9rhd6d'), +('2021-09-14 02:19:45.611+00', '2021-09-14 02:19:45.611+00', 5, 'aun85p76s0v'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, '8ms3ivkxaku'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, 'sj5p2y4ac06'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, '78h1q25dt1h'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, '1fvb1qre4ut'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, 's30o2rkxcht'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, 'e76mvcf7a1r'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, 'c385a9rhd6d'), +('2021-09-14 02:19:45.622+00', '2021-09-14 02:19:45.622+00', 6, 'aun85p76s0v'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, '8ms3ivkxaku'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, 'sj5p2y4ac06'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, '78h1q25dt1h'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, '1fvb1qre4ut'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, 's30o2rkxcht'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, 'e76mvcf7a1r'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, 'c385a9rhd6d'), +('2021-09-14 02:19:45.631+00', '2021-09-14 02:19:45.631+00', 7, 'aun85p76s0v'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'mqcm1jb1ziw'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, '2abol7bhbmj'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'bz701wfev96'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'ymwwuuje5cf'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'f_c8mes0kp1zt'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'mnglxpxjqs4'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'kru7yomwffj'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'hfry2ook2w4'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'xjnnqtckv6o'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'lie1tta3peq'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'zobi3o3dqzp'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, 'gjc3mks1xvj'), +('2021-09-14 02:19:53.27+00', '2021-09-14 02:19:53.27+00', 9, '9cpd377df7t'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'mqcm1jb1ziw'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, '2abol7bhbmj'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'bz701wfev96'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'ymwwuuje5cf'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'f_c8mes0kp1zt'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'mnglxpxjqs4'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'kru7yomwffj'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'hfry2ook2w4'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'xjnnqtckv6o'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'lie1tta3peq'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'zobi3o3dqzp'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, 'gjc3mks1xvj'), +('2021-09-14 02:19:53.28+00', '2021-09-14 02:19:53.28+00', 10, '9cpd377df7t'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'mqcm1jb1ziw'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, '2abol7bhbmj'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'bz701wfev96'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'ymwwuuje5cf'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'f_c8mes0kp1zt'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'mnglxpxjqs4'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'kru7yomwffj'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'hfry2ook2w4'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'xjnnqtckv6o'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'lie1tta3peq'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'zobi3o3dqzp'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, 'gjc3mks1xvj'), +('2021-09-14 02:19:53.291+00', '2021-09-14 02:19:53.291+00', 11, '9cpd377df7t'), +('2021-09-14 02:20:00.344+00', '2021-09-14 02:20:00.344+00', 13, 'f_6rhh0scyw9k'), +('2021-09-14 02:20:00.344+00', '2021-09-14 02:20:00.344+00', 13, 'f_80zv5suy9t6'), +('2021-09-14 02:20:00.344+00', '2021-09-14 02:20:00.344+00', 13, 'f_j367murpzm9'), +('2021-09-14 02:20:00.344+00', '2021-09-14 02:20:00.344+00', 13, '6rm0lspbpeh'), +('2021-09-14 02:20:00.353+00', '2021-09-14 02:20:00.353+00', 14, 'f_6rhh0scyw9k'), +('2021-09-14 02:20:00.353+00', '2021-09-14 02:20:00.353+00', 14, 'f_80zv5suy9t6'), +('2021-09-14 02:20:00.353+00', '2021-09-14 02:20:00.353+00', 14, 'f_j367murpzm9'), +('2021-09-14 02:20:00.353+00', '2021-09-14 02:20:00.353+00', 14, '6rm0lspbpeh'), +('2021-09-14 02:20:00.361+00', '2021-09-14 02:20:00.361+00', 15, 'f_6rhh0scyw9k'), +('2021-09-14 02:20:00.361+00', '2021-09-14 02:20:00.361+00', 15, 'f_80zv5suy9t6'), +('2021-09-14 02:20:00.361+00', '2021-09-14 02:20:00.361+00', 15, 'f_j367murpzm9'), +('2021-09-14 02:20:00.361+00', '2021-09-14 02:20:00.361+00', 15, '6rm0lspbpeh'); diff --git a/packages/plugin-client/src/db/part2/15-roles_ui_schemas.sql b/packages/plugin-client/src/db/part2/15-roles_ui_schemas.sql new file mode 100644 index 0000000000000000000000000000000000000000..6b8c3443aa943c6dbc2880a607cba594dc410330 --- /dev/null +++ b/packages/plugin-client/src/db/part2/15-roles_ui_schemas.sql @@ -0,0 +1,52 @@ +DELETE FROM "roles_ui_schemas"; +INSERT INTO "roles_ui_schemas" ("created_at", "updated_at", "ui_schema_key", "role_name") VALUES +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '0b73gccskc2', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'hall72478p5', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'im4un32remd', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'wfa10dg0vyl', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'k33sn747t75', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '6chv7wh9gy9', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'h41g5aiikz1', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '66g7jbpqsen', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'on7wtx4zj4i', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '2fmrebsf4gp', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'p5e092zc0ot', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '2eacz1979l5', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'ouuvop86xkn', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '6zdy7upftb2', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'h3irsnu3clo', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '2891oprcahh', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'tqpxc3hilti', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'kme85fmbfdp', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '75uiuzj3a2y', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'o6vjinhjhad', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'knyew80qe7m', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'gd7t6lt75n9', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', '1i8da3k889z', 'r_tfs4qtaxjcs'), +('2021-09-14 02:19:13.669+00', '2021-09-14 02:19:13.669+00', 'mqr5sytnrex', 'r_tfs4qtaxjcs'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'im4un32remd', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'wfa10dg0vyl', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'k33sn747t75', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '6chv7wh9gy9', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'h41g5aiikz1', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '66g7jbpqsen', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'on7wtx4zj4i', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '2fmrebsf4gp', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'p5e092zc0ot', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '2eacz1979l5', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'ouuvop86xkn', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '6zdy7upftb2', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'h3irsnu3clo', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '2891oprcahh', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'tqpxc3hilti', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'kme85fmbfdp', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '75uiuzj3a2y', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'o6vjinhjhad', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'knyew80qe7m', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '43f9otxtq42', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'dhye1xbbr3n', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', '1i8da3k889z', 'r_np59b00ex8z'), +('2021-09-14 02:20:09.49+00', '2021-09-14 02:20:09.49+00', 'mqr5sytnrex', 'r_np59b00ex8z'), +('2021-09-14 02:22:46.7+00', '2021-09-14 02:22:46.7+00', '0b73gccskc2', 'r_np59b00ex8z'), +('2021-09-14 02:22:53.939+00', '2021-09-14 02:22:53.939+00', 'hall72478p5', 'r_np59b00ex8z'), +('2021-09-14 02:26:04.313+00', '2021-09-14 02:26:04.313+00', 'gd7t6lt75n9', 'r_np59b00ex8z'); diff --git a/packages/plugin-client/src/db/postgres/setinval.sql b/packages/plugin-client/src/db/postgres/setinval.sql new file mode 100644 index 0000000000000000000000000000000000000000..a5a997b0da801528534e32186d0cfcd88ff9862d --- /dev/null +++ b/packages/plugin-client/src/db/postgres/setinval.sql @@ -0,0 +1,5 @@ +SELECT setval('action_permissions_id_seq', (SELECT MAX(id) FROM "action_permissions"), true); +SELECT setval('attachments_id_seq', (SELECT MAX(id) FROM "attachments"), true); +SELECT setval('t_2uhu4szs1kq_id_seq', (SELECT MAX(id) FROM "t_2uhu4szs1kq"), true); +SELECT setval('t_fsveob6p269_id_seq', (SELECT MAX(id) FROM "t_fsveob6p269"), true); +SELECT setval('t_geso7fru7a9_id_seq', (SELECT MAX(id) FROM "t_geso7fru7a9"), true); diff --git a/packages/plugin-client/src/index.ts b/packages/plugin-client/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/plugin-client/src/server.ts b/packages/plugin-client/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..e0d8fcbbaa3e86458ab3a5537b5f3847dc20acf6 --- /dev/null +++ b/packages/plugin-client/src/server.ts @@ -0,0 +1,96 @@ +import path from 'path'; +import send from 'koa-send'; +import serve from 'koa-static'; +import { PluginOptions } from '@nocobase/server'; +import { readFileSync } from 'fs'; +import glob from 'glob'; + +export function getInitSqls(): { + [key: string]: string[]; +} { + const dirs = ['part1', 'part2', 'postgres']; + return dirs + .map((dir) => { + return { + dir, + files: glob + .sync(path.resolve(__dirname, `./db/${dir}/*.sql`)) + .map((fileName) => readFileSync(fileName).toString()), + }; + }) + .reduce((carry, dirFiles) => { + carry[dirFiles.dir] = dirFiles.files; + return carry; + }, {}); +} + +export function runSql(sql, database) { + const trimmed = sql.trim(); + if (trimmed.length == 0) { + return; + } + return database.sequelize.query(trimmed, { + raw: true, + logging: false, + }); +} + +async function runSqlFile(content, database) { + for (const sqlGroup of content) { + for (const sql of sqlGroup.split(';')) { + try { + await runSql(sql, database); + } catch (e) { + console.error({ e, sql }); + } + } + } +} + +export default { + name: 'client', + async load() { + let root = this.options.dist; + if (root && !root.startsWith('/')) { + root = path.resolve(process.cwd(), root); + } + this.app.middleware.unshift(async (ctx, next) => { + if (!root) { + return next(); + } + await serve(root)(ctx, next); + // console.log('koa-send', root, ctx.status); + if (ctx.status == 404) { + return send(ctx, 'index.html', { root }); + } + }); + const app = this.app; + const cmd = app.findCommand('init'); + if (cmd) { + cmd.option('--import-demo'); + } + this.app.on('db.init', async (opts, cli) => { + const importDemo = opts.importDemo || this.options.importDemo; + console.log({ importDemo }); + if (importDemo !== true) { + return; + } + const sqls = getInitSqls(); + + const database = app.db; + + await runSqlFile(sqls.part1, database); + + await app.db.getModel('collections').load({ + skipExisting: true, + }); + await app.db.sync(); + + await runSqlFile(sqls.part2, database); + + if (app.db.sequelize.getDialect() == 'postgres') { + await runSqlFile(sqls.postgres, database); + } + }); + }, +} as PluginOptions; diff --git a/packages/plugin-collections/package.json b/packages/plugin-collections/package.json index 60dd3db5a7d4d65d9aa1769ebe9a253e19f88cfd..cf4fb72be31a1384d74ba022ac978ccecb1c77d1 100644 --- a/packages/plugin-collections/package.json +++ b/packages/plugin-collections/package.json @@ -1,16 +1,14 @@ { "name": "@nocobase/plugin-collections", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", "dependencies": { - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7", + "@nocobase/server": "^0.5.0-alpha.25", "deepmerge": "^4.2.2" }, "devDependencies": { - "@nocobase/actions": "^0.4.0-alpha.7" + "@nocobase/test": "^0.5.0-alpha.25" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-collections/src/__tests__/actions/collections.test.ts b/packages/plugin-collections/src/__tests__/actions/collections.test.ts deleted file mode 100644 index 1c9578bdfbdee9c6c0afa8a1aff883d935163418..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/__tests__/actions/collections.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Agent, getAgent, getApp } from '..'; -import { Application } from '@nocobase/server'; -import { types } from '../../interfaces'; - -describe('collection hooks', () => { - let app: Application; - let agent: Agent; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - }); - - afterEach(() => app.database.close()); - - it('create table', async () => { - const response = await agent.resource('collections').create({ - values: { - name: 'tests', - title: 'tests', - }, - }); - const table = app.database.getTable('tests'); - expect(table).toBeDefined(); - }); - - it('create table without name', async () => { - const response = await agent.resource('collections').create({ - values: { - title: 'tests', - }, - }); - - const { name } = response.body; - const table = app.database.getTable(name); - expect(table).toBeDefined(); - expect(table.getOptions().title).toBe('tests'); - - const list = await agent.resource('collections').list(); - expect(list.body.rows.length).toBe(1); - - await table.getModel().drop(); - }); -}); diff --git a/packages/plugin-collections/src/__tests__/collections.test.ts b/packages/plugin-collections/src/__tests__/collections.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..8949dbd1cf0a47ebe89968ea7ce4bc466519fd6c --- /dev/null +++ b/packages/plugin-collections/src/__tests__/collections.test.ts @@ -0,0 +1,40 @@ +import { Agent, getAgent, getApp } from '.'; +import { Application } from '@nocobase/server'; +import Database from '@nocobase/database'; + +describe('collection hooks', () => { + let app: Application; + let agent: Agent; + let db: Database; + + beforeEach(async () => { + app = await getApp(); + db = app.db; + agent = getAgent(app); + }); + + afterEach(() => app.db.close()); + + it('create table', async () => { + const Collection = db.getModel('collections'); + const collection = await Collection.create({ + title: 'tests', + // name: 'tests', + }); + await collection.updateAssociations({ + fields: [ + { + name: 'title', + dataType: 'string', + }, + { + name: 'content', + dataType: 'text', + }, + { + dataType: 'integer', + }, + ], + }); + }); +}); diff --git a/packages/plugin-collections/src/__tests__/index.ts b/packages/plugin-collections/src/__tests__/index.ts index e0574424b5d0931131ed4479efc7099aa7d0a70e..d4439acdcb931c4b2b78cda6fd18c2cf7a6ac752 100644 --- a/packages/plugin-collections/src/__tests__/index.ts +++ b/packages/plugin-collections/src/__tests__/index.ts @@ -59,22 +59,22 @@ export async function getApp() { app.resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); app.registerPlugin('collections', [plugin]); await app.loadPlugins(); - await app.database.sync(); + await app.db.sync(); // 表配置信息存到数据库里 - // const tables = app.database.getTables([]); + // const tables = app.db.getTables([]); // for (const table of tables) { - // const Collection = app.database.getModel('collections'); + // const Collection = app.db.getModel('collections'); // await Collection.import(table.getOptions(), { hooks: false }); // } app.use(async (ctx, next) => { - ctx.db = app.database; + ctx.db = app.db; await next(); }); app.use(bodyParser()); app.use(middleware({ prefix: '/api', resourcer: app.resourcer, - database: app.database, + database: app.db, })); return app; } diff --git a/packages/plugin-collections/src/__tests__/models/base.test.ts b/packages/plugin-collections/src/__tests__/models/base.test.ts deleted file mode 100644 index c4bc28310e344347f06753d96de6c3e35435e8b2..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/__tests__/models/base.test.ts +++ /dev/null @@ -1,286 +0,0 @@ -import Database, { ModelCtor } from '@nocobase/database'; -import { getDatabase } from '../'; -import BaseModel from '../../models/base'; -import _ from 'lodash'; - -describe('models.base', () => { - let database: Database; - let TestModel: ModelCtor; - let test: BaseModel; - beforeEach(async () => { - database = getDatabase(); - database.table({ - name: 'tests', - model: BaseModel, - additionalAttribute: 'options', - fields: [ - { - name: 'name', - type: 'string', - }, - { - name: 'title', - type: 'virtual', - }, - { - name: 'xyz', - type: 'virtual', - defaultValue: 'xyz1', - }, - { - name: 'content', - type: 'virtual', - set(val) { - // 留空 - } - }, - { - name: 'key1', - type: 'virtual', - set(val) { - this.setDataValue('options.key1', `111${val}111`); - } - }, - { - name: 'key2', - type: 'virtual', - get() { - return 'val2'; - } - }, - { - type: 'json', - name: 'component', - defaultValue: {}, - }, - { - type: 'json', - name: 'options', - defaultValue: {}, - }, - ], - }); - await database.sync(); - TestModel = database.getModel('tests') as ModelCtor; - test = await TestModel.create({ - name: '123', - abc: { aa: 'aa' }, - 'abc.bb': 'bb', - component: { - a: 'a', - }, - 'component.b': 'b', - options: { - bcd: 'bbb', - }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - afterEach(() => database.close()); - - it('get all attribute', async () => { - // 获取所有字段 - expect(test.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - component: { a: 'a', b: 'b' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - it('get options attribute', async () => { - // 直接取 options 字段 - expect(test.get('options')).toEqual({ - abc: { - aa: 'aa', - bb: 'bb', - }, - bcd: 'bbb', - xyz: "xyz1", - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - it('get component attribute', async () => { - expect(test.get('component')).toEqual({ a: 'a', b: 'b' }); - }); - - it('set component attribute with dot key', async () => { - test.set('component.c', 'c'); - await test.save(); - expect(test.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - component: { a: 'a', b: 'b' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - expect(test.get('component')).toEqual({ a: 'a', b: 'b', c: 'c' }); - }); - - it('set options attribute with dot key', async () => { - test.set('options.cccc', 'cccc'); - await test.save(); - expect(test.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - cccc: 'cccc', - component: { a: 'a', b: 'b' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - it('set options attribute without options prefix', async () => { - test.set('dddd', 'dddd'); - await test.save(); - expect(test.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - dddd: 'dddd', - component: { a: 'a', b: 'b' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - it('refind', async () => { - test.set('component.c', 'c'); - await test.save(); - // 重新查询 - const test2 = await TestModel.findByPk(test.id); - expect(test2.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - component: { a: 'a', b: 'b', c: 'c' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - expect(test2.get('component')).toEqual({ a: 'a', b: 'b', c: 'c' }); - }); - - it('update', async () => { - await test.update({ - 'name123': 'xxx', - 'component.d': 'd', - }); - expect(test.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - name123: 'xxx', - component: { a: 'a', b: 'b', d: 'd' }, - arr: [{ a: 'a' }, { b: 'b' }], - }); - }); - - it('update virtual attribute', async () => { - await test.update({ - title: 'xxx', // 虚拟字段没 set 转存 options - content: 'content123', // set 留空,这个 key 什么也不做 - key1: 'val1', // 走 set 方法 - }); - // 重新获取再验证 - const test2 = await TestModel.findByPk(test.id); - expect(test2.get()).toMatchObject({ - abc: { aa: 'aa', bb: 'bb' }, - bcd: 'bbb', - name: '123', - component: { a: 'a', b: 'b' }, - arr: [{ a: 'a' }, { b: 'b' }], - title: 'xxx', - key2: 'val2', // key2 为 get 方法取的 - key1: '111val1111', - }); - expect(test2.get('content')).toBeUndefined(); - }); - - it('update', async () => { - const t = await TestModel.create({ - name: 'name1', - // xyz: 'xyz', - }); - await t.update({ - abc: 'abc', - }); - const t2 = await TestModel.findOne({ - where: { - name: 'name1', - } - }); - expect(t2.get()).toMatchObject({ - xyz: 'xyz1', - abc: 'abc', - key2: 'val2', - id: 2, - name: 'name1', - }); - await t2.update({ - abc: 'abcdef', - }); - const t3 = await TestModel.findOne({ - where: { - name: 'name1', - } - }); - // 查询之后更新再重新查询 - expect(t3.get()).toMatchObject({ - xyz: 'xyz1', - abc: 'abcdef', - key2: 'val2', - id: 2, - name: 'name1', - }); - }); - - it('update', async () => { - const t = await TestModel.create({ - name: 'name1', - xyz: 'xyz', - }); - await t.update({ - abc: 'abc', - }); - const t2 = await TestModel.findOne({ - where: { - name: 'name1', - } - }); - expect(t2.get()).toMatchObject({ - xyz: 'xyz', - abc: 'abc', - key2: 'val2', - id: 2, - name: 'name1', - }); - }); - - it('component', async () => { - const t = await TestModel.create({ - component: { - arr: [ - { a: 'a', aa: 'aa' }, - { b: 'b', bb: 'bb' }, - { c: 'c', cc: 'cc' }, - ], - }, - }); - t.set({ - component: { - arr: [ - { a: 'aa' }, - { b: 'bb' }, - ], - } - }); - await t.save(); - expect(t.get('component')).toEqual({ - arr: [ - { a: 'aa' }, - { b: 'bb' }, - ], - }); - }) -}); diff --git a/packages/plugin-collections/src/__tests__/models/collection.test.ts b/packages/plugin-collections/src/__tests__/models/collection.test.ts deleted file mode 100644 index fb1b5f2888b6749f01c3fa85027107a7745aacad..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/__tests__/models/collection.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Agent, getAgent, getApp } from '../'; -import { Application } from '@nocobase/server'; -import * as types from '../../interfaces/types'; - -describe('models.collection', () => { - let app: Application; - let agent: Agent; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - }); - - afterEach(() => app.database.close()); - - it('import all tables', async () => { - const tables = app.database.getTables([]); - for (const table of tables) { - const Collection = app.database.getModel('collections'); - await Collection.import(table.getOptions(), { migrate: false }); - } - }); - - it('import examples', async () => { - await app.database.getModel('collections').import({ - title: '示例', - name: 'examples', - showInDataMenu: true, - statusable: false, - fields: [ - { - interface: 'string', - title: '单行文本', - name: 'string', - component: { - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'textarea', - title: '多行文本', - name: 'textarea', - component: { - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - ], - }, { - // migrate: false, - }); - const table = app.database.getTable('examples'); - expect(table).toBeDefined(); - expect(table.getFields().size).toBe(2); - await table.sync(); - const Example = app.database.getModel('examples'); - const example = await Example.create({ - string: 'string1', - textarea: 'textarea1', - }); - expect(example.toJSON()).toMatchObject({ - string: 'string1', - textarea: 'textarea1', - }); - }); -}); diff --git a/packages/plugin-collections/src/__tests__/models/field.test.ts b/packages/plugin-collections/src/__tests__/models/field.test.ts deleted file mode 100644 index b0ba47f8e301b1050d92a2cb244ad7527d803e78..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/__tests__/models/field.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Agent, getAgent, getApp } from '../'; -import { Application } from '@nocobase/server'; -import { types } from '../../interfaces'; - -describe('models.field', () => { - let app: Application; - let agent: Agent; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - }); - - afterEach(() => app.database.close()); - - it('updatedAt', async () => { - const Field = app.database.getModel('fields'); - const field = new Field(); - field.setInterface('updatedAt'); - expect(field.get()).toMatchObject(types.updatedAt.options) - }); - - it('dataSource', async () => { - const Collection = app.database.getModel('collections'); - // @ts-ignore - const collection = await Collection.create({ - title: 'tests', - }); - await collection.updateAssociations({ - fields: [ - { - title: 'xx', - name: 'xx', - interface: 'select', - type: 'virtual', - dataSource: [ - { label: 'xx', value: 'xx' }, - ], - component: { - type: 'string', - showInDetail: true, - showInForm: true, - }, - } - ], - }); - const fields = await collection.getFields(); - expect(fields[0].get('dataSource')).toEqual([ - { label: 'xx', value: 'xx' }, - ]); - }); - - it.skip('sub table field', async () => { - const [Collection, Field] = app.database.getModels(['collections', 'fields']); - const options = { - title: 'tests', - name: 'tests', - fields: [ - { - interface: 'subTable', - title: '子表格', - name: 'subs', - children: [ - { - interface: 'string', - title: '名称', - name: 'name', - }, - ], - }, - ], - }; - const collection = await Collection.create(options); - await collection.updateAssociations(options); - const field = await Field.findOne({ - where: { - title: '子表格', - }, - }); - await field.createChild({ - interface: 'string', - title: '名称', - name: 'title', - }); - const Test = app.database.getModel('tests'); - const Sub = app.database.getModel('subs'); - // console.log(Test.associations); - // console.log(Sub.rawAttributes); - const test = await Test.create({}); - const sub = await test.createSub({ name: 'name1', title: 'title1' }); - expect(sub.toJSON()).toMatchObject({ name: 'name1', title: 'title1' }) - }); - - it('sub table field', async () => { - const [Collection, Field] = app.database.getModels(['collections', 'fields']); - // @ts-ignore - const options = { - title: 'tests', - name: 'tests', - fields: [ - { - interface: 'subTable', - title: '子表格', - // name: 'subs', - children: [ - { - interface: 'string', - title: '名称', - // name: 'name', - }, - ], - }, - ], - }; - const collection = await Collection.create(options); - await collection.updateAssociations(options); - const field = await Field.findOne({ - where: { - title: '子表格', - }, - }); - await field.createChild({ - interface: 'string', - title: '名称', - name: 'title', - }); - }); -}); diff --git a/packages/plugin-collections/src/actions/fields.ts b/packages/plugin-collections/src/actions/fields.ts new file mode 100644 index 0000000000000000000000000000000000000000..8fa2e618114e8cc2b971083f08aff95fd78b296d --- /dev/null +++ b/packages/plugin-collections/src/actions/fields.ts @@ -0,0 +1,9 @@ +import { actions, Context, Next } from '@nocobase/actions'; + +export const create = async (ctx: Context, next: Next) => { + await actions.create(ctx, async () => {}); + const { associated } = ctx.action.params; + await ctx.body.generateReverseField(); + await ctx.body.migrate(); + await next(); +} diff --git a/packages/plugin-collections/src/actions/getCollection.ts b/packages/plugin-collections/src/actions/getCollection.ts deleted file mode 100644 index 380df51c7579d2170636bfe0093f5a2fb0e8ee7f..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/actions/getCollection.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; -import { ResourceOptions } from '@nocobase/resourcer'; -import { get } from 'lodash'; - -export default async (ctx, next) => { - const { resourceName, resourceKey } = ctx.action.params; - const [Collection, Tab, View] = ctx.db.getModels(['collections', 'tabs', 'views']) as ModelCtor[]; - const collection = await Collection.findOne(Collection.parseApiJson({ - filter: { - name: resourceName, - }, - // fields: { - // // appends: ['tabs'], - // }, - })); - const views = await collection.getViews({ - where: { - default: true, - }, - }); - collection.setDataValue('defaultViewId', get(views, [0, 'id'])); - collection.setDataValue('defaultViewName', get(views, [0, 'name'])); - const tabs = await collection.getTabs(); - ctx.body = { - ...collection.toJSON(), - tabs: tabs.map(tab => ({ - ...tab.toJSON(), - ...tab.options, - viewCollectionName: tab.type == 'association' ? tab.options.association : tab.collection_name, - })), - }; - await next(); -} diff --git a/packages/plugin-collections/src/actions/getView.ts b/packages/plugin-collections/src/actions/getView.ts deleted file mode 100644 index 5a230a5bd53e0ecaf7b0b6c49a3abdff3638323d..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/actions/getView.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ResourceOptions } from '@nocobase/resourcer'; -import { Model, ModelCtor } from '@nocobase/database'; -import { get } from 'lodash'; - -export default async (ctx, next) => { - const { resourceName, resourceKey } = ctx.action.params; - const [View, Field, Action] = ctx.db.getModels(['views', 'fields', 'actions']) as ModelCtor[]; - const view = await View.findOne(View.parseApiJson({ - filter: { - collection_name: resourceName, - name: resourceKey, - }, - fields: { - appends: ['actions', 'fields'], - }, - })); - const collection = await view.getCollection(); - const fields = await collection.getFields(); - const actions = await collection.getActions(); - const actionNames = view.options.actionNames || []; - // console.log(view.options); - if (view.type === 'table') { - const defaultTabs = await collection.getTabs({ - where: { - default: true, - }, - }); - view.setDataValue('defaultTabName', get(defaultTabs, [0, 'name'])); - } - if (view.options.updateViewId) { - view.setDataValue('rowViewName', view.options.updateViewName); - } - view.setDataValue('viewCollectionName', view.collection_name); - ctx.body = { - ...view.toJSON(), - ...(view.options || {}), - fields, - actions: actions.filter(action => actionNames.includes(action.name)).map(action => ({ - ...action.toJSON(), - ...action.options, - viewCollectionName: action.collection_name, - })), - }; - await next(); -}; diff --git a/packages/plugin-collections/src/actions/index.ts b/packages/plugin-collections/src/actions/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..631ab8b3bd7dcda3c1ec37921b9a7efead4b1bf7 --- /dev/null +++ b/packages/plugin-collections/src/actions/index.ts @@ -0,0 +1,56 @@ +import { actions, Context, Next } from '@nocobase/actions'; + +export const findAll = async (ctx: Context, next: Next) => { + const Collection = ctx.db.getModel('collections'); + const collections = await Collection.findAll(Collection.parseApiJson({ + sort: 'sort', + })); + const data = []; + for (const collection of collections) { + data.push(await collection.toProps()); + } + ctx.body = data; + await next(); +} + +export const createOrUpdate = async (ctx: Context, next: Next) => { + const { values } = ctx.action.params; + const Collection = ctx.db.getModel('collections'); + let collection; + if (values.name) { + collection = await Collection.findByPk(values.name); + } + try { + if (!collection) { + collection = await Collection.create(values); + } else { + await collection.update(values); + } + if (values.generalFields) { + values.generalFields = values.generalFields.map((field, index) => { + return { + ...field, + sort: index + 1, + } + }) + } + await collection.updateAssociations(values); + + const fields = await collection.getGeneralFields({ + where: { + interface: 'linkTo', + } + }); + + for (const field of fields) { + await field.generateReverseField(); + } + + await collection.migrate(); + } catch (error) { + // console.log('error.errors', error.errors) + throw error; + } + ctx.body = collection; + await next(); +} diff --git a/packages/plugin-collections/src/collections/actions.ts b/packages/plugin-collections/src/collections/actions.ts deleted file mode 100644 index 1188b41894354b23a6d4d931a89efc215e8f4780..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/collections/actions.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'actions', - title: '操作配置', - internal: true, - draggable: true, - model: 'ActionModel', - developerMode: true, - fields: [ - { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['collection'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '名称', - component: { - type: 'string', - className: 'drag-visible', - showInForm: true, - showInTable: true, - showInDetail: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'name', - title: '标识', - component: { - type: 'string', - showInForm: true, - showInTable: true, - showInDetail: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'type', - title: '类型', - component: { - type: 'string', - showInForm: true, - showInTable: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - component: { - type: 'hidden', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], -} as TableOptions; diff --git a/packages/plugin-collections/src/collections/collections.ts b/packages/plugin-collections/src/collections/collections.ts index 23dbe21481e22fcecd0fc885d93b855d931bcc45..0440fe0b424e3df82d7063c668956d5bc20007ea 100644 --- a/packages/plugin-collections/src/collections/collections.ts +++ b/packages/plugin-collections/src/collections/collections.ts @@ -3,377 +3,69 @@ import { TableOptions } from '@nocobase/database'; export default { name: 'collections', title: '数据表配置', - internal: true, - sortable: true, - draggable: true, - model: 'CollectionModel', - developerMode: true, - createdAt: 'createdTime', - updatedAt: 'updatedTime', + model: 'Collection', + sortable: 'sort', fields: [ - // { - // interface: 'sort', - // type: 'sort', - // name: 'sort', - // title: '排序', - // component: { - // type: 'sort', - // className: 'drag-visible', - // width: 60, - // showInTable: true, - // }, - // }, { - interface: 'string', - type: 'string', - name: 'title', - title: '数据表名称', - required: true, - component: { - type: 'string', - }, - }, - { - interface: 'string', - type: 'string', + type: 'uid', name: 'name', - createOnly: true, - title: '标识', - unique: true, - required: true, - developerMode: true, - component: { - type: 'string', - }, + primaryKey: true, + prefix: 't_', }, { - interface: 'textarea', - type: 'text', - name: 'description', - title: '数据表描述', - component: { - type: 'textarea', - }, + type: 'boolean', + name: 'logging', + defaultValue: true, }, - // { - // interface: 'boolean', - // type: 'virtual', - // name: 'createdAt', - // title: '记录创建时间', - // developerMode: true, - // defaultValue: true, - // component: { - // type: 'checkbox', - // default: true, - // showInForm: true, - // }, - // }, - // { - // interface: 'boolean', - // type: 'virtual', - // name: 'updatedAt', - // title: '记录修改时间', - // developerMode: true, - // defaultValue: true, - // component: { - // type: 'checkbox', - // default: true, - // showInForm: true, - // }, - // }, { - interface: 'boolean', - type: 'virtual', - name: 'createdBy', - title: '记录创建人信息', - developerMode: true, - component: { - type: 'checkbox', - default: true, - showInForm: true, - }, + type: 'string', + name: 'title', + required: true, }, { - interface: 'boolean', - type: 'virtual', - name: 'updatedBy', - title: '记录修改人信息', - developerMode: true, - component: { - type: 'checkbox', - default: true, - showInForm: true, - }, + type: 'string', + name: 'privilege', }, { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - developerMode: true, - defaultValue: false, - component: { - type: 'boolean', - }, + type: 'json', + name: 'sortable', + defaultValue: 'sort', }, { - interface: 'json', type: 'json', name: 'options', - title: '配置信息', defaultValue: {}, - component: { - type: 'hidden', - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'internal', - title: '系统内置', - defaultValue: false, - developerMode: true, - component: { - type: 'boolean', - }, }, { - interface: 'linkTo', type: 'hasMany', name: 'fields', - title: '字段', + target: 'fields', sourceKey: 'name', - draggable: true, - actions: { - list: { - sort: 'sort', - }, - get: { - fields: { - appends: ['children'], - }, - }, - }, - component: { - type: 'drawerSelect', - }, }, { - interface: 'linkTo', type: 'hasMany', - name: 'actions', - title: '动作', + name: 'generalFields', + target: 'fields', + foreignKey: 'collection_name', sourceKey: 'name', - draggable: true, - actions: { - list: { - sort: 'sort', - }, - }, - component: { - type: 'drawerSelect', + scope: { + state: 1, }, }, { - interface: 'linkTo', type: 'hasMany', - name: 'views_v2', - target: 'views_v2', - title: '视图', + name: 'systemFields', + target: 'fields', + foreignKey: 'collection_name', sourceKey: 'name', - draggable: true, - // actions: { - // list: { - // sort: 'sort', - // }, - // destroy: { - // filter: { - // default: false - // } - // } - // }, - component: { - type: 'drawerSelect', + scope: { + state: 0, }, }, { - interface: 'linkTo', - type: 'hasMany', - name: 'scopes', - target: 'scopes', - title: '数据范围', - sourceKey: 'name', - actions: { - list: { - sort: 'id', - }, - update: { - filter: { - locked: false - } - }, - destroy: { - filter: { - locked: false - } - } - }, - component: { - type: 'drawerSelect', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['title', 'description'], - detailsOpenMode: 'window', // window - details: ['descriptions', 'fields', 'views'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['title', 'description'], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - fields: ['title', 'description'], - actions: [ - { - name: 'update', - type: 'update', - title: '编辑', - viewName: 'form', - }, - ], - }, - { - developerMode: true, - type: 'table', - name: 'permissions_table', - title: '权限表格', - labelField: 'title', - actions: [], - fields: ['title'], - detailsOpenMode: 'drawer', // window - details: ['permissions_form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'permissions_form', - title: '权限表单', - fields: [ - { - interface: 'json', - type: 'json', - title: '数据操作权限', - name: 'actions', - component: { - "type": "permissions.actions", - "title": "数据操作权限", - "x-linkages": [{ - "type": "value:schema", - "target": "actions", - "schema": { - "x-component-props": { - "resourceKey": "{{ $form.values && $form.values.resourceKey }}" - } - } - }], - "x-component-props": { - "dataSource": [] - } - }, - }, - { - interface: 'json', - type: 'json', - title: '字段权限', - name: 'fields', - component: { - "type": "permissions.fields", - "x-linkages": [{ - "type": "value:schema", - "target": "fields", - "schema": { - "x-component-props": { - "resourceKey": "{{ $form.values && $form.values.resourceKey }}" - } - } - }], - "x-component-props": { - "dataSource": [] - } - }, - }, - ], - }, - { - developerMode: true, - type: 'table', - dataSourceType: 'association', - name: 'fields', - title: '字段', - targetViewName: 'table2', - targetFieldName: 'fields', - }, - { - developerMode: true, - type: 'table', - dataSourceType: 'association', - name: 'views', - title: '视图', - targetViewName: 'table', - targetFieldName: 'views_v2', + type: 'belongsTo', + name: 'uiSchema', + target: 'ui_schemas', }, ], } as TableOptions; diff --git a/packages/plugin-collections/src/collections/fields.ts b/packages/plugin-collections/src/collections/fields.ts index 81be1ed7742d1dcf3c6df9ccfa0cca213dfe8d58..81bb8ce254d32617aa458445842f03a98fe3bdf9 100644 --- a/packages/plugin-collections/src/collections/fields.ts +++ b/packages/plugin-collections/src/collections/fields.ts @@ -1,690 +1,72 @@ import { TableOptions } from '@nocobase/database'; -import { types, getOptions } from '../interfaces'; +import { DataTypes } from 'sequelize'; export default { name: 'fields', title: '字段配置', - internal: true, - draggable: true, - model: 'FieldModel', - developerMode: true, + model: 'Field', + sortable: { + type: 'sort', + name: 'sort', + scope: ['parentKey'], + }, fields: [ { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['collection'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, + type: 'uid', + name: 'key', + primaryKey: true, + prefix: 'f_', }, { - interface: 'string', - type: 'string', - name: 'title', - title: '字段名称', - required: true, - component: { - type: 'string', - className: 'drag-visible', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'string', type: 'string', name: 'name', - title: '标识', - required: true, - createOnly: true, - developerMode: true, - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, }, { - interface: 'select', type: 'string', name: 'interface', - title: '字段类型', - required: true, - dataSource: getOptions(), - createOnly: true, - component: { - type: 'select', - showInTable: true, - showInDetail: true, - showInForm: true, - "x-linkages": [ - // TODO(draft): 统一解决字段类型和配置参数联动的一种方式 - // { - // type: 'value:schema', - // target: 'options', - // schema: { - // 'x-component-props': { - // fields: '{{ $self.values[1].fields || [] }}' - // } - // }, - // condition: '{{ !!$self.value }}' - // }, - { - "type": "value:visible", - "target": "precision", - "condition": "{{ ['number', 'percent'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "dataSource", - "condition": "{{ ['select', 'multipleSelect', 'radio', 'checkboxes'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "dateFormat", - "condition": "{{ ['datetime', 'createdAt', 'updatedAt'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "showTime", - "condition": "{{ ['datetime', 'createdAt', 'updatedAt'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "timeFormat", - "condition": "{{ ['time'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "multiple", - "condition": "{{ ['linkTo'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "target", - "condition": "{{ ['linkTo'].indexOf($self.value) !== -1 }}" - }, - // { - // "type": "value:visible", - // "target": "labelField", - // "condition": "{{ ['linkTo'].indexOf($self.value) !== -1 }}" - // }, - { - "type": "value:visible", - "target": "createable", - "condition": "{{ ['linkTo'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "children", - "condition": "{{ ['subTable'].indexOf($self.value) !== -1 }}" - }, - { - "type": "value:visible", - "target": "component.showInTable", - "condition": "{{ ['subTable', 'description'].indexOf($self.value) === -1 }}" - }, - { - "type": "value:visible", - "target": "component.showInForm", - "condition": "{{ ['createdAt', 'updatedAt', 'createdBy', 'updatedBy'].indexOf($self.value) === -1 }}" - }, - { - "type": "value:visible", - "target": "required", - "condition": "{{ ['createdAt', 'updatedAt', 'createdBy', 'updatedBy'].indexOf($self.value) === -1 }}" - }, - { - "type": "value:visible", - "target": "maxLevel", - "condition": "{{ ['chinaRegion'].includes($self.value) }}" - }, - { - "type": "value:visible", - "target": "incompletely", - "condition": "{{ ['chinaRegion'].includes($self.value) }}" - }, - ], - }, }, - // TODO(draft): 将 options 作为集合字段开放出来,可以动态的解决字段参数的配置表单联动问题 - // { - // interface: 'json', - // type: 'json', - // name: 'options', - // title: '配置信息', - // defaultValue: {}, - // component: { - // type: 'subFields', - // showInForm: true, - // }, - // }, { - interface: 'subTable', - type: 'virtual', - name: 'dataSource', - title: '可选项', - component: { - type: 'table', - default: [{}], - // showInTable: true, - // showInDetail: true, - showInForm: true, - items: { - type: 'object', - properties: { - value: { - type: "string", - title: "值", - required: true - }, - label: { - type: "string", - title: "选项", - required: true - }, - }, - }, - }, + type: 'string', + name: 'dataType', }, { - interface: 'string', type: 'string', - name: 'type', - title: '数据类型', - developerMode: true, - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, + name: 'privilege', }, { - interface: 'number', type: 'integer', - name: 'parent_id', - title: '所属分组', - component: { - type: 'number', - }, - }, - { - interface: 'select', - type: 'virtual', - name: 'precision', - title: '精度', - dataSource: [ - { value: 0, label: '1' }, - { value: 1, label: '1.0' }, - { value: 2, label: '1.00' }, - { value: 3, label: '1.000' }, - { value: 4, label: '1.0000' }, - ], - component: { - type: 'number', - showInForm: true, - default: 0, - }, - }, - { - interface: 'select', - type: 'virtual', - name: 'dateFormat', - title: '日期格式', - dataSource: [ - { value: 'YYYY/MM/DD', label: '年/月/日' }, - { value: 'YYYY-MM-DD', label: '年-月-日' }, - { value: 'DD/MM/YYYY', label: '日/月/年' }, - ], - component: { - type: 'string', - showInForm: true, - default: 'YYYY-MM-DD', - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'showTime', - title: '显示时间', - component: { - type: 'boolean', - showInForm: true, - default: false, - "x-linkages": [ - { - "type": "value:visible", - "target": "timeFormat", - "condition": "{{ ($form.values && $form.values.interface === 'time') || $self.value === true }}" - }, - ], - }, - }, - { - interface: 'select', - type: 'virtual', - name: 'timeFormat', - title: '时间格式', - dataSource: [ - { value: 'HH:mm:ss', label: '24小时制' }, - { value: 'hh:mm:ss a', label: '12小时制' }, - ], - component: { - type: 'string', - showInForm: true, - default: 'HH:mm:ss', - }, - }, - // TODO(refactor): 此部分类型相关的参数,后期应拆分出去 - { - name: 'maxLevel', - title: '可选层级', - interface: 'radio', - type: 'virtual', - dataSource: [ - { value: 1, label: '省' }, - { value: 2, label: '市' }, - { value: 3, label: '区/县' }, - { value: 4, label: '乡镇/街道' }, - { value: 5, label: '村/居委会' }, - ], - component: { - showInForm: true, - default: 3 - } - }, - { - name: 'incompletely', - title: '可部分选择', - interface: 'boolean', - type: 'virtual', - component: { - showInForm: true, - } + name: 'state', + defaultValue: 1, }, { - interface: 'linkTo', - multiple: false, - type: 'belongsTo', - name: 'parent', - title: '所属分组', - target: 'fields', - foreignKey: 'parent_id', - targetKey: 'id', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'string', - type: 'virtual', - name: 'target', - title: '要关联的数据表', - required: true, - createOnly: true, - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - mode: 'simple', - resourceName: 'collections', - labelField: 'title', - valueField: 'name', - }, - "x-linkages": [ - { - type: "value:state", - target: "labelField", - condition: "{{ $self.inputed }}", - state: { - value: null, - } - }, - { - "type": "value:visible", - "target": "labelField", - "condition": "{{ !!$self.value }}" - }, - { - type: "value:schema", - target: "labelField", - // condition: "{{ $self.value }}", - schema: { - "x-component-props": { - "associatedKey": "{{ $self.value }}" - }, - }, - }, - { - type: 'value:visible', - target: 'component.x-component-props.filter', - condition: '{{ !!$self.value }}' - }, - { - type: "value:schema", - target: "component.x-component-props.filter", - schema: { - "x-component-props": { - "associatedKey": "{{ $self.value }}" - }, - }, - }, - ], - }, - }, - { - interface: 'string', - type: 'virtual', - name: 'labelField', - title: '要显示的字段', - required: true, - component: { - type: 'remoteSelect', - 'x-component-props': { - mode: 'simple', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - }, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'multiple', - title: '允许添加多条记录', - component: { - type: 'checkbox', - showInDetail: true, - showInForm: true, - default: true, - }, - }, - { - name: 'component.x-component-props.filter', - interface: 'json', - type: 'virtual', - title: '数据范围', - component: { - type: 'filter', - 'x-component-props': { - resourceName: 'collections.fields', - }, - showInForm: true, - } - }, - { - interface: 'boolean', - type: 'virtual', - name: 'createable', - title: '允许直接在关联的数据表内新建数据', - component: { - type: 'checkbox', - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'subTable', type: 'hasMany', name: 'children', target: 'fields', - sourceKey: 'id', - foreignKey: 'parent_id', - title: '子表格字段', - viewName: 'table2', - // visible: true, - component: { - type: 'subTable', - default: [], - // showInTable: true, - // showInDetail: true, - showInForm: true, - 'x-linkages': [ - { - type: 'value:schema', - target: 'children', - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.id }}" - }, - }, - }, - ], - }, + sourceKey: 'key', + foreignKey: 'parentKey', }, - // { - // interface: 'linkTo', - // multiple: true, - // type: 'hasMany', - // name: 'children', - // title: '子字段', - // target: 'fields', - // foreignKey: 'parent_id', - // sourceKey: 'id', - // component: { - // type: 'drawerSelect', - // }, - // }, { - interface: 'textarea', - type: 'virtual', - name: 'component.tooltip', - title: '提示信息', - component: { - type: 'textarea', - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'required', - title: '必填项', - component: { - type: 'checkbox', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'component.showInTable', - title: '显示在表格中', - component: { - type: 'checkbox', - tooltip: '若勾选,该字段将作为一列显示在数据表里', - showInTable: true, - showInDetail: true, - showInForm: true, - default: true, - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'component.showInForm', - title: '显示在表单中', - component: { - type: 'checkbox', - tooltip: '若勾选,该字段将出现在表单中', - showInTable: true, - showInDetail: true, - showInForm: true, - default: true, - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'component.showInDetail', - title: '显示在详情中', - component: { - type: 'checkbox', - tooltip: '若勾选,该字段将出现在详情中', - showInTable: true, - showInDetail: true, - showInForm: true, - default: true, - }, - }, - { - interface: 'linkTo', type: 'belongsTo', name: 'collection', - title: '所属数据表', target: 'collections', targetKey: 'name', - labelField: 'title', - component: { - type: 'drawerSelect', - // showInTable: true, - 'x-component-props': { - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - }, - }, }, { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, + type: 'belongsTo', + name: 'reverseField', + target: 'fields', + sourceKey: 'key', + foreignKey: 'reverseKey', }, { - interface: 'json', - type: 'json', - name: 'component', - title: '前端组件', - defaultValue: {}, - component: { - type: 'hidden', - }, + type: 'belongsTo', + name: 'uiSchema', + target: 'ui_schemas', }, { - interface: 'json', type: 'json', name: 'options', - title: '配置信息', defaultValue: {}, - component: { - type: 'hidden', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '关联的字段', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['title', 'interface'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['sort'], - }, - { - developerMode: true, - type: 'table', - name: 'table2', - title: '表格', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['sort', 'title', 'interface'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['sort'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'interface', - 'dataSource', - 'precision', - 'dateFormat', - 'showTime', - 'timeFormat', - 'maxLevel', - 'incompletely', - 'target', - 'labelField', - 'children', - 'multiple', - // 'required', - ], }, ], } as TableOptions; diff --git a/packages/plugin-collections/src/collections/scopes.ts b/packages/plugin-collections/src/collections/scopes.ts deleted file mode 100644 index cf88656a80891ed0df6a5553c4a9b5e6e12fdd01..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/collections/scopes.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'scopes', - title: '表操作范围', - developerMode: true, - internal: true, - fields: [ - { - comment: '范围名称', - type: 'string', - name: 'title', - title: '名称', - component: { - type: 'string', - showInTable: true, - showInForm: true, - }, - }, - { - interface: 'json', - type: 'jsonb', - name: 'filter', - title: '条件', - developerMode: false, - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - showInForm: true, - "x-linkages": [ - { - type: "value:schema", - target: "filter", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - ], - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'locked', - title: '锁定', - defaultValue: false, - component: { - showInTable: true, - } - }, - { - type: 'belongsTo', - name: 'collection', - targetKey: 'name', - onDelete: 'CASCADE' - } - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['title'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'filter', - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-collections/src/collections/tabs.ts b/packages/plugin-collections/src/collections/tabs.ts deleted file mode 100644 index 4298a4d2a5bb954e79e87c50d55043ca17821108..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/collections/tabs.ts +++ /dev/null @@ -1,399 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'tabs', - title: '标签配置', - internal: true, - sortable: true, - model: 'TabModel', - developerMode: true, - fields: [ - { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['collection'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '名称', - required: true, - component: { - type: 'string', - className: 'drag-visible', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'name', - title: '标识', - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '类型', - required: true, - dataSource: [ - { label: '详情数据', value: 'details' }, - { label: '相关数据', value: 'association' }, - { label: '模块组合', value: 'module', disabled: true }, - ], - component: { - type: 'radio', - showInTable: true, - showInDetail: true, - showInForm: true, - "x-linkages": [ - // { - // "type": "value:visible", - // "target": "association", - // "condition": "{{ $self.value === 'association' }}" - // }, - { - type: "value:visible", - target: "associationField", - condition: "{{ $self.value === 'association' }}" - }, - { - type: "value:visible", - target: "displayFields", - condition: "{{ $self.value === 'details' }}", - }, - { - type: "value:visible", - target: "displayFormFields", - condition: "{{ $self.value === 'details' }}", - }, - // { - // type: "value:schema", - // target: "association", - // condition: "{{ $self.value === 'association' }}", - // schema: { - // "x-component-props": { - // "associatedKey": "{{ $form.values && $form.values.associatedKey }}" - // }, - // }, - // }, - { - type: "value:schema", - target: "displayFields", - condition: "{{ $self.value === 'details' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: "value:schema", - target: "displayFormFields", - condition: "{{ $self.value === 'details' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: "value:schema", - target: "associationField", - condition: "{{ $self.value === 'association' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - ], - }, - }, - // { - // interface: 'string', - // type: 'string', - // name: 'association', - // title: '相关数据', - // component: { - // type: 'remoteSelect', - // showInDetail: true, - // showInForm: true, - // 'x-component-props': { - // resourceName: 'collections.fields', - // labelField: 'title', - // valueField: 'name', - // filter: { - // interface: 'linkTo', - // }, - // }, - // }, - // }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'associationField', - target: 'fields', - title: '相关数据表', - labelField: 'title', - required: true, - // valueField: 'name', - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections.fields', - labelField: 'title', - // valueField: 'name', - objectValue: true, - filter: { - interface: 'linkTo', - }, - }, - "x-linkages": [ - { - type: "value:visible", - target: "viewName", - condition: "{{ !!$self.value }}" - }, - { - type: "value:schema", - target: "viewName", - condition: "{{ !!$self.value }}", - schema: { - "x-component-props": { - associatedKey: "{{ $self.value.target }}" - }, - }, - }, - ], - }, - }, - { - interface: 'json', - type: 'json', - name: 'displayFields', - title: '显示在详情中的字段', - labelField: 'title', - // valueField: 'name', - component: { - type: 'draggableTable', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - mode: 'showInDetail', - fields: [ - // { - // interface: 'sort', - // name: 'sort', - // title: '排序', - // type: 'sort', - // dataIndex: ['sort'], - // className: 'drag-visible', - // }, - { - interface: 'string', - name: 'title', - title: '字段名称', - type: 'string', - className: 'drag-visible', - dataIndex: ['title'], - } - ], - }, - }, - }, - { - interface: 'json', - type: 'json', - name: 'displayFormFields', - title: '当前标签页可编辑字段', - labelField: 'title', - // valueField: 'name', - component: { - type: 'draggableTable', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - mode: 'showInForm', - fields: [ - // { - // interface: 'sort', - // name: 'sort', - // title: '排序', - // type: 'sort', - // dataIndex: ['sort'], - // className: 'drag-visible', - // }, - { - interface: 'string', - name: 'title', - title: '字段名称', - type: 'string', - className: 'drag-visible', - dataIndex: ['title'], - } - ], - }, - }, - }, - { - interface: 'string', - type: 'string', - name: 'viewName', - title: '视图', - labelField: 'title', - required: true, - // valueField: 'name', - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections.views', - labelField: 'title', - valueField: 'name', - }, - }, - }, - { - interface: 'boolean', - type: 'radio', - name: 'default', - title: '作为默认标签页', - defaultValue: false, - scope: ['collection'], - component: { - type: 'checkbox', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'enabled', - title: '启用', - defaultValue: true, - component: { - type: 'checkbox', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - component: { - type: 'hidden', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - filter: { - default: false - } - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], - views: [ - { - type: 'form', - name: 'form', - title: '表单', - template: 'DrawerForm', - developerMode: true, - }, - { - type: 'details', - name: 'details', - title: '详情', - template: 'Details', - actionNames: ['update'], - developerMode: true, - }, - { - type: 'table', - name: 'simple', - title: '简易模式', - template: 'Table', - mode: 'simple', - default: true, - actionNames: ['destroy', 'create'], - detailsViewName: 'details', - updateViewName: 'form', - paginated: false, - draggable: true, - }, - ], -} as TableOptions; diff --git a/packages/plugin-collections/src/collections/views.ts b/packages/plugin-collections/src/collections/views.ts deleted file mode 100644 index 0c0136fac449462c1fd872dfefe130a463316903..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/collections/views.ts +++ /dev/null @@ -1,403 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'views', - title: '视图配置', - internal: true, - sortable: true, - model: 'ViewModel', - developerMode: true, - fields: [ - { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['collection'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '视图名称', - required: true, - component: { - type: 'string', - className: 'drag-visible', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'name', - title: '标识', - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '视图类型', - required: true, - dataSource: [ - { label: '表格', value: 'table' }, - { label: '日历', value: 'calendar' }, - // { label: '表单', value: 'form' }, - { label: '看板', value: 'kanban', disabled: true }, - { label: '地图', value: 'map', disabled: true }, - ], - component: { - type: 'radio', - showInTable: true, - showInDetail: true, - showInForm: true, - default: 'table', - "x-linkages": [ - { - "type": "value:visible", - "target": "filter", - "condition": "{{ $self.value !== 'form' }}" - }, - { - type: "value:schema", - target: "labelField", - "condition": "{{ $self.value === 'calendar' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: "value:schema", - target: "startDateField", - "condition": "{{ $self.value === 'calendar' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: "value:schema", - target: "endDateField", - "condition": "{{ $self.value === 'calendar' }}", - schema: { - "x-component-props": { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - "type": "value:visible", - "target": "labelField", - "condition": "{{ $self.value === 'calendar' }}", - }, - { - "type": "value:visible", - "target": "startDateField", - "condition": "{{ $self.value === 'calendar' }}", - }, - { - "type": "value:visible", - "target": "endDateField", - "condition": "{{ $self.value === 'calendar' }}", - }, - ], - }, - }, - { - interface: 'select', - type: 'virtual', - title: '标题字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - mode: 'simple', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - }, - { - interface: 'select', - type: 'virtual', - title: '开始日期字段', - name: 'startDateField', - // required: true, - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - placeholder: '默认为创建时间字段', - mode: 'simple', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - }, - { - interface: 'select', - type: 'virtual', - title: '结束日期字段', - name: 'endDateField', - // required: true, - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - placeholder: '默认为创建时间字段', - mode: 'simple', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - }, - { - interface: 'json', - type: 'json', - name: 'filter', - title: '筛选数据', - developerMode: false, - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - showInForm: true, - }, - }, - { - interface: 'radio', - type: 'string', - name: 'mode', - title: '查看和编辑模式', - required: true, - dataSource: [ - { label: '常规模式', value: 'default' }, - { label: '快捷模式', value: 'simple' }, - ], - component: { - tooltip: "常规模式:点击数据进入查看界面,再次点击进入编辑界面
快捷模式:点击数据直接打开编辑界面", - type: 'radio', - default: 'default', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'select', - type: 'string', - name: 'template', - title: '模板', - required: true, - developerMode: true, - dataSource: [ - { label: '表单', value: 'DrawerForm' }, - { label: '常规表格', value: 'Table' }, - { label: '简易表格', value: 'SimpleTable' }, - { label: '日历模板', value: 'Calendar' }, - ], - component: { - type: 'select', - default: 'Table', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'radio', - type: 'virtual', - name: 'defaultPerPage', - title: '默认每页显示几行数据', - defaultValue: 50, - dataSource: [ - { label: '10', value: 10 }, - { label: '20', value: 20 }, - { label: '50', value: 50 }, - { label: '100', value: 100 }, - ], - component: { - type: 'radio', - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'virtual', - name: 'draggable', - title: '支持拖拽数据排序', - showInForm: true, - showInDetail: true, - component: { - type: 'checkbox', - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'radio', - name: 'default', - title: '作为默认视图', - defaultValue: false, - scope: ['collection'], - component: { - type: 'checkbox', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'showInDataMenu', - title: '作为数据表子菜单', - defaultValue: false, - component: { - type: 'checkbox', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - component: { - type: 'hidden', - }, - }, - // 以下暂不考虑 - // { - // type: 'belongsToMany', - // name: 'fields', - // component: { - // type: 'drawerSelect', - // }, - // }, - // { - // type: 'belongsToMany', - // name: 'actions', - // component: { - // type: 'drawerSelect', - // }, - // }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - filter: { - default: false - } - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], - views: [ - { - type: 'form', - name: 'form', - title: '表单', - template: 'DrawerForm', - developerMode: true, - }, - { - type: 'details', - name: 'details', - title: '详情', - template: 'Details', - actionNames: ['update'], - developerMode: true, - }, - { - type: 'table', - name: 'simple', - title: '简易模式', - template: 'SimpleTable', - mode: 'simple', - default: true, - actionNames: ['destroy', 'create'], - detailsViewName: 'details', - updateViewName: 'form', - paginated: false, - draggable: true, - }, - ], -} as TableOptions; diff --git a/packages/plugin-collections/src/hooks/collections-after-create.ts b/packages/plugin-collections/src/hooks/collections-after-create.ts deleted file mode 100644 index b3f7ee13406b967806a7cff9b102fb49d443e0b2..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/collections-after-create.ts +++ /dev/null @@ -1,42 +0,0 @@ -import CollectionModel from '../models/collection'; - -const defaultValues = { - actions: [ - { - type: 'filter', - name: 'filter', - title: '筛选', - }, - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], -}; - -export default async function (model: CollectionModel, options: any = {}) { - const { migrate = true } = options; - console.log('plugin-collections hook', { migrate }) - if (migrate) { - await model.migrate({ ...options, isNewRecord: true }); - } - await model.updateAssociations(defaultValues, options); -} diff --git a/packages/plugin-collections/src/hooks/collections-after-update.ts b/packages/plugin-collections/src/hooks/collections-after-update.ts deleted file mode 100644 index e0c65c27398bfc9a808ff2644e24ff1d76edcfa3..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/collections-after-update.ts +++ /dev/null @@ -1,8 +0,0 @@ -import CollectionModel from '../models/collection'; - -export default async function (model: CollectionModel, options: any = {}) { - const { migrate = true } = options; - if (migrate) { - await model.migrate(options); - } -} diff --git a/packages/plugin-collections/src/hooks/collections-before-validate.ts b/packages/plugin-collections/src/hooks/collections-before-validate.ts deleted file mode 100644 index 62358aca586eb9da2e1b231451c4ad82c6e895ef..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/collections-before-validate.ts +++ /dev/null @@ -1,5 +0,0 @@ -import CollectionModel from '../models/collection'; - -export default async function (model: CollectionModel) { - model.generateNameIfNull(); -} diff --git a/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts b/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts deleted file mode 100644 index 6c897ac95cc6eda06a4f994a913836a3e0f614de..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/fields-after-bulk-update.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; - -/** - * 字段导入是先 create 再 bulk update 处理 fk 的 - * - * @param options - */ -export default async function (options: any = {}) { - const { migrate = true, where = {}, attributes: { collection_name }, transaction } = options; - if (migrate && collection_name) { - const Field = this.database.getModel('fields') as ModelCtor; - const fields = await Field.findAll({ - where, - transaction, - }); - for (const field of fields) { - await field.migrate(options); - } - } -} diff --git a/packages/plugin-collections/src/hooks/fields-after-create.ts b/packages/plugin-collections/src/hooks/fields-after-create.ts deleted file mode 100644 index 715917a2a2fe766f58153fa217560df90b80f634..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/fields-after-create.ts +++ /dev/null @@ -1,21 +0,0 @@ -import FieldModel from '../models/field'; -import { BELONGSTO, BELONGSTOMANY, HASMANY } from '@nocobase/database'; - -export default async function (model: FieldModel, options: any = {}) { - const { migrate = true } = options; - const Collection = model.database.getModel('collections'); - if (model.get('interface') === 'subTable') { - const target = model.get('target'); - if (target && !model.database.isDefined(target)) { - await Collection.import({ - name: target, - internal: true, - developerMode: true, - }, options); - } - } - if (migrate) { - await model.migrate(options); - } - await model.generatePairField(options); -} diff --git a/packages/plugin-collections/src/hooks/fields-after-update.ts b/packages/plugin-collections/src/hooks/fields-after-update.ts deleted file mode 100644 index b5c44eb6449b97f83376d8a7ef1bb987b9f5ef69..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/fields-after-update.ts +++ /dev/null @@ -1,9 +0,0 @@ -import FieldModel from '../models/field'; - -export default async function (model: FieldModel, options: any = {}) { - const { migrate = true } = options; - if (migrate) { - await model.migrate(options); - } - await model.generatePairField(options); -} diff --git a/packages/plugin-collections/src/hooks/fields-before-validate.ts b/packages/plugin-collections/src/hooks/fields-before-validate.ts deleted file mode 100644 index b986a59dc2b84536d7e80d66799d31cb33d7b81b..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/fields-before-validate.ts +++ /dev/null @@ -1,27 +0,0 @@ -import FieldModel, { generateValueName } from '../models/field'; -import _ from 'lodash'; - -export default async function (model: FieldModel, options) { - // 生成随机 name 要放最后 - // model.generateNameIfNull(); - // 如果 collection_name 不存在 - if (!model.get('collection_name') && model.get('parent_id')) { - const parent = await model.getParent({ - ...options, - }); - const target = parent.get('target'); - if (target) { - model.set('collection_name', target); - } - } - - const dataSource = model.get('dataSource'); - if (Array.isArray(dataSource)) { - model.set('dataSource', dataSource.map(item => { - if (item.value === null || typeof item.value === 'undefined') { - item.value = generateValueName(); - } - return { ...item }; - })); - } -} diff --git a/packages/plugin-collections/src/hooks/generateName.ts b/packages/plugin-collections/src/hooks/generateName.ts deleted file mode 100644 index 9e9f47cc2662100a30175f93c5fe6374c2e54770..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/generateName.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { BaseModel } from '../models'; - -export default async function (model: BaseModel) { - model.generateNameIfNull(); -} diff --git a/packages/plugin-collections/src/hooks/index.ts b/packages/plugin-collections/src/hooks/index.ts deleted file mode 100644 index 7bec49083da6a473520d6677d7846760e7741f10..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/hooks/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import collectionsBeforeValidate from './collections-before-validate'; -import collectionsAfterCreate from './collections-after-create'; -import collectionsAfterUpdate from './collections-after-update'; - -import fieldsBeforeValidate from './fields-before-validate'; -import fieldsAfterCreate from './fields-after-create'; -import fieldsAfterBulkUpdate from './fields-after-bulk-update'; -import fieldsAfterUpdate from './fields-after-update'; - -import generateName from './generateName'; - -export default { - collections: { - beforeValidate: collectionsBeforeValidate, - afterCreate: collectionsAfterCreate, - afterUpdate: collectionsAfterUpdate, - }, - fields: { - beforeValidate: fieldsBeforeValidate, - afterCreate: fieldsAfterCreate, - afterUpdate: fieldsAfterUpdate, - afterBulkUpdate: fieldsAfterBulkUpdate, - }, - actions: { - beforeValidate: generateName - }, - views: { - beforeValidate: generateName - }, - tabs: { - beforeValidate: generateName - }, -}; diff --git a/packages/plugin-collections/src/interfaces/index.ts b/packages/plugin-collections/src/interfaces/index.ts deleted file mode 100644 index 9909dd66a215a393fe1a50d7904f832edb14af7a..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/interfaces/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * 考虑到 Interface 的参数模板还不固定,暂时先放这里了,便于后续修改 - */ -import * as types from './types'; -export * as types from './types'; - -export const groupLabelMap = { - basic: '基本类型', - media: '多媒体类型', - choices: '选择类型', - datetime: '日期和时间', - relation: '关系类型', - systemInfo: '关系类型', - developerMode: '开发者模式', - others: '其他' -}; - -export function getOptions() { - return Object.keys(groupLabelMap).map(key => ({ - key, - label: groupLabelMap[key], - children: Object.values(types) - .filter(type => type['group'] === key) - .map(type => ({ - label: type.title, - value: type.options.interface, - // TODO(draft): 配置信息一并存到数据库方便字段配置时取出参与联动计算 - // properties: type.properties, - disabled: type['disabled'], - })) - })); -} - -export type interfaceType = { - title: string, - group?: string, - options: { - [key: string]: any - }, - disabled?: boolean -}; - -// TODO(draft) -// 目前仅在内存中注册,应用启动时需要解决扩展字段读取并注册到内存 -export function register(type: interfaceType) { - types[type.options.interface] = type; -} diff --git a/packages/plugin-collections/src/interfaces/types.ts b/packages/plugin-collections/src/interfaces/types.ts deleted file mode 100644 index 14ed285cf00a2ccb09e0a2da9f0122fd93acfe7b..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/interfaces/types.ts +++ /dev/null @@ -1,638 +0,0 @@ -// merge:interface 模板,旧数据,用户数据 -// TODO: 删除的情况怎么处理 -// 联动的原则:尽量减少干预,尤其是尽量少改动 type,type 兼容 -// 参数的优先级: -// 1、interface,type 尽量只随 interface 变动,而不受别的字段影响(特殊情况除外) -// 2、 -// TODO: interface 的修改 -export const string = { - title: '单行文本', - group: 'basic', - options: { - interface: 'string', - type: 'string', - filterable: true, - component: { - type: 'string', - }, - }, -}; - -export const textarea = { - title: '多行文本', - group: 'basic', - options: { - interface: 'textarea', - type: 'text', - filterable: true, - component: { - type: 'textarea', - }, - } -}; - -export const phone = { - title: '手机号码', - group: 'basic', - options: { - interface: 'phone', - type: 'string', - filterable: true, - format: 'phone', // 验证的问题 - component: { - type: 'string', - 'x-rules': 'phone', - }, - }, -}; - -export const email = { - title: '邮箱', - group: 'basic', - options: { - interface: 'email', - type: 'string', - filterable: true, - format: 'email', - component: { - type: 'string', - 'x-rules': 'email', - }, - }, -}; - -/** - * 通过 precision 控制精确度 - */ -export const number = { - title: '数字', - group: 'basic', - options: { - interface: 'number', - type: 'float', - filterable: true, - sortable: true, - precision: 0, // 需要考虑 - component: { - type: 'number', - }, - } -}; - -/** - * 通过 precision 控制精确度 - * 百分比转化是前端处理还是后端处理 - */ -export const percent = { - title: '百分比', - group: 'basic', - options: { - interface: 'percent', - type: 'float', - filterable: true, - sortable: true, - precision: 0, - component: { - type: 'percent', - }, - }, -}; - -export const markdown = { - title: 'Markdown', - group: 'media', - options: { - interface: 'markdown', - type: 'json', - component: { - type: 'markdown', - }, - }, -}; - -export const wysiwyg = { - title: '可视化编辑器', - group: 'media', - disabled: true, - options: { - interface: 'wysiwyg', - type: 'json', - component: { - type: 'wysiwyg', - }, - }, -}; - -/** - * 特殊的关系字段 - */ -export const attachment = { - title: '附件', - group: 'media', - // disabled: true, - options: { - interface: 'attachment', - type: 'belongsToMany', - filterable: false, - target: 'attachments', - // storage: { - // name: 'local', - // }, - component: { - type: 'upload', - }, - }, -}; - -/** - * - */ -export const select = { - title: '下拉选择(单选)', - group: 'choices', - options: { - interface: 'select', - type: 'string', - filterable: true, - dataSource: [], - component: { - type: 'select', - }, - }, -}; - -/** - * type 怎么处理 - * 暂时 json 处理 - * 后续:扩展 type=array 的字段 - * array 的情况怎么兼容 - * filter 要处理 - * 不能处理 json 搜索的数据库可以用 hasMany 转化 - * - * 思考:🤔 如果 select合并成一个 interface,multiple 会影响 type - */ -export const multipleSelect = { - title: '下拉选择(多选)', - group: 'choices', - options: { - interface: 'multipleSelect', - type: 'json', // json 过滤 - filterable: true, - dataSource: [], - defaultValue: [], - multiple: true, // 需要重点考虑 - component: { - type: 'select', - }, - }, -}; - -export const radio = { - title: '单选框', - group: 'choices', - options: { - interface: 'radio', - type: 'string', - filterable: true, - dataSource: [], - component: { - type: 'radio', - }, - }, -}; - -export const checkboxes = { - title: '多选框', - group: 'choices', - options: { - interface: 'checkboxes', - type: 'json', - filterable: true, - dataSource: [], - defaultValue: [], - component: { - type: 'checkboxes', - }, - }, -}; - -export const boolean = { - title: '是/否', - group: 'choices', - options: { - interface: 'boolean', - type: 'boolean', - filterable: true, - component: { - type: 'checkbox', // switch - }, - }, -}; - -/** - * dateonly 要不要变 type - * 如果是 dateonly 时间怎么办? - */ -export const datetime = { - title: '日期', - group: 'datetime', - options: { - interface: 'datetime', - type: 'date', - showTime: false, - filterable: true, - sortable: true, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - component: { - type: 'date', - }, - }, - // TODO(draft): 配置参数的一种描述方式 - // properties: [ - // { - // name: 'showTime', - // title: '显示时间', - // interface: 'boolean', - // component: { - // 'x-linkages': [ - // { - // type: 'value:visible', - // target: 'timeFormat', - // condition: '{{ $value }}' - // } - // ] - // } - // }, - // { - // interface: 'string', - // name: 'timeFormat', - // title: '时间格式', - // filterable: false - // } - // ] -}; - -export const time = { - title: '时间', - group: 'datetime', - options: { - interface: 'time', - type: 'time', - filterable: true, - sortable: true, - timeFormat: 'HH:mm:ss', - component: { - type: 'time', - }, - }, -}; - -/** - * 重点: - * 初始化子表和子字段 - * hasMany 相关的设置参数 - * fields 是子字段 - * - * 分组字段 - virtual:不考虑字段分组 - * 子表格 - hasMany - * - 子字段只属于子表格字段关联的表(target),不属于当前表(source) - */ -// database.table({ -// name: 'tablename', -// fields: [ -// { -// type: 'hasMany', -// name: 'foos', -// target: 'foos', -// fields: [ -// { -// type: 'string', -// name: 'xxx', -// } -// ], -// } -// ], -// }); -// database.table({ -// name: 'foos', -// fields: [ -// { -// type: 'string', -// name: 'xxx', -// } -// ], -// }); -export const subTable = { - title: '子表格', - group: 'relation', - // disabled: true, - options: { - interface: 'subTable', - type: 'hasMany', - // fields: [], - component: { - type: 'subTable', - }, - }, -}; - -/** - * 尽量减少更新 multiple 造成的影响 - * 同步生成配对的关系字段 - * - * 只传 name 没有 target,可以通过 addField 处理,找到 target - * 没有 name 但是有 target,name 随机生成 - * 有 name 也有 target - */ - -// database.table({ -// name: 'foos', -// fields: [ -// { -// type: 'hasMany', -// name: 'bars', -// // target: 'bars', -// // sourceKey: 'id', -// // foreignKey: 'foo_id', -// }, -// { -// type: 'hasMany', -// name: 'xxxxx', // 如果没有随机生成 -// target: 'bars', -// // sourceKey: 'id', -// // foreignKey: 'foo_id', -// }, -// { -// type: 'hasMany', -// name: 'xxxxx', // 如果没有随机生成 -// target: 'bars', -// sourceKey: 'id', -// foreignKey: 'foo_id', -// } -// ], -// }); - -// const field = table.addField({ -// type: 'hasMany', -// name: 'xxx', // xxx -// }); - -export const linkTo = { - title: '关联数据', - group: 'relation', - // disabled: true, - options: { - interface: 'linkTo', - multiple: true, // 可能影响 type - paired: false, - type: 'belongsToMany', - // name, - // target: '关联表', // 用户会输入 - filterable: false, - component: { - type: 'drawerSelect', - }, - }, -}; - -export const createdAt = { - title: '创建时间', - group: 'systemInfo', - options: { - interface: 'createdAt', - type: 'date', - // name: 'created_at', - field: 'created_at', - showTime: false, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - required: true, - filterable: true, - sortable: true, - component: { - type: 'date', - }, - }, -}; - -export const updatedAt = { - title: '修改时间', - group: 'systemInfo', - options: { - interface: 'updatedAt', - type: 'date', - // name: 'updated_at', - field: 'updated_at', - showTime: false, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - required: true, - filterable: true, - sortable: true, - component: { - type: 'date', - }, - }, -}; - -export const createdBy = { - title: '创建人', - group: 'systemInfo', - // disabled: true, - options: { - interface: 'createdBy', - type: 'createdBy', - // name: 'createdBy', - // filterable: true, - target: 'users', - labelField: 'nickname', - foreignKey: 'created_by_id', - appends: true, - component: { - type: 'drawerSelect', - }, - }, -}; - -export const updatedBy = { - title: '修改人', - group: 'systemInfo', - // disabled: true, - options: { - interface: 'updatedBy', - // name: 'updatedBy', - type: 'updatedBy', - // filterable: true, - target: 'users', - labelField: 'nickname', - foreignKey: 'updated_by_id', - appends: true, - component: { - type: 'drawerSelect', - }, - }, -}; - -/** - * 字段分组(暂缓) - * - * 影响数据输出结构,树形结构输出 - */ -export const group = { - title: '字段组', - disabled: true, - options: { - interface: 'group', - // name: 'id', - type: 'virtual', - component: { - type: 'hidden', - }, - }, -}; - -export const status = { - title: '状态', - group: 'others', - options: { - interface: 'status', - name: 'status', - type: 'string', - filterable: true, - // index: true, - dataSource: [ - { - label: '已发布', - value: 'publish', - }, - { - label: '草稿', - value: 'draft', - } - ], - component: { - type: 'select', - }, - }, -} - -export const description = { - title: '说明文字', - group: 'others', - options: { - interface: 'description', - // name: 'id', - type: 'virtual', - component: { - type: 'description', - }, - }, -} - -/** - * 主键(暂缓) - */ -export const primaryKey = { - title: '主键', - group: 'developerMode', - options: { - interface: 'primaryKey', - name: 'id', - type: 'integer', - required: true, - autoIncrement: true, - primaryKey: true, - filterable: true, - developerMode: true, - component: { - type: 'number', - }, - }, -}; - -/** - * 自增长 - * scope 的问题 - */ -export const sort = { - title: '排序', - group: 'developerMode', - options: { - interface: 'sort', - type: 'integer', - required: true, - component: { - type: 'sort', - showInTable: true, - }, - }, -}; - -export const password = { - title: '密码', - group: 'developerMode', - options: { - interface: 'password', - type: 'password', - hidden: true, // hidden 用来控制 api 不输出这个字段,但是可能这个字段显示在表单里 showInForm - component: { - type: 'password', - }, - }, -}; - -export const json = { - title: 'JSON', - group: 'developerMode', - options: { - interface: 'json', - type: 'json', - mode: 'replace', - // developerMode: true, - component: { - type: 'hidden', - }, - }, -}; - -export const icon = { - title: '图标', - group: 'developerMode', - options: { - interface: 'icon', - type: 'string', - component: { - type: 'icon', - }, - }, -}; - -export const chinaRegion = { - title: '中国行政区划', - group: 'choices', - options: { - interface: 'chinaRegion', - type: 'belongsToMany', - // 数据来源的数据表,与 dataSource 不同,需要从表数据加载后转化成 dataSource - target: 'china_regions', - targetKey: 'code', - // 值字段 - // valueField: 'code', - // 名称字段 - labelField: 'name', - // TODO(refactor): 等 toWhere 重构完成后要改成 parent - // 上级字段名 - parentField: 'parent_code', - // 深度限制,默认:-1(代表不控制,即如果是数据表,则无限加载) - // limit: -1, - // 可选层级,默认:-1(代表可选的最深层级) - // maxLevel: null, - // 是否可以不选择到最深一级 - // 'x-component-props': { changeOnSelect: true } - incompletely: false, - component: { - type: 'cascader', - } - } -}; diff --git a/packages/plugin-collections/src/models/action.ts b/packages/plugin-collections/src/models/action.ts deleted file mode 100644 index ffd3c4235c3e158b8785c1b4441581455580043d..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/models/action.ts +++ /dev/null @@ -1,6 +0,0 @@ -import _ from 'lodash'; -import BaseModel from './base'; - -export class ActionModel extends BaseModel { - -} diff --git a/packages/plugin-collections/src/models/base.ts b/packages/plugin-collections/src/models/base.ts deleted file mode 100644 index a6e42652a07cd3cbdc9cb886f7a5535f468512be..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/models/base.ts +++ /dev/null @@ -1,142 +0,0 @@ -import _ from 'lodash'; -import { getDataTypeKey, Model } from '@nocobase/database'; -import { merge } from '../utils'; - -export function generateName(title?: string): string { - return `${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} - -export class BaseModel extends Model { - - generateName() { - this.set('name', generateName()); - } - - generateNameIfNull() { - if (!this.get('name')) { - this.generateName(); - } - } - - get additionalAttribute() { - const tableOptions = this.database.getTable(this.constructor.name).getOptions(); - return _.get(tableOptions, 'additionalAttribute') || 'options'; - } - - hasGetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 get 方法就直接走 get - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.get; - } - return !!attribute; - } - - hasSetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 set 方法就直接走 set - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.set; - } - return !!attribute; - } - - get(key?: any, options?: any) { - if (typeof key === 'string') { - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.get(column, options); - if (path.length) { - return _.get(value, path); - } - return value; - } - return _.get(super.get(this.additionalAttribute, options) || {}, key); - } - const data = super.get(); - return { - ...(data[this.additionalAttribute] || {}), - ..._.omit(data, [this.additionalAttribute]), - }; - } - - getDataValue(key: any) { - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.getDataValue(column); - if (path.length) { - return _.get(value, path); - } - return value; - } - const options = super.getDataValue(this.additionalAttribute) || {}; - return _.get(options, key); - } - - set(key?: any, value?: any, options: any = {}) { - if (typeof key === 'string') { - // 不处理关系数据 - // @ts-ignore - if (_.get(this.constructor.associations, key)) { - return super.set(key, value, options); - } - // 如果是 object 数据,merge 处理 - if (_.isPlainObject(value)) { - // TODO 需要改进 JSON 字段的内部处理逻辑,暂时这里跳过了特殊的 filter 字段 - if (key !== 'filter') { - // console.log(key, value); - // @ts-ignore - value = merge(this.get(key) || {}, value); - } - } - const [column, ...path] = key.split('.'); - if (!options.raw) { - this.changed(column, true); - } - if (this.hasSetAttribute(column)) { - if (!path.length) { - return super.set(key, value, options); - } - const values = this.get(column, options) || {}; - _.set(values, path, value); - return super.set(column, values, options); - } - // 如果未设置 attribute,存到 additionalAttribute 里 - const opts = this.get(this.additionalAttribute, options) || {}; - _.set(opts, key, value); - if (!options.raw) { - this.changed(this.additionalAttribute, true); - } - return super.set(this.additionalAttribute, opts, options); - } - return super.set(key, value, options); - } - - setDataValue(key: any, value: any) { - // 不处理关系数据 - // @ts-ignore - if (_.get(this.constructor.associations, key)) { - return super.setDataValue(key, value); - } - if (_.isPlainObject(value)) { - // @ts-ignore - value = Utils.merge(this.get(key) || {}, value); - } - const [column, ...path] = key.split('.'); - this.changed(column, true); - if (this.hasSetAttribute(column)) { - if (!path.length) { - return super.setDataValue(key, value); - } - const values = this.get(column) || {}; - _.set(values, path, value); - return super.setDataValue(column, values); - } - const opts = this.get(this.additionalAttribute) || {}; - _.set(opts, key, value); - this.changed(this.additionalAttribute, true); - return super.setDataValue(this.additionalAttribute, opts); - } -} - -export default BaseModel; diff --git a/packages/plugin-collections/src/models/collection.ts b/packages/plugin-collections/src/models/collection.ts index ec692dffae6eade2acb39bbd977ceb9224bb679b..1efff41c039cc5943c2dc2aa4b2c10fb68aa881e 100644 --- a/packages/plugin-collections/src/models/collection.ts +++ b/packages/plugin-collections/src/models/collection.ts @@ -1,24 +1,5 @@ import _ from 'lodash'; -import BaseModel from './base'; -import Field from './field'; -import { TableOptions } from '@nocobase/database'; -import { SaveOptions, Op } from 'sequelize'; - -/** - * 生成随机数据库表名 - * - * 策略:暂时使用 3+2 - * 1. 自增 id - * 2. 随机字母 - * 3. 时间戳 - * 4. 转拼音 - * 5. 常见词翻译 - * - * @param title 显示的名称 - */ -export function generateCollectionName(title?: string): string { - return `t_${Date.now().toString(36)}_${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} +import { Model, TableOptions } from '@nocobase/database'; export interface LoadOptions { reset?: boolean; @@ -31,19 +12,53 @@ export interface MigrateOptions { [key: string]: any; } -export class CollectionModel extends BaseModel { +export class Collection extends Model { + static async create(value?: any, options?: any): Promise { + // console.log({ value }); + const attributes = this.toAttributes(value); + // @ts-ignore + const model: Model = await super.create(attributes, options); + return model; + } - generateName() { - this.set('name', generateCollectionName()); + static toAttributes(value = {}): any { + const data = _.cloneDeep(value); + const keys = [ + ...Object.keys(this.rawAttributes), + ...Object.keys(this.associations), + ]; + const attrs = _.pick(data, keys); + const options = _.omit(data, keys); + return { ...attrs, options }; } - /** - * 通过 name 获取 collection - * - * @param name - */ - static async findByName(name: string) { - return this.findOne({ where: { name } }); + async toProps() { + const json = this.toJSON(); + const data: any = _.omit(json, ['options', 'created_at', 'updated_at']); + const options = json['options'] || {}; + const generalFields = await this.getNestedFields({ + where: { + state: 1, + } + }); + const systemFields = await this.getNestedFields({ + where: { + state: 0, + } + }); + return { ...data, ...options, generalFields, systemFields } + } + + async getNestedFields(options) { + const fields = await this.getFields({ + ...options, + order: [['sort', 'asc']], + }); + const items = []; + for (const field of fields) { + items.push(await field.toProps()); + } + return items; } /** @@ -54,33 +69,9 @@ export class CollectionModel extends BaseModel { * @param opts */ async loadTableOptions(opts: any = {}) { - const options = await this.getOptions(); - // const prevTable = this.database.getTable(this.get('name')); - // const prevOptions = prevTable ? prevTable.getOptions() : {}; - // table 是初始化和重新初始化 - const table = this.database.table(options); - // console.log({options, actions: table.getOptions()['actions']}) - - // 如果关系表未加载,一起处理 - // const associationTableNames = []; - // for (const [key, association] of table.getAssociations()) { - // // TODO:是否需要考虑重载的情况?(暂时是跳过处理) - // if (!this.database.isDefined(association.options.target)) { - // continue; - // } - // associationTableNames.push(association.options.target); - // } - // console.log({associationTableNames}); - // if (associationTableNames.length) { - // await CollectionModel.load({ - // ...opts, - // where: { - // name: { - // [Op.in]: associationTableNames, - // } - // } - // }); - // } + const options = await this.toProps(); + const { generalFields = [], systemFields = [], ...others } = options; + const table = this.database.table({ ...others, fields: generalFields.concat(systemFields) }); return table; } @@ -110,30 +101,6 @@ export class CollectionModel extends BaseModel { }); } - async getFieldsOptions() { - const fieldsOptions = []; - const fields = await this.getFields(); - for (const field of fields) { - fieldsOptions.push(await field.getOptions()); - } - return fieldsOptions; - } - - async getOptions(): Promise { - const options: any = { - ...this.get(), - actions: await this.getActions(), - fields: await this.getFieldsOptions(), - } - // @ts-ignore - // console.log(this.constructor.associations); - // @ts-ignore - if (this.constructor.hasAlias('views_v2')) { - options.views_v2 = await this.getViews_v2(); - } - return options; - } - /** * TODO:需要考虑是初次加载还是重载 * @@ -155,87 +122,4 @@ export class CollectionModel extends BaseModel { }); } } - - static async import(data: TableOptions, options: SaveOptions = {}): Promise { - data = _.cloneDeep(data); - // @ts-ignore - const { update } = options; - let collection: CollectionModel; - if (data.name) { - collection = await this.findOne({ - ...options, - where: { - name: data.name, - }, - }); - } - if (collection) { - // @ts-ignore - await collection.update(data, options); - } - if (!collection) { - // @ts-ignore - collection = await this.create(data, options); - } - - const associations = ['fields', 'actions', 'views_v2']; - for (const key of associations) { - if (!Array.isArray(data[key])) { - continue; - } - const Model = this.database.getModel(key); - if (!Model) { - continue; - } - let ids = []; - for (const index in data[key]) { - if (key === 'fields') { - ids = await Model.import(data[key], { - ...options, - collectionName: collection.name, - }); - continue; - } - let model; - const item = data[key][index]; - if (item.name) { - model = await Model.findOne({ - ...options, - where: { - collection_name: collection.name, - name: item.name, - }, - }); - } - if (model) { - await model.update({ - ...item, - // sort: index+1 - }, options); - } - if (!model) { - model = await Model.create( - { - ...item, - // sort: index+1, - collection_name: collection.name, - }, - // @ts-ignore - options - ); - } - if (model) { - ids.push(model.id); - } - } - if (ids.length && collection.get('internal')) { - await collection.updateAssociations({ - [key]: ids, - }); - } - } - return collection; - } } - -export default CollectionModel; diff --git a/packages/plugin-collections/src/models/field.ts b/packages/plugin-collections/src/models/field.ts index dc4271b46c60edf345fba2c63a485c1af7a43e08..3cb750e2b75774071f47daaeaa0eed48f675fe0d 100644 --- a/packages/plugin-collections/src/models/field.ts +++ b/packages/plugin-collections/src/models/field.ts @@ -1,263 +1,108 @@ import _ from 'lodash'; -import BaseModel from './base'; -import { FieldOptions, BELONGSTO, BELONGSTOMANY, HASMANY } from '@nocobase/database'; -import * as types from '../interfaces/types'; -import { merge } from '../utils'; -import { BuildOptions } from 'sequelize'; -import { SaveOptions, Utils } from 'sequelize'; -import { generateCollectionName } from './collection'; +import { Model } from '@nocobase/database'; -interface FieldImportOptions extends SaveOptions { - parentId?: number; - collectionName?: string; -} - -export function generateValueName(title?: string): string { - return `${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} - -export function generateFieldName(title?: string): string { - return `f_${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} - -export class FieldModel extends BaseModel { - - constructor(values: any = {}, options: any = {}) { - let data = { - ...(values.options || {}), - ...values, - // ..._.omit(values, 'options'), - }; - const interfaceType = data.interface; - if (interfaceType) { - const { options } = types[interfaceType]; - let args = [options, data]; - // @ts-ignore - data = merge(...args); - if (['hasOne', 'hasMany', 'belongsTo', 'belongsToMany'].includes(data.type)) { - // 关系字段如果没有 name,相关参数都随机生成 - if (!data.name) { - data.name = generateFieldName(); - data.paired = true; - // 通用,关系表 - if (!data.target) { - data.target = generateCollectionName(); - } - // 通用,外键 - if (!data.foreignKey) { - data.foreignKey = generateFieldName(); - } - if (data.type !== 'belongsTo' && !data.sourceKey) { - data.sourceKey = 'id'; - } - if (['belongsTo', 'belongsToMany'].includes(data.type) && !data.targetKey) { - data.targetKey = 'id'; - } - // 多对多关联 - if (data.type === 'belongsToMany') { - if (!data.through) { - data.through = generateCollectionName(); - } - if (!data.otherKey) { - data.otherKey = generateFieldName(); - } - } - } - // 有 name,但是没有 target - if (!data.target) { - data.target = ['hasOne', 'belongsTo'].includes(data.type) ? Utils.pluralize(data.name) : data.name; - } - } - if (!data.name) { - data.name = generateFieldName(); - } - } +export class Field extends Model { + static async create(value?: any, options?: any): Promise { + const attributes = this.toAttributes(value); // @ts-ignore - super(data, options); + const model: Model = await super.create(attributes, options); + return model; } - generateName() { - this.set('name', generateFieldName()); + static toAttributes(value = {}): any { + const data: any = _.cloneDeep(value); + const keys = [ + ...Object.keys(this.rawAttributes), + ...Object.keys(this.associations), + ]; + if (!data.dataType && data.type) { + data.dataType = data.type; + } + const attrs = _.pick(data, keys); + const options = _.omit(data, [...keys, 'type']); + return { ...attrs, options }; } - async generatePairField(options) { - const { interface: control, paired, type, target, sourceKey, targetKey, foreignKey, otherKey, through, collection_name } = this.get(); - if (control !== 'linkTo' || type !== 'belongsToMany' || !collection_name || !paired) { - return; - } - if (!this.database.isDefined(target)) { - return; - } - const targetTable = this.database.getTable(target); - const Field = FieldModel; - let labelField = 'id'; - const targetField = await Field.findOne({ - ...options, - where: { - type: 'string', - collection_name: target, - }, - order: [['sort', 'asc']], - }); - if (targetField) { - labelField = targetField.get('name'); + async toProps() { + const json = this.toJSON(); + const data: any = _.omit(json, ['options', 'created_at', 'updated_at']); + const options = json['options'] || {}; + const fields = await this.getNestedFields(); + const props = { type: json['dataType'], ...data, ...options }; + if (fields.length) { + props['children'] = fields; } - const collection = await this.getCollection(options); - let targetOptions: any = { - ...types.linkTo.options, - interface: 'linkTo', - title: collection.get('title'), - collection_name: target, - options: { - paired: true, - target: collection_name, - labelField, - }, - component: { - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }; - // 暂时不处理 hasone - switch (type) { - case 'hasMany': - targetOptions.type = 'belongsTo'; - targetOptions.options.targetKey = sourceKey; - targetOptions.options.foreignKey = foreignKey; - break; - case 'belongsTo': - targetOptions.type = 'hasMany'; - targetOptions.options.sourceKey = targetKey; - targetOptions.options.foreignKey = foreignKey; - break; - case 'belongsToMany': - targetOptions.type = 'belongsToMany'; - targetOptions.options.sourceKey = targetKey; - targetOptions.options.foreignKey = otherKey; - targetOptions.options.targetKey = sourceKey; - targetOptions.options.otherKey = foreignKey; - targetOptions.options.through = through; - break; - } - const associations = targetTable.getAssociations(); - // console.log(associations); - for (const association of associations.values()) { - if (association instanceof BELONGSTOMANY) { - if ( - association.options.foreignKey === otherKey - && association.options.sourceKey === targetKey - && association.options.otherKey === foreignKey - && association.options.targetKey === sourceKey - && association.options.through === through - ) { - return; - } + if (this.getUiSchema) { + const uiSchema = await this.getUiSchema(); + if (uiSchema) { + // props['uiSchema1'] = uiSchema; + props['uiSchema'] = await uiSchema.toJSONSchema(); } - // if (association instanceof BELONGSTO) { - // continue; - // } - // if (association instanceof HASMANY) { - // continue; - // } } - const f = await Field.create(targetOptions, options); - // console.log({targetOptions}, f.get('options')); + return props; } - setInterface(value) { - const { options } = types[value]; - let args = []; - // 如果是新数据或 interface 不相等,interface options 放后 - if (this.isNewRecord || this.get('interface') !== value) { - args = [this.get(), options]; - } else { - // 已存在的数据更新,不相等,interface options 放前面 - args = [options, this.get()]; - } - // @ts-ignore - const values = merge(...args); - this.set(values); + async migrate() { + const collection = await this.getCollection(); + await collection.migrate() } - async getOptions(): Promise { - return this.get(); + async getNestedFields() { + const fields = await this.getChildren(); + const items = []; + for (const field of fields) { + items.push(await field.toProps()); + } + return items; } - async migrate(options: any = {}) { - const collectionName = this.get('collection_name'); - if (!collectionName) { - return false; + async generateReverseField(opts: any = {}) { + const { migrate = true } = opts; + if (this.get('interface') !== 'linkTo') { + return; } - if (!this.database.isDefined(collectionName)) { - throw new Error(`${collectionName} is not defined`); + if (this.get('reverseKey')) { + return; } - const table = this.database.getTable(collectionName); - table.addField(await this.getOptions()); - await table.sync({ - force: false, - alter: { - drop: false, - } + const fieldCollection = await this.getCollection(); + const options: any = this.get('options') || {}; + const Collection = this.database.getModel('collections'); + let collection = await Collection.findOne({ + where: { + name: options.target, + }, }); - } - - static async import(items: any, options: FieldImportOptions = {}): Promise { - const { parentId, collectionName } = options; - if (!Array.isArray(items)) { - items = [items]; + if (!collection) { + return; } - const ids = []; - for (const index in items) { - const item = items[index]; - let model; - const where: any = {}; - if (parentId) { - where.parent_id = parentId - } else { - where.collection_name = collectionName; - } - if (item.name) { - model = await this.findOne({ - ...options, - where: { - ...where, - name: item.name, - }, - }); - } - if (!model) { - const tmp: any = {}; - if (parentId) { - tmp.parent_id = parentId - } else { - tmp.collection_name = collectionName; - } - model = await this.create( - { - ...item, - ...tmp, - }, - //@ts-ignore - options - ); - } else { - //@ts-ignore - await model.update(item, options); - } - if (Array.isArray(item.children)) { - const childrenIds = await this.import(item.children, { - ...options, - parentId: model.id, - collectionName, - }); - await model.updateAssociations({ - children: childrenIds, - }, options); + const reverseField = await collection.createField({ + interface: 'linkTo', + dataType: 'belongsToMany', + through: options.through, + foreignKey: options.otherKey, + otherKey: options.foreignKey, + sourceKey: options.targetKey, + targetKey: options.sourceKey, + target: this.get('collection_name'), + reverseKey: this.get('key'), + }); + await reverseField.updateAssociations({ + uiSchema: { + type: 'array', + title: `${fieldCollection?.title}`, + 'x-component': 'Select.Drawer', + 'x-component-props': { + multiple: true, + }, + 'x-decorator': 'FormItem', + 'x-designable-bar': 'Select.Drawer.DesignableBar', } + }); + await this.update({ + reverseKey: reverseField.key, + }); + if (migrate) { + await collection.migrate(); } - return ids; } } - -export default FieldModel; diff --git a/packages/plugin-collections/src/models/index.ts b/packages/plugin-collections/src/models/index.ts index 91a4aef21bf52af4c36210b6b5f941904119b435..730a3dd28ef517ebd88c35743e819acfa964654f 100644 --- a/packages/plugin-collections/src/models/index.ts +++ b/packages/plugin-collections/src/models/index.ts @@ -1,7 +1,2 @@ -export * from './base'; -export * from './action'; export * from './collection'; export * from './field'; -export * from './tab'; -export * from './view'; -export * from './page'; diff --git a/packages/plugin-collections/src/models/page.ts b/packages/plugin-collections/src/models/page.ts deleted file mode 100644 index 4daea6999a89733484c5b3d1e6e0f9efee1012fd..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/models/page.ts +++ /dev/null @@ -1,43 +0,0 @@ -import _ from 'lodash'; -import BaseModel from './base'; -import { SaveOptions, Op } from 'sequelize'; - -interface PageImportOptions extends SaveOptions { - parentId?: number; -} - -/** - * 暂时放在这里 - */ -export class PageModel extends BaseModel { - static async import(items: any, options: PageImportOptions = {}): Promise { - const { parentId } = options; - if (!Array.isArray(items)) { - items = [items]; - } - for (const item of items) { - let page = await this.findOne({ - ...options, - where: { - path: item.path, - }, - }); - if (!page) { - page = await this.create( - { - ...item, - parent_id: parentId, - }, - // @ts-ignore - options - ); - } - if (Array.isArray(item.children)) { - await this.import(item.children, { - ...options, - parentId: page.id, - }); - } - } - } -} diff --git a/packages/plugin-collections/src/models/tab.ts b/packages/plugin-collections/src/models/tab.ts deleted file mode 100644 index e3e2df77406814dcd0df94da4597bdbfa3bed715..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/models/tab.ts +++ /dev/null @@ -1,6 +0,0 @@ -import _ from 'lodash'; -import BaseModel from './base'; - -export class TabModel extends BaseModel { - -} diff --git a/packages/plugin-collections/src/models/view.ts b/packages/plugin-collections/src/models/view.ts deleted file mode 100644 index 4822adbb41cd83c2c87987c1ad4c623c2c2bb167..0000000000000000000000000000000000000000 --- a/packages/plugin-collections/src/models/view.ts +++ /dev/null @@ -1,6 +0,0 @@ -import _ from 'lodash'; -import BaseModel from './base'; - -export class ViewModel extends BaseModel { - -} diff --git a/packages/plugin-collections/src/server.ts b/packages/plugin-collections/src/server.ts index 82e94e24f9f5cf53bf8acf4aa78e5061fa684b91..80745a50c45ed6cf338b9133bf45c64836502db0 100644 --- a/packages/plugin-collections/src/server.ts +++ b/packages/plugin-collections/src/server.ts @@ -1,77 +1,134 @@ import path from 'path'; -import { Application } from '@nocobase/server'; -import hooks from './hooks'; -import { registerModels, Table } from '@nocobase/database'; +import { Plugin } from '@nocobase/server'; +import { registerModels, Table, uid } from '@nocobase/database'; import * as models from './models'; +import { createOrUpdate, findAll } from './actions'; +import { create } from './actions/fields'; -export default async function (this: Application, options = {}) { - const database = this.database; - const resourcer = this.resourcer; - // 提供全局的 models 注册机制 - registerModels(models); +registerModels(models); - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); +export default { + name: 'collections', + async load(this: Plugin) { + const database = this.app.db; - database.addHook('afterUpdateAssociations', async function (model, options) { - if (model instanceof models.FieldModel) { - if (model.get('interface') === 'subTable') { - const { migrate = true } = options; - const Collection = model.database.getModel('collections'); - await Collection.load({ ...options, where: { name: model.get('collection_name') } }); - migrate && await model.migrate(options); - } - } - }); + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); - Object.keys(hooks).forEach(modelName => { - const Model = database.getModel(modelName); - Object.keys(hooks[modelName]).forEach(hookKey => { - // TODO(types): 多层 map 映射类型定义较为复杂,暂时忽略 - // @ts-ignore - Model.addHook(hookKey, hooks[modelName][hookKey]); + this.app.on('beforeStart', async () => { + await database.getModel('collections').load({ + skipExisting: true, + }); + }); + + this.app.on('db.init', async () => { + const tableNames = ['users', 'applications']; + const Collection = database.getModel('collections'); + for (const tableName of tableNames) { + const table = database.getTable(tableName); + if (!table) { + continue; + } + const config = table.getOptions(); + const collection = await Collection.create(config); + // 把当前系统排序字段,排除掉,不写入fields表 + const fields = config.fields?.filter((field) => field.type !== 'sort'); + await collection.updateAssociations({ + generalFields: fields.filter((field) => field.state !== 0), + systemFields: fields.filter((field) => field.state === 0), + }); + // await collection.migrate(); + } }); - }); - const Collection = database.getModel('collections'); - Collection.addHook('afterCreate', async (model: any, options) => { - if (model.get('developerMode')) { - return; - } + const [Collection, Field] = database.getModels(['collections', 'fields']); - if (model.get('statusable') === false) { - return; - } + database.on('fields.beforeCreate', async (model) => { + if (!model.get('name')) { + model.set('name', model.get('key')); + } + if (!model.get('collection_name') && model.get('parentKey')) { + const field = await Field.findByPk(model.get('parentKey')); + if (field) { + const { target } = field.get('options') || {}; + if (target) { + model.set('collection_name', target); + } + } + } + }); - console.log("model.get('developerMode')", model.get('name')); + database.on('fields.beforeUpdate', async (model) => { + console.log('beforeUpdate', model.key); + if (!model.get('collection_name') && model.get('parentKey')) { + const field = await Field.findByPk(model.get('parentKey')); + if (field) { + const { target } = field.get('options') || {}; + if (target) { + model.set('collection_name', target); + } + } + } + }); - const { transaction = await model.sequelize.transaction() } = options; + database.on('fields.afterCreate', async (model) => { + console.log('afterCreate', model.key, model.get('collection_name')); + if (model.get('interface') !== 'subTable') { + return; + } + const { target } = model.get('options') || {}; + // const uiSchemaKey = model.get('ui_schema_key'); + // console.log({ uiSchemaKey }) + try { + let collection = await Collection.findOne({ + where: { + name: target, + }, + }); + if (!collection) { + collection = await Collection.create({ + name: target, + // ui_schema_key: uiSchemaKey, + }); + } + await collection.migrate(); + } catch (error) { + throw error; + } + }); - await model.createField({ - interface: 'radio', - name: 'status', - type: 'string', - filterable: true, - title: '状态', - // index: true, - dataSource: [ - { - label: '已发布', - value: 'publish', - }, - { - label: '草稿', - value: 'draft', + database.on('fields.afterUpdate', async (model) => { + console.log('afterUpdate'); + if (model.get('interface') !== 'subTable') { + return; + } + const { target } = model.get('options') || {}; + try { + let collection = await Collection.findOne({ + where: { + name: target, + }, + }); + if (!collection) { + collection = await Collection.create({ + name: target, + }); } - ], - component: { - type: 'radio', - }, - }, { transaction }); + // if (model.get('ui_schema_key')) { + // collection.set('ui_schema_key', model.get('ui_schema_key')); + // await collection.save({ hooks: false }); + // } + await collection.migrate(); + } catch (error) { + throw error; + } + }); - if (!options.transaction) { - await transaction.commit(); - } - }); -} + this.app.resourcer.registerActionHandler('collections.fields:create', create); + this.app.resourcer.registerActionHandler('collections:findAll', findAll); + this.app.resourcer.registerActionHandler('collections:createOrUpdate', createOrUpdate); + this.app.resourcer.registerActionHandler('fields:create', create); + this.app.resourcer.registerActionHandler('collections:create', createOrUpdate); + }, +}; diff --git a/packages/plugin-export/package.json b/packages/plugin-export/package.json index c737c1623abeb0800ef3668bdfd7ef87327556b2..ac989a3db0291b2174171d4335dcd085f16e694c 100644 --- a/packages/plugin-export/package.json +++ b/packages/plugin-export/package.json @@ -1,19 +1,14 @@ { "name": "@nocobase/plugin-export", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", - "devDependencies": { - "@types/node-xlsx": "^0.15.1" - }, "dependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", + "@nocobase/server": "^0.5.0-alpha.25", "node-xlsx": "^0.16.1" }, - "peerDependencies": { - "@nocobase/plugin-collections": "*", - "@nocobase/plugin-permissions": "*" - } + "devDependencies": { + "@types/node-xlsx": "^0.15.1" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-export/src/actions/export.ts b/packages/plugin-export/src/actions/export.ts index ae4509757797cc6140dc218ebc50b6d2db26a0c1..f7852b8418c68120407968035369b2d44e9223bc 100644 --- a/packages/plugin-export/src/actions/export.ts +++ b/packages/plugin-export/src/actions/export.ts @@ -1,9 +1,19 @@ import xlsx from 'node-xlsx'; -import { actions } from '@nocobase/actions'; +import { actions, Context, Next } from '@nocobase/actions'; import render from '../renders'; -async function _export(ctx, next) { - await actions.common.list(ctx, async () => { +async function _export(ctx: Context, next: Next) { + let { columns } = ctx.action.params; + if (typeof columns === 'string') { + columns = JSON.parse(columns); + } + ctx.action.mergeParams({ + 'fields[appends]': columns.map((column: any) => column.name).join(','), + }, { + payload: 'replace', + }); + console.log({ columns }); + await actions.list(ctx, async () => { const { db, action: { @@ -17,13 +27,23 @@ async function _export(ctx, next) { const table = db.getTable(resourceName); const tableOptions = table.getOptions(); - const fields = body.rows.length + let fields = body.rows.length ? Object.keys(body.rows[0].get()) .map(key => tableOptions.fields.find(({ name }) => name === key)) .filter(item => item && !item.developerMode) .sort((a, b) => a.sort - b.sort) : []; + if (columns && columns.length) { + fields = columns.map(column => { + const field = table.getField(column.name); + return { + ...field.options, + ...column, + }; + }); + } + const { rows, ranges } = render({ fields, data: body.rows @@ -40,7 +60,7 @@ async function _export(ctx, next) { ctx.set({ 'Content-Type': 'application/octet-stream', // to avoid "invalid character" error in header (RFC) - 'Content-Disposition': `attachment; filename=${encodeURI(tableOptions.title)}.xlsx` + 'Content-Disposition': `attachment; filename=${encodeURI(tableOptions.title||tableOptions.name)}.xlsx` }); }); diff --git a/packages/plugin-export/src/server.ts b/packages/plugin-export/src/server.ts index 42c4db145424a15a207d36cd9221a31bad2f8317..558f771d7d552244181da6eabf5742e63e3ead75 100644 --- a/packages/plugin-export/src/server.ts +++ b/packages/plugin-export/src/server.ts @@ -1,28 +1,29 @@ -import Resourcer from '@nocobase/resourcer'; +import { PluginOptions } from '@nocobase/server'; import _export from './actions/export'; export const ACTION_NAME_EXPORT = 'export'; -export default async function (options = {}) { - const resourcer: Resourcer = this.resourcer; - - resourcer.registerActionHandler(ACTION_NAME_EXPORT, _export); - - // TODO(temp): 继承 list 权限的临时写法 - resourcer.use(async (ctx, next) => { - if (ctx.action.params.actionName === ACTION_NAME_EXPORT) { - ctx.action.mergeParams({ - actionName: 'list' - }); - - console.log('action name in export has been rewritten to:', ctx.action.params.actionName); - - const permissionPlugin = ctx.app.getPluginInstance('@nocobase/plugin-permissions'); - if (permissionPlugin) { - return permissionPlugin.middleware(ctx, next); - } - } - - await next(); - }); -} +export default { + name: 'export', + async load() { + const resourcer = this.app.resourcer; + resourcer.registerActionHandler(ACTION_NAME_EXPORT, _export); + // // TODO(temp): 继承 list 权限的临时写法 + // resourcer.use(async (ctx, next) => { + // if (ctx.action.params.actionName === ACTION_NAME_EXPORT) { + // ctx.action.mergeParams({ + // actionName: 'list' + // }); + + // console.log('action name in export has been rewritten to:', ctx.action.params.actionName); + + // const permissionPlugin = ctx.app.getPluginInstance('@nocobase/plugin-permissions'); + // if (permissionPlugin) { + // return permissionPlugin.middleware(ctx, next); + // } + // } + + // await next(); + // }); + } +} as PluginOptions; diff --git a/packages/plugin-file-manager/package.json b/packages/plugin-file-manager/package.json index b8ba3d58acc33b90dd82e8ad52fdfd5a894b4f4b..f7701e6ac1691e7a2c23459dbfbcd2c782cd6de9 100644 --- a/packages/plugin-file-manager/package.json +++ b/packages/plugin-file-manager/package.json @@ -1,23 +1,20 @@ { "name": "@nocobase/plugin-file-manager", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", "dependencies": { "@koa/multer": "^3.0.0", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", - "@types/multer": "^1.4.5", + "@nocobase/server": "^0.5.0-alpha.25", "ali-oss": "^6.12.0", "koa-mount": "^4.0.0", "koa-static": "^5.0.0", "mime-match": "^1.0.2", - "mkdirp": "^1.0.4", "multer": "^1.4.2" }, "devDependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7" + "@nocobase/test": "^0.5.0-alpha.25", + "@types/multer": "^1.4.5" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-file-manager/src/__tests__/action.test.ts b/packages/plugin-file-manager/src/__tests__/action.test.ts index 859382483d2537baa0c9d6150eb231870627db0a..ec183e317890c64328003c537c55cb537dc47680 100644 --- a/packages/plugin-file-manager/src/__tests__/action.test.ts +++ b/packages/plugin-file-manager/src/__tests__/action.test.ts @@ -16,9 +16,9 @@ describe('action', () => { app = await getApp(); agent = getAgent(app); api = getAPI(app); - db = app.database; + db = app.db; - const Storage = app.database.getModel('storages'); + const Storage = app.db.getModel('storages'); await Storage.create({ name: `local_${Date.now().toString(36)}`, type: STORAGE_TYPE_LOCAL, diff --git a/packages/plugin-file-manager/src/__tests__/index.ts b/packages/plugin-file-manager/src/__tests__/index.ts index 51933fb1ff82d1f3c452e456e9c547c65c7c068a..b446f4f938c838488d658df5eb26a52ae49e4162 100644 --- a/packages/plugin-file-manager/src/__tests__/index.ts +++ b/packages/plugin-file-manager/src/__tests__/index.ts @@ -67,23 +67,23 @@ export async function getApp() { 'file-manager': [plugin] }); await app.loadPlugins(); - app.database.import({ + app.db.import({ directory: path.resolve(__dirname, './tables') }); try { - await app.database.sync(); + await app.db.sync(); } catch (error) { console.error(error); } app.use(async (ctx, next) => { - ctx.db = app.database; + ctx.db = app.db; await next(); }); app.use(bodyParser()); app.use(middleware({ prefix: '/api', resourcer: app.resourcer, - database: app.database, + database: app.db, })); return app; } diff --git a/packages/plugin-file-manager/src/actions/upload.ts b/packages/plugin-file-manager/src/actions/upload.ts index 0c812feebea0c1c12c4511fcb183c5070d5a68d2..6b29af05cd9ccc6c280aa60560637f93a239209f 100644 --- a/packages/plugin-file-manager/src/actions/upload.ts +++ b/packages/plugin-file-manager/src/actions/upload.ts @@ -1,11 +1,11 @@ import path from 'path'; import multer from '@koa/multer'; -import actions from '@nocobase/actions'; +import { Context, Next } from '@nocobase/actions'; import storageMakers from '../storages'; import * as Rules from '../rules'; import { FILE_FIELD_NAME, LIMIT_FILES, LIMIT_MAX_FILE_SIZE } from '../constants'; -function getRules(ctx: actions.Context) { +function getRules(ctx: Context) { const { resourceField } = ctx.action.params; if (!resourceField) { return ctx.storage.rules; @@ -15,7 +15,7 @@ function getRules(ctx: actions.Context) { } // TODO(optimize): 需要优化错误处理,计算失败后需要抛出对应错误,以便程序处理 -function getFileFilter(ctx: actions.Context) { +function getFileFilter(ctx: Context) { return (req, file, cb) => { // size 交给 limits 处理 const { size, ...rules } = getRules(ctx); @@ -27,7 +27,7 @@ function getFileFilter(ctx: actions.Context) { } } -export async function middleware(ctx: actions.Context, next: actions.Next) { +export async function middleware(ctx: Context, next: Next) { const { resourceName, actionName, resourceField } = ctx.action.params; if (actionName !== 'upload') { return next(); @@ -79,7 +79,7 @@ export async function middleware(ctx: actions.Context, next: actions.Next) { return upload.single(FILE_FIELD_NAME)(ctx, next); }; -export async function action(ctx: actions.Context, next: actions.Next) { +export async function action(ctx: Context, next: Next) { const { [FILE_FIELD_NAME]: file, storage } = ctx; if (!file) { return ctx.throw(400, 'file validation failed'); @@ -93,6 +93,8 @@ export async function action(ctx: actions.Context, next: actions.Next) { // TODO(feature): 暂时两者相同,后面 storage.path 模版化以后,这里只是 file 实际的 path path: storage.path, size: file.size, + // 直接缓存起来 + url: `${storage.baseUrl}${storage.path}/${file.filename}`, mimetype: file.mimetype, // @ts-ignore meta: ctx.request.body @@ -113,7 +115,7 @@ export async function action(ctx: actions.Context, next: actions.Next) { }); // 将存储引擎的信息附在已创建的记录里,节省一次查询 - attachment.setDataValue('storage', storage); + // attachment.setDataValue('storage', storage); ctx.body = attachment; await next(); diff --git a/packages/plugin-file-manager/src/collections/attachments.ts b/packages/plugin-file-manager/src/collections/attachments.ts index fb62593245764bf178d7b727275b68403ac28e51..6da17952ae341e3fb30f22bba209a6bdbbe6fec5 100644 --- a/packages/plugin-file-manager/src/collections/attachments.ts +++ b/packages/plugin-file-manager/src/collections/attachments.ts @@ -3,8 +3,6 @@ import { TableOptions } from '@nocobase/database'; export default { name: 'attachments', title: '文件管理器', - internal: true, - developerMode: true, fields: [ { comment: '用户文件名(不含扩展名)', @@ -54,33 +52,9 @@ export default { }, { comment: '网络访问地址', - type: 'formula', + type: 'string', name: 'url', - formula: '{{ storage.baseUrl }}{{ path }}/{{ filename }}' + // formula: '{{ storage.baseUrl }}{{ path }}/{{ filename }}' } ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], } as TableOptions; diff --git a/packages/plugin-file-manager/src/collections/storages.ts b/packages/plugin-file-manager/src/collections/storages.ts index cb63800eab73fc417358c058c274d982377be8a5..f4dc4f9d4478f0e0dce874ca7a3576c23acf7f59 100644 --- a/packages/plugin-file-manager/src/collections/storages.ts +++ b/packages/plugin-file-manager/src/collections/storages.ts @@ -3,8 +3,6 @@ import { TableOptions } from '@nocobase/database'; export default { name: 'storages', title: '存储引擎', - internal: true, - developerMode: true, fields: [ { title: '存储引擎名称', diff --git a/packages/plugin-file-manager/src/server.ts b/packages/plugin-file-manager/src/server.ts index 34ebbedf9a6f28551930efbbaa96c199b36fe693..f8fcf94ab422412993831a9305abaabbf1242bb7 100644 --- a/packages/plugin-file-manager/src/server.ts +++ b/packages/plugin-file-manager/src/server.ts @@ -1,6 +1,7 @@ import path from 'path'; import Database from '@nocobase/database'; import Resourcer from '@nocobase/resourcer'; +import { PluginOptions, Plugin } from '@nocobase/server'; import { action as uploadAction, @@ -10,16 +11,43 @@ import { middleware as localMiddleware, } from './storages/local'; -export default async function () { - const database: Database = this.database; - const resourcer: Resourcer = this.resourcer; - - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); - - // 暂时中间件只能通过 use 加进来 - resourcer.use(uploadMiddleware); - resourcer.registerActionHandler('upload', uploadAction); - localMiddleware(this); -} +export default { + name: 'file-manager', + async load() { + const database: Database = this.app.db; + const resourcer: Resourcer = this.app.resourcer; + + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + // 暂时中间件只能通过 use 加进来 + resourcer.use(uploadMiddleware); + resourcer.registerActionHandler('upload', uploadAction); + localMiddleware(this.app); + + const Storage = database.getModel('storages'); + + this.app.on('db.init', async () => { + await Storage.create({ + title: '本地存储', + name: `local`, + type: 'local', + baseUrl: process.env.LOCAL_STORAGE_BASE_URL, + default: process.env.STORAGE_TYPE === 'local', + }); + await Storage.create({ + name: `ali-oss`, + type: 'ali-oss', + baseUrl: process.env.ALI_OSS_STORAGE_BASE_URL, + options: { + region: process.env.ALI_OSS_REGION, + accessKeyId: process.env.ALI_OSS_ACCESS_KEY_ID, + accessKeySecret: process.env.ALI_OSS_ACCESS_KEY_SECRET, + bucket: process.env.ALI_OSS_BUCKET, + }, + default: process.env.STORAGE_TYPE === 'ali-oss', + }); + }); + }, +} as PluginOptions; diff --git a/packages/plugin-file-manager/src/storages/local.ts b/packages/plugin-file-manager/src/storages/local.ts index ada0b85de1e7f4265c32f51f585e3a2c29d39748..fcbb9075a9336c75b1fd7417c72e5be94c212e91 100644 --- a/packages/plugin-file-manager/src/storages/local.ts +++ b/packages/plugin-file-manager/src/storages/local.ts @@ -12,13 +12,13 @@ export function getDocumentRoot(storage): string { // TODO(feature): 后面考虑以字符串模板的方式使用,可注入 req/action 相关变量,以便于区分文件夹 return path.resolve(path.isAbsolute(documentRoot) ? documentRoot - : path.join(process.env.PWD, documentRoot), storage.path); + : path.join(process.cwd(), documentRoot), storage.path); } // TODO(optimize): 初始化的时机不应该放在中间件里 export function middleware(app) { const storages = new Map(); - const StorageModel = app.database.getModel('storages'); + const StorageModel = app.db.getModel('storages'); return app.use(async function (ctx, next) { const items = await StorageModel.findAll({ diff --git a/packages/plugin-full-collections/package.json b/packages/plugin-full-collections/package.json deleted file mode 100644 index c816f3d8b544dde6734446c9edaedbebf89dbc93..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@nocobase/plugin-full-collections", - "version": "0.4.0-alpha.7", - "main": "lib/index.js", - "license": "MIT", - "private": true, - "dependencies": { - "@nocobase/server": "^0.4.0-alpha.7", - "crypto-random-string": "^3.3.1", - "deepmerge": "^4.2.2", - "just-has": "^1.0.0" - }, - "devDependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7" - } -} diff --git a/packages/plugin-full-collections/src/__tests__/collections.test.ts b/packages/plugin-full-collections/src/__tests__/collections.test.ts deleted file mode 100644 index 5d4ba648f1098571d30dd158efc7436bf4489f02..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/__tests__/collections.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Agent, getAgent, getApp } from '.'; -import { Application } from '@nocobase/server'; -import Database, { ModelCtor, Model } from '@nocobase/database'; - -describe('collections', () => { - let app: Application; - let agent: Agent; - let db: Database; - let Collection: ModelCtor; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - db = app.database; - Collection = db.getModel('collections'); - }); - - afterEach(() => app.database.close()); - - it('create', async () => { - const collection = await Collection.create({ - name: 'test1', - }); - await collection.updateAssociations({ - fields: [ - { - type: 'string', - name: 'name', - }, - { - type: 'string', - name: 'title', - }, - ], - }); - }); - - it('create2', async () => { - const collection = await Collection.create({}); - await collection.updateAssociations({ - fields: [ - { - type: 'string', - name: 'name', - }, - { - type: 'string', - }, - ], - }); - }); - - it('api', async () => { - await agent.resource('collections').create({ - values: { - name: 'test2', - }, - }); - await agent.resource('collections.fields').create({ - associatedKey: 'test2', - values: { - type: 'string', - name: 'name', - }, - }); - }); -}); diff --git a/packages/plugin-full-collections/src/__tests__/fields.test.ts b/packages/plugin-full-collections/src/__tests__/fields.test.ts deleted file mode 100644 index 64f2298700b48194e58edd5253301d2887716240..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/__tests__/fields.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Agent, getAgent, getApp } from '.'; -import { Application } from '@nocobase/server'; -import Database, { ModelCtor, Model, FieldOptions } from '@nocobase/database'; -import { FieldModel } from '../models'; - -type Options = { name?: string } & FieldOptions; - -describe('fields', () => { - let app: Application; - let agent: Agent; - let db: Database; - let Collection: ModelCtor; - let collection: Model; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - db = app.database; - Collection = db.getModel('collections'); - collection = await Collection.create({ name: 'foos' }); - await Collection.create({ name: 'bars' }); - const tables = db.getTables(); - for (const table of tables.values()) { - await Collection.import(table.getOptions(), { migrate: false }); - } - }); - - afterEach(() => app.database.close()); - - async function createField(options: any) { - return await collection.createField(options); - } - - describe('basic', () => { - it.only('string', async () => { - // await createField({ - // interface: 'string', - // }); - }); - it('number', async () => { - await createField({ - interface: 'number', - }); - }); - }); - - describe('relation', () => { - it('linkTo', async () => { - const field = await createField({ - interface: 'linkTo', - 'x-linkTo-props': { - multiple: false, - target: 'bars', - }, - }); - const data = field.get(); - const keys = ['target', 'multiple', 'foreignKey', 'otherKey', 'sourceKey', 'targetKey']; - for (const key of keys) { - expect(data[key]).toEqual(field.get(key)); - } - expect(data['x-linkTo-props']).toEqual({ target: 'bars', multiple: false }); - }); - - it('linkTo', async () => { - const field = await createField({ - interface: 'linkTo', - type: 'hasMany', - 'x-linkTo-props': { - // multiple: false, - target: 'bars', - }, - }); - const data = field.get(); - const keys = ['target', 'multiple', 'foreignKey', 'otherKey', 'sourceKey', 'targetKey']; - for (const key of keys) { - expect(data[key]).toEqual(field.get(key)); - } - expect(data['x-linkTo-props']).toEqual({ target: 'bars', multiple: true }); - }); - }); -}); diff --git a/packages/plugin-full-collections/src/collections/collections.ts b/packages/plugin-full-collections/src/collections/collections.ts deleted file mode 100644 index 144337c874fc8350730420df7d85216533e569a8..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/collections/collections.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'collections', - title: '数据表配置', - internal: true, - model: 'CollectionModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '数据表名称', - required: true, - }, - { - interface: 'string', - type: 'randomString', - name: 'name', - randomString: { - length: 10, - template: 't_%r', - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - createOnly: true, - title: '标识', - unique: true, - required: true, - developerMode: true, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - developerMode: true, - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - component: { - type: 'hidden', - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'internal', - title: '系统内置', - defaultValue: false, - developerMode: true, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'hasMany', - name: 'fields', - title: '字段', - sourceKey: 'name', - }, - { - interface: 'linkTo', - type: 'hasMany', - name: 'actions', - title: '操作方法', - sourceKey: 'name', - }, - ], -} as TableOptions; diff --git a/packages/plugin-full-collections/src/collections/fields.ts b/packages/plugin-full-collections/src/collections/fields.ts deleted file mode 100644 index b75c9d4bbb285431f9600b122b0a671a001824f6..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/collections/fields.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { TableOptions } from '@nocobase/database'; -import { getInterfaceFields } from '../interfaces'; - -export default { - name: 'fields', - title: '字段配置', - internal: true, - model: 'FieldModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '字段名称', - required: true, - }, - { - interface: 'string', - type: 'randomString', - name: 'name', - title: '标识', - required: true, - createOnly: true, - randomString: { - length: 5, - template: 'f_%r', - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - developerMode: true, - }, - ...getInterfaceFields(), - { - interface: 'string', - type: 'string', - name: 'type', - title: '数据类型', - developerMode: true, - }, - { - interface: 'number', - type: 'integer', - name: 'parent_id', - title: '所属分组', - }, - { - interface: 'linkTo', - multiple: false, - type: 'belongsTo', - name: 'parent', - title: '所属分组', - target: 'fields', - foreignKey: 'parent_id', - targetKey: 'id', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'textarea', - type: 'virtual', - name: 'component.tooltip', - title: '提示信息', - }, - { - interface: 'boolean', - type: 'boolean', - name: 'required', - title: '必填项', - defaultValue: false, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - labelField: 'title', - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - developerMode: true, - defaultValue: false, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - ], -} as TableOptions; diff --git a/packages/plugin-full-collections/src/collections/menus.ts b/packages/plugin-full-collections/src/collections/menus.ts deleted file mode 100644 index c0633f9fbda6c73006cfd98e33e18f0997bf4016..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/collections/menus.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'menus', - title: '菜单配置', - internal: true, - // model: 'CollectionModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '菜单名称', - required: true, - }, - { - interface: 'icon', - type: 'string', - name: 'icon', - title: '图标', - component: { - type: 'icon', - }, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '菜单类型', - required: true, - dataSource: [ - { value: 'group', label: '菜单组' }, - { value: 'link', label: '自定义链接' }, - { value: 'page', label: '页面' }, - ], - linkages: [ - { - "type": "value:visible", - "target": "page", - "condition": "{{ $self.value === 'page' }}" - }, - { - "type": "value:visible", - "target": "url", - "condition": "{{ $self.value === 'link' }}" - }, - ], - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'page', - title: '页面', - target: 'pages', - // targetKey: 'name', - }, - { - interface: 'string', - type: 'string', - name: 'url', - title: '链接地址', - required: true, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - developerMode: true, - defaultValue: false, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - ], -} as TableOptions; diff --git a/packages/plugin-full-collections/src/collections/pages.ts b/packages/plugin-full-collections/src/collections/pages.ts deleted file mode 100644 index 33d5aebd12fb3d9a3cd1d6b1fe8628fff801834c..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/collections/pages.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'pages', - title: '页面配置', - internal: true, - // model: 'CollectionModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '页面名称', - required: true, - }, - { - interface: 'string', - type: 'randomString', - name: 'name', - title: '缩略名', - required: true, - createOnly: true, - randomString: { - length: 6, - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - developerMode: true, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '类型', - required: true, - dataSource: [ - { value: 'default', label: '页面' }, - { value: 'collection', label: '数据集' }, - ], - }, - { - interface: 'boolean', - type: 'boolean', - name: 'dynamic', - title: '单条数据子页面', - }, - // { - // interface: 'subTable', - // type: 'hasMany', - // name: 'views', - // title: '视图', - // target: 'pages_views', - // children: [ - // { - // interface: 'linkTo', - // type: 'belongsToMany', - // name: 'view', - // title: '视图', - // target: 'views', - // }, - // { - // interface: 'percent', - // type: 'float', - // name: 'width', - // title: '宽度', - // }, - // ], - // }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - ], -} as TableOptions; diff --git a/packages/plugin-full-collections/src/collections/views.ts b/packages/plugin-full-collections/src/collections/views.ts deleted file mode 100644 index 30803f8ea4eed896a61f9785161481325df36037..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/collections/views.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { TableOptions } from '@nocobase/database'; -import { getViewFields } from '../views'; - -export default { - name: 'views', - title: '视图配置', - internal: true, - model: 'ViewModel', - developerMode: true, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '视图名称', - required: true, - component: { - type: 'string', - }, - }, - { - interface: 'string', - type: 'string', - name: 'name', - title: '标识', - component: { - type: 'string', - }, - }, - ...getViewFields(), - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - title: '所属数据表', - target: 'collections', - targetKey: 'name', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - component: { - type: 'hidden', - }, - }, - ], -} as TableOptions; diff --git a/packages/plugin-full-collections/src/fields/randomString.ts b/packages/plugin-full-collections/src/fields/randomString.ts deleted file mode 100644 index bb22d43667a447f6e4cc0923a709c0aaa2f44009..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/fields/randomString.ts +++ /dev/null @@ -1,27 +0,0 @@ -import cryptoRandomString from 'crypto-random-string'; -import { STRING, FieldContext } from '@nocobase/database'; -import { - DataTypes -} from 'sequelize'; - -export class RANDOMSTRING extends STRING { - constructor(options: any, context: FieldContext) { - super(options, context); - const Model = context.sourceTable.getModel(); - const { name, randomString } = options; - randomString && Model.addHook('beforeValidate', (model) => { - const { template, ...opts } = randomString; - let value = cryptoRandomString(opts); - if (template && template.includes('%r')) { - value = template.replace('%r', value); - } - if (!model.get(name)) { - model.set(name, value); - } - }); - } - - getDataType() { - return DataTypes.STRING; - } -} diff --git a/packages/plugin-full-collections/src/hooks/collections.afterCreate.ts b/packages/plugin-full-collections/src/hooks/collections.afterCreate.ts deleted file mode 100644 index 77d8879ac8b66299b9d2bf65eb6a83eadba9c797..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/hooks/collections.afterCreate.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default async function afterCreate(model: any, options: any = {}) { - const { migrate = true } = options; - if (migrate) { - await model.migrate(); - } -} diff --git a/packages/plugin-full-collections/src/hooks/collections.beforeValidate.ts b/packages/plugin-full-collections/src/hooks/collections.beforeValidate.ts deleted file mode 100644 index 8494941735767b4e857f4aeb649b9f214b18f71d..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/hooks/collections.beforeValidate.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default async function beforeValidate(model: any, options = {}) { - -} diff --git a/packages/plugin-full-collections/src/hooks/fields.afterCreate.ts b/packages/plugin-full-collections/src/hooks/fields.afterCreate.ts deleted file mode 100644 index 77d8879ac8b66299b9d2bf65eb6a83eadba9c797..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/hooks/fields.afterCreate.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default async function afterCreate(model: any, options: any = {}) { - const { migrate = true } = options; - if (migrate) { - await model.migrate(); - } -} diff --git a/packages/plugin-full-collections/src/hooks/fields.beforeValidate.ts b/packages/plugin-full-collections/src/hooks/fields.beforeValidate.ts deleted file mode 100644 index ca14400a5ac17ae000504011c6f62dcccec82545..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/hooks/fields.beforeValidate.ts +++ /dev/null @@ -1,36 +0,0 @@ -import _ from 'lodash'; -import { has, merge, generateRandomString } from '../utils'; -import { interfaces } from '../interfaces'; -import { Model } from '@nocobase/database'; - -export default async function beforeValidate(model: Model, opts = {}) { - let data = model.get(); - const { interface: interfaceType } = data; - if (!interfaceType || !interfaces.has(interfaceType)) { - return; - } - const defaults = {}; - Object.keys(data).forEach(name => { - const match = /options\.x-(\w+)-props\.(\w+)/.exec(name); - if (match) { - if (match[1] !== interfaceType) { - delete data[name]; - delete model.dataValues[name]; - } else { - _.set(defaults, match[2], data[name]); - } - } - }); - const { options, properties = {}, initialize } = interfaces.get(interfaceType); - Object.keys(properties).forEach(name => { - if (has(data, `x-${interfaceType}-props.${name}`)) { - const value = _.get(data, `x-${interfaceType}-props.${name}`); - _.set(data, name, value); - } - }); - data = merge(merge(defaults, options), data); - initialize && await initialize(data, model); - model.set(data); - // 清除掉 interfaceType 下的临时数据 - model.set(`x-${interfaceType}-props`, undefined); -} diff --git a/packages/plugin-full-collections/src/interfaces/index.ts b/packages/plugin-full-collections/src/interfaces/index.ts deleted file mode 100644 index 13fc9b07e3863202011bf211a3a703e6bc3459ac..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/interfaces/index.ts +++ /dev/null @@ -1,118 +0,0 @@ -import * as types from './types'; - -export const groups= new Map(Object.entries({ - basic: '基本类型', - media: '多媒体类型', - choices: '选择类型', - datetime: '日期和时间', - relation: '关系类型', - systemInfo: '系统信息', - developerMode: '开发者模式', - others: '其他' -})); - -export const interfaces = new Map(); - -export function registerInterface(name: string, options: any) { - interfaces.set(name, options); -} - -export function registerInterfaces(values: any) { - Object.keys(values).forEach(name => { - registerInterface(name, { - ...values[name], - interface: name, - }); - }); -} - -export function getOptions() { - const options = []; - const map = new Map(); - for (const [key, item] of interfaces) { - const { title, group } = item; - if (!map.has(group)) { - map.set(group, []); - } - map.get(group).push({ - key: key, - value: key, - label: title, - }); - } - for (const [key, label] of groups) { - options.push({ - key, - label, - children: map.get(key) || [], - }); - } - return options; -} - -export function getInterfaceLinkages() { - let xlinkages = []; - for (const [key, item] of interfaces) { - const { linkages = {}, properties = {} } = item; - xlinkages.push({ - "type": "value:visible", - "target": `x-${key}-props.*`, - "condition": `{{ $self.value === '${key}' }}`, - }); - if (linkages.interface) { - xlinkages.push(linkages.interface); - } - if (linkages.interface) { - xlinkages = xlinkages.concat(linkages.interface.map(linkage => { - if (properties[linkage.target]) { - linkage.condition = `{{ $self.value === '${key}' }}`; - linkage.target = `x-${key}-props.${linkage.target}`; - } - return linkage; - })); - } - } - return xlinkages; -} - -export function getInterfaceFields() { - const fields = new Map(); - fields.set('interface', { - interface: 'select', - type: 'string', - name: 'interface', - title: '字段类型', - required: true, - dataSource: getOptions(), - createOnly: true, - component: { - type: 'select', - }, - linkages: getInterfaceLinkages(), - }); - for (const [key, item] of interfaces) { - const { properties = {}, linkages = {} } = item; - Object.keys(properties).forEach(name => { - const property = { - ...properties[name], - name, - }; - if (!property.type) { - property.type = 'virtual'; - } - if (property.type === 'virtual') { - property.name = `x-${key}-props.${name}`; - } - if (linkages[name]) { - property.linkages = linkages[name].map((linkage: any) => { - linkage.target = `x-${key}-props.${linkage.target}`; - return linkage; - }); - } - fields.set(`x-${key}-props.${name}`, property); - }); - } - return [...fields.values()]; -} - -registerInterfaces(types); diff --git a/packages/plugin-full-collections/src/interfaces/types.ts b/packages/plugin-full-collections/src/interfaces/types.ts deleted file mode 100644 index 0f46781f94baa77634b09b643585434a43c90706..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/interfaces/types.ts +++ /dev/null @@ -1,738 +0,0 @@ -import { generateRandomString } from '../utils'; - -export const string = { - title: '单行文本', - group: 'basic', - options: { - type: 'string', - filterable: true, - component: { - type: 'string', - }, - }, -}; - -export const textarea = { - title: '多行文本', - group: 'basic', - options: { - type: 'text', - filterable: true, - component: { - type: 'textarea', - }, - } -}; - -export const phone = { - title: '手机号码', - group: 'basic', - options: { - type: 'string', - filterable: true, - format: 'phone', // 验证的问题 - component: { - type: 'string', - 'x-rules': 'phone', - }, - }, -}; - -export const email = { - title: '邮箱', - group: 'basic', - options: { - type: 'string', - filterable: true, - format: 'email', - component: { - type: 'string', - 'x-rules': 'email', - }, - }, -}; - -export const number = { - title: '数字', - group: 'basic', - options: { - type: 'float', - filterable: true, - sortable: true, - precision: 0, - component: { - type: 'number', - }, - }, - properties: { - precision: { - interface: 'select', - type: 'virtual', - title: '精度', - dataSource: [ - { value: 0, label: '1' }, - { value: 1, label: '1.0' }, - { value: 2, label: '1.00' }, - { value: 3, label: '1.000' }, - { value: 4, label: '1.0000' }, - ], - component: { - type: 'number', - default: 0, - }, - }, - }, -}; - -export const percent = { - title: '百分比', - group: 'basic', - options: { - type: 'float', - filterable: true, - sortable: true, - precision: 0, - component: { - type: 'percent', - }, - }, - properties: { - precision: { - interface: 'select', - type: 'virtual', - title: '精度', - dataSource: [ - { value: 0, label: '1' }, - { value: 1, label: '1.0' }, - { value: 2, label: '1.00' }, - { value: 3, label: '1.000' }, - { value: 4, label: '1.0000' }, - ], - component: { - type: 'number', - default: 0, - }, - }, - }, -}; - -export const wysiwyg = { - title: '可视化编辑器', - group: 'media', - disabled: true, - options: { - type: 'text', - component: { - type: 'wysiwyg', - }, - }, -}; - -export const boolean = { - title: '是/否', - group: 'choices', - options: { - type: 'boolean', - filterable: true, - component: { - type: 'checkbox', // switch - }, - }, -}; - -export const select = { - title: '下拉选择(单选)', - group: 'choices', - options: { - type: 'string', - filterable: true, - dataSource: [], - component: { - type: 'select', - }, - }, - properties: { - dataSource: { - interface: 'subTable', - type: 'virtual', - title: '可选项', - component: { - type: 'table', - default: [{}], - items: { - type: 'object', - properties: { - value: { - type: "string", - title: "值", - required: true - }, - label: { - type: "string", - title: "选项", - required: true - }, - }, - }, - }, - }, - }, - initialize: (data: any) => { - if (Array.isArray(data.dataSource)) { - data.dataSource = data.dataSource.map((item: any) => { - if (item.value === null || typeof item.value === 'undefined') { - item.value = generateRandomString(); - } - return { ...item }; - }); - } - }, -}; - -export const multipleSelect = { - title: '下拉选择(多选)', - group: 'choices', - options: { - type: 'json', // TODO: json 不是个通用的方案 - filterable: true, - dataSource: [], - defaultValue: [], - multiple: true, - component: { - type: 'select', - }, - }, - properties: { - dataSource: select.properties.dataSource, - }, - initialize: select.initialize, -}; - -export const radio = { - title: '单选框', - group: 'choices', - options: { - type: 'string', - filterable: true, - dataSource: [], - component: { - type: 'radio', - }, - }, - properties: { - dataSource: select.properties.dataSource, - }, - initialize: select.initialize, -}; - -export const checkboxes = { - title: '多选框', - group: 'choices', - options: { - type: 'json', // TODO: json 不是个通用的方案 - filterable: true, - dataSource: [], - defaultValue: [], - component: { - type: 'checkboxes', - }, - }, - properties: { - dataSource: select.properties.dataSource, - }, - initialize: select.initialize, -}; - -export const datetime = { - title: '日期', - group: 'datetime', - options: { - type: 'date', - showTime: false, - filterable: true, - sortable: true, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - component: { - type: 'date', - }, - }, - properties: { - dateFormat: { - interface: 'select', - type: 'virtual', - title: '日期格式', - dataSource: [ - { value: 'YYYY/MM/DD', label: '年/月/日' }, - { value: 'YYYY-MM-DD', label: '年-月-日' }, - { value: 'DD/MM/YYYY', label: '日/月/年' }, - ], - defaultValue: 'YYYY-MM-DD', - component: { - type: 'string', - default: 'YYYY-MM-DD', - }, - }, - showTime: { - interface: 'boolean', - type: 'virtual', - title: '显示时间', - component: { - type: 'boolean', - default: false, - }, - }, - timeFormat: { - interface: 'select', - type: 'virtual', - title: '时间格式', - dataSource: [ - { value: 'HH:mm:ss', label: '24小时制' }, - { value: 'hh:mm:ss a', label: '12小时制' }, - ], - defaultValue: 'HH:mm:ss', - component: { - type: 'string', - default: 'HH:mm:ss', - }, - }, - }, - linkages: { - showTime: [ - { - "type": "value:visible", - "target": "timeFormat", - "condition": "{{ ($form.values && $form.values.control === 'time') || $self.value === true }}" - }, - ], - }, -}; - -export const time = { - title: '时间', - group: 'datetime', - options: { - type: 'time', - filterable: true, - sortable: true, - timeFormat: 'HH:mm:ss', - component: { - type: 'time', - }, - }, -}; - -export const subTable = { - title: '子表格', - group: 'relation', - // disabled: true, - options: { - type: 'hasMany', - // target, - // children: [], - component: { - type: 'subTable', - }, - }, - properties: { - children: { - interface: 'subTable', - type: 'hasMany', - target: 'fields', - sourceKey: 'id', - foreignKey: 'parent_id', - title: '子表格字段', - component: { - type: 'subTable', - default: [], - }, - }, - }, - initialize(data: any) { - if (!data.target) { - data.target = generateRandomString({ prefix: 't_', length: 12 }); - } - }, -}; - -export const linkTo = { - title: '关联数据', - group: 'relation', - // disabled: true, - options: { - type: 'belongsToMany', - // name, - // target: '关联表', - // targetKey, - // sourceKey, - // otherKey, - // foreignKey, - // labelField, - // valueField, - filterable: false, - // multiple: true, - component: { - type: 'drawerSelect', - // labelField, - // valueField, - }, - }, - properties: { - target: { - interface: 'string', - type: 'virtual', - name: 'target', - title: '要关联的数据表', - required: true, - createOnly: true, - component: { - type: 'remoteSelect', - labelField: 'title', - valueField: 'name', - resourceName: 'collections', - 'x-component-props': { - mode: 'simple', - }, - }, - }, - 'component.labelField': { - interface: 'string', - type: 'virtual', - title: '要显示的字段', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - 'x-component-props': { - mode: 'simple', - }, - }, - }, - 'component.filter': { - interface: 'json', - type: 'virtual', - title: '数据范围', - component: { - type: 'filter', - resourceName: 'collections.fields', - }, - }, - multiple: { - interface: 'boolean', - type: 'virtual', - name: 'multiple', - title: '允许添加多条记录', - defaultValue: true, - component: { - type: 'checkbox', - }, - }, - }, - linkages: { - target: [ - { - type: "value:state", - target: "component.labelField", - condition: "{{ $self.inputed }}", - state: { - value: null, - } - }, - { - "type": "value:visible", - "target": "component.labelField", - "condition": "{{ !!$self.value }}" - }, - { - type: "value:schema", - target: "component.labelField", - // condition: "{{ $self.value }}", - schema: { - "x-component-props": { - "associatedKey": "{{ $self.value }}" - }, - }, - }, - { - type: 'value:visible', - target: 'component.filter', - condition: '{{ !!$self.value }}' - }, - { - type: "value:schema", - target: "component.filter", - schema: { - "x-component-props": { - "associatedKey": "{{ $self.value }}" - }, - }, - }, - ], - }, - initialize(data: any, model: any) { - if (!['hasOne', 'hasMany', 'belongsTo', 'belongsToMany'].includes(data.type)) { - return; - } - if (!data.foreignKey) { - data.foreignKey = generateRandomString({ prefix: 'f_', length: 6 }); - } - if (data.type === 'belongsToMany') { - if (!data.through) { - data.through = generateRandomString({ prefix: 't_', length: 12 }); - } - if (!data.otherKey) { - data.otherKey = generateRandomString({ prefix: 'f_', length: 6 }); - } - } - if (data.type !== 'belongsTo' && !data.sourceKey) { - data.sourceKey = model.constructor.primaryKeyAttribute; - } - if (['belongsTo', 'belongsToMany'].includes(data.type) && !data.targetKey) { - const TargetModel = model.database.getModel(data.target); - data.targetKey = TargetModel.primaryKeyAttribute; - } - } -}; - -export const createdAt = { - title: '创建时间', - group: 'systemInfo', - options: { - interface: 'createdAt', - type: 'date', - field: 'created_at', - showTime: false, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - required: true, - filterable: true, - sortable: true, - component: { - type: 'date', - }, - }, - properties: { - ...datetime.properties, - }, - linkages: { - ...datetime.linkages, - }, -}; - -export const updatedAt = { - title: '修改时间', - group: 'systemInfo', - options: { - interface: 'updatedAt', - type: 'date', - field: 'updated_at', - showTime: false, - dateFormat: 'YYYY-MM-DD', - timeFormat: 'HH:mm:ss', - required: true, - filterable: true, - sortable: true, - component: { - type: 'date', - }, - }, - properties: { - ...datetime.properties, - }, - linkages: { - ...datetime.linkages, - }, -}; - -export const group = { - title: '字段组', - disabled: true, - options: { - type: 'virtual', - component: { - type: 'hidden', - }, - }, -}; - -export const description = { - title: '说明文字', - group: 'others', - options: { - type: 'virtual', - component: { - type: 'description', - }, - }, -}; - -export const primaryKey = { - title: '主键', - group: 'developerMode', - options: { - name: 'id', - type: 'integer', - required: true, - autoIncrement: true, - primaryKey: true, - filterable: true, - developerMode: true, - component: { - type: 'number', - }, - }, -}; - -export const sort = { - title: '排序', - group: 'developerMode', - options: { - type: 'integer', - required: true, - // scope: [], - component: { - type: 'sort', - }, - }, -}; - -export const password = { - title: '密码', - group: 'developerMode', - options: { - type: 'password', - hidden: true, // hidden 用来控制 api 不输出这个字段 - component: { - type: 'password', - }, - }, -}; - -export const json = { - title: 'JSON', - group: 'developerMode', - options: { - type: 'json', - mode: 'replace', - // developerMode: true, - component: { - type: 'hidden', - }, - }, -}; - -export const icon = { - title: '图标', - group: 'developerMode', - options: { - type: 'string', - component: { - type: 'icon', - }, - }, -}; - -export const createdBy = { - title: '创建人', - group: 'systemInfo', - options: { - type: 'createdBy', - // filterable: true, - target: 'users', - foreignKey: 'created_by_id', - component: { - type: 'drawerSelect', - labelField: 'nickname', - }, - }, -}; - -export const updatedBy = { - title: '修改人', - group: 'systemInfo', - options: { - type: 'updatedBy', - // filterable: true, - target: 'users', - foreignKey: 'updated_by_id', - component: { - type: 'drawerSelect', - labelField: 'nickname', - }, - }, -}; - -export const attachment = { - title: '附件', - group: 'media', - // disabled: true, - options: { - type: 'belongsToMany', - filterable: false, - target: 'attachments', - // storage: { - // name: 'local', - // }, - component: { - type: 'upload', - }, - }, - initialize(data: any, model: any) { - if (data.type === 'belongsToMany' && !data.through) { - data.through = generateRandomString({ prefix: 't_', length: 12 }); - } - }, -}; - -export const chinaRegion = { - title: '中国行政区划', - group: 'choices', - options: { - type: 'belongsToMany', - // 数据来源的数据表,与 dataSource 不同,需要从表数据加载后转化成 dataSource - target: 'china_regions', - targetKey: 'code', - // 可选层级,最大层级 - maxLevel: 3, - // 可以选到任意一级结束 - incompletely: false, - component: { - type: 'cascader', - // 值字段 - valueField: 'code', - // 名称字段 - labelField: 'name', - // TODO(refactor): 等 toWhere 重构完成后要改成 parent - // 上级字段名 - parentField: 'parent_code', - }, - }, - properties: { - maxLevel: { - interface: 'radio', - type: 'virtual', - title: '可选层级', - defaultValue: 3, - dataSource: [ - { value: 1, label: '省' }, - { value: 2, label: '市' }, - { value: 3, label: '区/县' }, - { value: 4, label: '乡镇/街道' }, - { value: 5, label: '村/居委会' }, - ], - }, - incompletely: { - interface: 'boolean', - type: 'virtual', - title: '可以选到任意一级结束', - defaultValue: false, - } - }, - initialize(data: any, model: any) { - if (data.type === 'belongsToMany' && !data.through) { - data.through = generateRandomString({ prefix: 't_', length: 12 }); - } - }, -}; diff --git a/packages/plugin-full-collections/src/models/base.ts b/packages/plugin-full-collections/src/models/base.ts deleted file mode 100644 index 72b3be2a6329cc97a012b85dd92ec70ce47898ea..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/models/base.ts +++ /dev/null @@ -1,77 +0,0 @@ -import _ from 'lodash'; -import { getDataTypeKey, Model } from '@nocobase/database'; -import Dottie from 'dottie'; - -export class BaseModel extends Model { - - get additionalAttribute() { - const tableOptions = this.database.getTable(this.constructor.name).getOptions(); - return _.get(tableOptions, 'additionalAttribute') || 'options'; - } - - hasGetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 get 方法就直接走 get - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.get; - } - return !!attribute; - } - - hasSetAttribute(key: string) { - // @ts-ignore - if (this.constructor.hasAlias(key)) { - return false; - } - const attribute = this.rawAttributes[key]; - // virtual 如果有 set 方法就直接走 set - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.set; - } - return !!attribute; - } - - get(key?: any, options?: any) { - if (typeof key !== 'string') { - const data = super.get(key); - return { - ..._.omit(data, [this.additionalAttribute]), - ...(data[this.additionalAttribute] || {}), - }; - } - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.get(column, options); - if (path.length) { - return _.get(value, path); - } - return value; - } - return _.get(super.get(this.additionalAttribute, options) || {}, key); - } - - set(key?: any, value?: any, options: any = {}) { - if (typeof key !== 'string') { - return super.set(key, value, options); - } - // @ts-ignore - if (this.constructor.hasAlias(key)) { - return this; - } - const [column] = key.split('.'); - if (this.hasSetAttribute(column)) { - return super.set(key, value, options); - } - return super.set(`${this.additionalAttribute}.${key}`, value, options); - } - - // getDataValue(key: any) { - // return super.getDataValue(key); - // } - - // setDataValue(key: any, value: any) { - // return super.setDataValue(key, value); - // } -} - -export default BaseModel; diff --git a/packages/plugin-full-collections/src/models/collection.ts b/packages/plugin-full-collections/src/models/collection.ts deleted file mode 100644 index 5efffefce3c99d7d629af6570f3a80dd4e3ceee0..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/models/collection.ts +++ /dev/null @@ -1,100 +0,0 @@ -import _ from 'lodash'; -import { Model, Table, TableOptions } from '@nocobase/database'; -import { SaveOptions, Op } from 'sequelize'; -import BaseModel from './base'; - -export interface LoadOptions { - reset?: boolean; - where?: any; - skipExisting?: boolean; - [key: string]: any; -} - -export class CollectionModel extends BaseModel { - - async migrate() { - const table = await this.loadTableOptions(); - return await table.sync({ - force: false, - alter: { - drop: false, - } - }); - } - - async getFieldsOptions() { - const fieldsOptions = []; - const fields = await this.getFields(); - for (const field of fields) { - fieldsOptions.push(await field.getOptions()); - } - return fieldsOptions; - } - - async getOptions(): Promise { - return { - ...this.get(), - fields: await this.getFieldsOptions(), - }; - } - - async loadTableOptions(opts: any = {}): Promise { - const options = await this.getOptions(); - const table = this.database.table(options); - return table; - } - - /** - * TODO:需要考虑是初次加载还是重载 - * - * @param options - */ - static async load(options: LoadOptions = {}) { - const { skipExisting = false, reset = false, where = {}, transaction } = options; - const collections = await this.findAll({ - transaction, - where, - }); - for (const collection of collections) { - if (skipExisting && this.database.isDefined(collection.get('name'))) { - continue; - } - await collection.loadTableOptions({ - transaction, - reset, - }); - } - } - - static async import(data: TableOptions, options: SaveOptions = {}): Promise { - let collection: CollectionModel; - - if (data.name) { - collection = await this.findOne({ - ...options, - where: { - name: data.name, - }, - }); - } else if (data.title) { - collection = await this.findOne({ - ...options, - where: { - title: data.title, - }, - }); - } - - if (collection) { - await collection.update(data, options); - } else { - collection = await this.create(data, options); - } - - await collection.updateAssociations(data, options); - - return collection; - } -} - -export default CollectionModel; diff --git a/packages/plugin-full-collections/src/models/field.ts b/packages/plugin-full-collections/src/models/field.ts deleted file mode 100644 index a82da91fe21e2b3c5750129e682eb8373e7d5be6..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/models/field.ts +++ /dev/null @@ -1,60 +0,0 @@ -import _ from 'lodash'; -import { Model, FieldOptions } from '@nocobase/database'; -import BaseModel from './base'; -import { interfaces } from '../interfaces'; -import has from 'just-has'; - -export class FieldModel extends BaseModel { - - get(key?: any, options?: any) { - if (typeof key !== 'string') { - const data = super.get(key); - const { interface: interfaceType } = data; - if (interfaceType && interfaces.has(interfaceType)) { - const { properties = {} } = interfaces.get(interfaceType); - Object.keys(properties).forEach(name => { - if (has(data, name)) { - const value = _.get(data, name); - _.set(data, `x-${interfaceType}-props.${name}`, value); - } - }); - } - return data; - } - return super.get(key, options); - } - - async getOptions(): Promise { - return { - ...this.get(), - }; - } - - async migrate(options: any = {}) { - const collectionName = this.get('collection_name'); - - if (!collectionName) { - return false; - } - - if (!this.database.isDefined(collectionName)) { - throw new Error(`${collectionName} is not defined`); - } - - const table = this.database.getTable(collectionName); - const fieldOptions = await this.getOptions(); - console.log({ fieldOptions }); - - table.addField(fieldOptions); - - return await table.sync({ - force: false, - alter: { - drop: false, - } - }); - } - -} - -export default FieldModel; diff --git a/packages/plugin-full-collections/src/models/index.ts b/packages/plugin-full-collections/src/models/index.ts deleted file mode 100644 index d5b669b3fe56cb3f91e761569151223bbee66092..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/models/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './collection'; -export * from './field'; -export * from './view'; diff --git a/packages/plugin-full-collections/src/models/view.ts b/packages/plugin-full-collections/src/models/view.ts deleted file mode 100644 index cd3309a20922b92a44aedb7f3d8a8806b7aec783..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/models/view.ts +++ /dev/null @@ -1,33 +0,0 @@ -import _ from 'lodash'; -import BaseModel from './base'; -import { interfaces } from '../interfaces'; -import has from 'just-has'; - -export class ViewModel extends BaseModel { - - get(key?: any, options?: any) { - if (typeof key !== 'string') { - const data = super.get(key); - const { type } = data; - if (type && interfaces.has(type)) { - const { properties = {} } = interfaces.get(type); - Object.keys(properties).forEach(name => { - if (has(data, name)) { - const value = _.get(data, name); - _.set(data, `x-${type}-props.${name}`, value); - } - }); - } - return data; - } - return super.get(key, options); - } - - async getOptions(): Promise { - return { - ...this.get(), - }; - } -} - -export default ViewModel; diff --git a/packages/plugin-full-collections/src/server.ts b/packages/plugin-full-collections/src/server.ts deleted file mode 100644 index 80f219dbf0b6a3ea8c1f05657d9d01f0497d61b2..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/server.ts +++ /dev/null @@ -1,40 +0,0 @@ -import path from 'path'; -import { Application } from '@nocobase/server'; -import { registerModels, registerFields } from '@nocobase/database'; -import * as models from './models'; -import collectionsBeforeValidate from './hooks/collections.beforeValidate'; -import collectionsAfterCreate from './hooks/collections.afterCreate'; -import fieldsBeforeValidate from './hooks/fields.beforeValidate'; -import fieldsAfterCreate from './hooks/fields.afterCreate'; - -import { RANDOMSTRING } from './fields/randomString'; -import { interfaces } from './interfaces'; -import { merge } from './utils'; - -export default async function (this: Application, options = {}) { - const database = this.database; - const resourcer = this.resourcer; - // 提供全局的 models 注册机制 - registerModels(models); - registerFields({ - RANDOMSTRING, - }); - - database.addHook('beforeAddField', (options: any) => { - const { interface: interfaceType } = options; - if (interfaceType && interfaces.has(interfaceType)) { - const defaults = interfaces.get(interfaceType).options; - Object.assign(options, merge(defaults, options)) - } - // console.log({options}); - }); - - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); - - database.getModel('collections').addHook('beforeValidate', collectionsBeforeValidate); - database.getModel('fields').addHook('beforeValidate', fieldsBeforeValidate); - database.getModel('collections').addHook('afterCreate', collectionsAfterCreate); - database.getModel('fields').addHook('afterCreate', fieldsAfterCreate); -} diff --git a/packages/plugin-full-collections/src/utils.ts b/packages/plugin-full-collections/src/utils.ts deleted file mode 100644 index 9b6f73f8a03dd749c117c93ccf16709319badc2f..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import deepmerge from 'deepmerge'; -import cryptoRandomString from 'crypto-random-string'; -import justHas from 'just-has'; - -const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray - -export function merge(obj1: any, obj2: any) { - return deepmerge(obj1, obj2, { - arrayMerge: overwriteMerge, - }); -} - -export function generateRandomString(options: any = {}) { - const { prefix = '' } = options; - // @ts-ignore - return prefix + cryptoRandomString({ - length: 6, - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - ...options, - }); -} - -export const has = justHas; diff --git a/packages/plugin-full-collections/src/views/index.ts b/packages/plugin-full-collections/src/views/index.ts deleted file mode 100644 index b4a0d898c9832e58c525b7e28f62571dd0097a63..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/views/index.ts +++ /dev/null @@ -1,92 +0,0 @@ -import * as types from './types'; - -export const views = new Map(); - -export function registerView(type: string, value: any) { - views.set(type, value); -} - -export function registerViews(values: any) { - Object.keys(values).forEach(type => { - registerView(type, { - ...values[type], - type, - }); - }); -} - -registerViews(types); - -export function getOptions() { - const options = []; - for (const [type, view] of views) { - options.push({ - key: type, - value: type, - label: view.title, - }); - } - return options; -} - -export function getViewTypeLinkages() { - let xlinkages = []; - for (const [key, item] of views) { - const { linkages = {}, properties = {} } = item; - xlinkages.push({ - "type": "value:visible", - "target": `x-${key}-props.*`, - "condition": `{{ $self.value === '${key}' }}`, - }); - if (linkages.type) { - xlinkages = xlinkages.concat(linkages.type.map(linkage => { - if (properties[linkage.target]) { - linkage.condition = `{{ $self.value === '${key}' }}`; - linkage.target = `x-${key}-props.${linkage.target}`; - } - return linkage; - })); - } - } - return xlinkages; -} - -export function getViewFields() { - const fields = new Map(); - fields.set('type', { - interface: 'select', - type: 'string', - name: 'type', - title: '视图类型', - required: true, - dataSource: getOptions(), - createOnly: true, - component: { - type: 'select', - }, - linkages: getViewTypeLinkages(), - }); - for (const [key, item] of views) { - const { properties = {}, linkages = {} } = item; - Object.keys(properties).forEach(name => { - const property = { - ...properties[name], - name, - }; - if (!property.type) { - property.type = 'virtual'; - } - if (property.type === 'virtual') { - property.name = `x-${key}-props.${name}`; - } - if (linkages[name]) { - property.linkages = linkages[name].map((linkage: any) => { - linkage.target = `x-${key}-props.${linkage.target}`; - return linkage; - }); - } - fields.set(`x-${key}-props.${name}`, property); - }); - } - return [...fields.values()]; -} diff --git a/packages/plugin-full-collections/src/views/types.ts b/packages/plugin-full-collections/src/views/types.ts deleted file mode 100644 index 2086aefc82032763fdec0f2fba56506471da2f80..0000000000000000000000000000000000000000 --- a/packages/plugin-full-collections/src/views/types.ts +++ /dev/null @@ -1,403 +0,0 @@ -const fields = { - interface: 'json', - title: '要显示的字段', - // target: 'views_fields', - fields: [ - { - interface: 'string', - type: 'string', - name: 'name', - title: '字段', - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '字段标题', - }, - ], -}; - -const actions = { - interface: 'json', - title: '可进行的操作', - fields: [ - { - interface: 'string', - type: 'string', - name: 'name', - title: '操作', - }, - ], -}; - -const pages = { - interface: 'json', - title: '详情页要显示的单条数据子页面', - fields: [ - { - interface: 'string', - type: 'string', - name: 'name', - title: '页面', - }, - ], -}; - -const openMode = { - interface: 'radio', - // type: 'string', - title: '单条数据详情页的打开方式', - required: true, - dataSource: [ - { label: '常规页面', value: 'default' }, - { label: '快捷抽屉', value: 'simple' }, - ], - component: { - type: 'radio', - default: 'default', - }, -}; - -export const form = { - // fields, - title: '表单', - options: { - // fields, - }, - properties: { - fields, - }, - linkages: { - type: [ - { - type: 'value:schema', - target: "fields", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - ], - }, -}; - -export const detail = { - title: '详情', - options: { - // actions, - // fields, - }, - properties: { - actions, - fields, - }, - linkages: { - type: [ - { - type: 'value:schema', - target: "fields", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - ], - }, -}; - -export const table = { - title: '表格', - options: { - defaultPerPage: 20, - draggable: false, - filter: {}, - sort: {}, - openMode: 'default', - // actions, - // fields, - // pages, - // labelField, - }, - properties: { - // 数据配置 - filter: { - interface: 'json', - type: 'virtual', - title: '筛选数据', - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - }, - }, - sort: { - interface: 'json', - type: 'virtual', - title: '默认排序', - mode: 'replace', - defaultValue: {}, - component: { - type: 'string', - }, - }, - // 表格配置 - labelField: { - interface: 'select', - type: 'virtual', - title: '标题字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - fields, - defaultPerPage: { - interface: 'radio', - type: 'virtual', - name: 'defaultPerPage', - title: '默认每页显示几行数据', - defaultValue: 50, - dataSource: [ - { label: '10', value: 10 }, - { label: '20', value: 20 }, - { label: '50', value: 50 }, - { label: '100', value: 100 }, - ], - }, - draggable: { - interface: 'boolean', - type: 'virtual', - title: '支持拖拽数据排序', - }, - // 操作配置 - actions, - // 详情配置 - openMode, - pages, - }, - linkages: { - type: [ - { - type: 'value:schema', - target: "filter", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "sort", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "labelField", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "fields", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "pages", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - } - ], - }, -}; - -export const calendar = { - title: '日历', - options: { - // filter, - // labelField, - // startDateField, - // endDateField, - // openMode, - // pages, - }, - properties: { - // 数据配置 - filter: { - interface: 'json', - type: 'virtual', - title: '筛选数据', - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - }, - }, - // 日历配置 - labelField: { - interface: 'select', - type: 'virtual', - title: '标题字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - startDateField: { - interface: 'select', - type: 'virtual', - title: '开始日期字段', - // required: true, - component: { - type: 'remoteSelect', - placeholder: '默认为创建时间字段', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - endDateField: { - interface: 'select', - type: 'virtual', - title: '结束日期字段', - // required: true, - component: { - type: 'remoteSelect', - placeholder: '默认为创建时间字段', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - // 详情配置 - openMode, - pages, - }, - linkages: { - type: [ - { - type: 'value:schema', - target: "filter", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "labelField", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "startDateField", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "endDateField", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - { - type: 'value:schema', - target: "pages", - schema: { - 'x-component-props': { - associatedKey: "{{ $form.values && $form.values.associatedKey }}" - }, - }, - }, - ], - }, -}; - -export const association = { - title: '相关数据视图', - options: { - // tableName, - // viewName, - // actions, - }, - properties: { - tableName: { - interface: 'select', - type: 'virtual', - title: '相关数据', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - }, - }, - viewName: { - interface: 'select', - type: 'virtual', - title: '相关数据表的视图', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.views', - labelField: 'title', - valueField: 'name', - }, - }, - actions, - }, - linkages: { - tableName: [], - viewName: [], - }, -}; diff --git a/packages/plugin-multi-apps/.gitignore b/packages/plugin-multi-apps/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1be219988380e71581d3d2cdb2d9d6e3638039da --- /dev/null +++ b/packages/plugin-multi-apps/.gitignore @@ -0,0 +1,4 @@ +node_modules +yarn-error.log +.env +src2 \ No newline at end of file diff --git a/packages/plugin-multi-apps/.npmignore b/packages/plugin-multi-apps/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/plugin-multi-apps/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/plugin-multi-apps/package.json b/packages/plugin-multi-apps/package.json new file mode 100644 index 0000000000000000000000000000000000000000..9a64852d2f8e9284fdc3e156af8aaf8254fa5355 --- /dev/null +++ b/packages/plugin-multi-apps/package.json @@ -0,0 +1,12 @@ +{ + "name": "@nocobase/plugin-multi-apps", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "deepmerge": "^4.2.2", + "flat-to-nested": "^1.1.1" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/plugin-multi-apps/src/index.ts b/packages/plugin-multi-apps/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/plugin-multi-apps/src/server.ts b/packages/plugin-multi-apps/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..02956b81abad45c2e52be7c28fbb347968ef4561 --- /dev/null +++ b/packages/plugin-multi-apps/src/server.ts @@ -0,0 +1,271 @@ +import { Application, PluginOptions } from '@nocobase/server'; +import Koa from 'koa'; +import { Model } from '@nocobase/database'; +import path from 'path'; + +function createApp(opts) { + const { name } = opts; + const options = { + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: name, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + pool: { + max: 5, + min: 0, + acquire: 60000, + idle: 10000, + }, + logging: process.env.DB_LOG_SQL === 'on' ? console.log : false, + define: {}, + sync: { + force: false, + alter: { + drop: false, + }, + }, + }, + // 不能再 bodyParser,会卡死 + // bodyParser: false, + // dataWrapping: false, + resourcer: { + prefix: '/api', + // prefix: `/api/multiapps/${name}`, + }, + }; + const app = new Application(options); + + // app.db.sequelize.beforeDefine((model, options) => { + // options.tableName = `multiapps_${name}_${ + // options.tableName || options.name.plural + // }`; + // }); + + const plugins = [ + '@nocobase/plugin-ui-router', + '@nocobase/plugin-ui-schema', + '@nocobase/plugin-collections', + '@nocobase/plugin-users', + '@nocobase/plugin-action-logs', + '@nocobase/plugin-file-manager', + '@nocobase/plugin-permissions', + '@nocobase/plugin-export', + '@nocobase/plugin-system-settings', + '@nocobase/plugin-china-region', + ]; + + // console.log('process.cwd()', process.cwd()) + + for (const plugin of plugins) { + app.plugin( + require(`${plugin}/${__filename.endsWith('.ts') ? 'src' : 'lib'}/server`) + .default, + ); + } + + app.plugin( + require(`@nocobase/plugin-client/${__filename.endsWith('.ts') ? 'src' : 'lib'}/server`).default, { + dist: path.resolve(process.cwd(), './dist'), + importDemo: true, + }); + + return app; +} + +// import send from 'koa-send'; +// import serve from 'koa-static'; + +function multiApps({ getAppName }) { + return async function (ctx: Koa.Context, next) { + const appName = getAppName(ctx); + console.log({ appName }); + if (!appName) { + return next(); + } + // @ts-ignore + const App = ctx.app.db.getModel('applications'); + const model = await App.findOne({ + where: { name: appName }, + }); + if (!model) { + return next(); + } + const apps = ctx.app['apps']; + if (!apps.has(appName)) { + const app = createApp({ + name: appName, + }); + await app.load(); + await app.emitAsync('beforeStart'); + apps.set(appName, app); + } + + console.log('..........................start........................'); + // 完全隔离的做法 + const app = apps.get(appName) as Application; + // @ts-ignore + console.log(app.db.options); + const bodyParser = async (ctx2, next) => { + // @ts-ignore + // ctx2.request.body = ctx.request.body || {}; + await next(); + }; + app.middleware.unshift(bodyParser); + const handleRequest = app.callback(); + await handleRequest(ctx.req, ctx.res); + const index = app.middleware.indexOf(bodyParser); + app.middleware.splice(index, 1); + console.log('..........................end........................'); + await next(); + }; +} + +export default { + name: 'saas', + async load() { + this.app['apps'] = new Map(); + this.app.collection({ + name: 'applications', + title: '应用', + fields: [ + { + type: 'uid', + name: 'name', + prefix: 'a', + interface: 'string', + unique: true, + uiSchema: { + type: 'string', + title: '应用标识', + 'x-component': 'Input', + }, + }, + { + type: 'string', + name: 'title', + interface: 'string', + uiSchema: { + type: 'string', + title: '应用名称', + 'x-component': 'Input', + }, + }, + { + type: 'string', + name: 'email', + interface: 'email', + uiSchema: { + type: 'string', + title: '邮箱', + 'x-component': 'Input', + }, + }, + { + type: 'string', + name: 'note', + interface: 'textarea', + uiSchema: { + type: 'string', + title: '你希望用 NocoBase 来做什么', + 'x-component': 'Input.TextArea', + }, + }, + { + type: 'string', + name: 'status', + interface: 'select', + uiSchema: { + type: 'string', + title: '状态', + 'x-component': 'Select', + default: 'initializing', + enum: [ + { value: 'initializing', label: '正在初始化' }, + { value: 'running', label: '运行中' }, + { value: 'stopped', label: '已停止' }, + ], + }, + }, + ], + }); + this.app.middleware.unshift(multiApps({ + getAppName(ctx) { + console.log('ctx.hostname', ctx.hostname); + const hostname = ctx.get('X-Hostname') || ctx.hostname; + if (!hostname) { + return; + } + const keys = hostname.split('.'); + if (keys.length < 4) { + return; + } + return keys.shift(); + }, + })); + this.app.db.on('applications.afterCreate', async (model: Model) => { + const name = model.get('name'); + (async () => { + await this.app.db.sequelize.query(`CREATE DATABASE "${name}";`); + const app = createApp({ + name, + }); + console.log('creating........') + await app.load(); + await app.db.sync({ + force: true, + alter: { + drop: true, + }, + }); + await app.emitAsync('beforeStart'); + await app.emitAsync('db.init'); + this.app['apps'].set(name, app); + model.set('status', 'running'); + await model.save({ hooks: false }); + await this.app.db.emitAsync('applications.afterInit', model); + })(); + }); + this.app + .command('app:db:sync') + .argument('') + .action(async (appName) => { + const app = createApp({ + name: appName, + }); + await app.load(); + await app.emitAsync('beforeStart'); + await app.db.sync(); + await app.destroy(); + await this.app.destroy(); + }); + + this.app + .command('app:create') + .argument('') + .action(async (name) => { + await this.app.db.sequelize.query(`CREATE DATABASE "${name}";`); + const app = createApp({ + name, + }); + console.log('creating........') + await app.load(); + await app.db.sync({ + force: true, + alter: { + drop: true, + }, + }); + await app.emitAsync('beforeStart'); + await app.emitAsync('db.init'); + await app.destroy(); + await this.app.destroy(); + }); + }, +} as PluginOptions; diff --git a/packages/plugin-multi-apps/src/test.ts b/packages/plugin-multi-apps/src/test.ts new file mode 100644 index 0000000000000000000000000000000000000000..54a455e9b0fbb9d99a797f7340db1e27cadec87a --- /dev/null +++ b/packages/plugin-multi-apps/src/test.ts @@ -0,0 +1,13 @@ +import { readFileSync } from 'fs'; +import glob from 'glob'; +import path from 'path'; + +function sql() { + const arr = []; + const files = glob.sync(path.resolve(__dirname, './db/*.sql')); + for (const file of files) { + const sql = readFileSync(file).toString(); + arr.push(sql); + } + return arr; +} diff --git a/packages/plugin-notifications/.npmignore b/packages/plugin-notifications/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/plugin-notifications/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/plugin-notifications/package.json b/packages/plugin-notifications/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ec297381f90457b71251889ac1a853af4070203a --- /dev/null +++ b/packages/plugin-notifications/package.json @@ -0,0 +1,11 @@ +{ + "name": "@nocobase/plugin-notifications", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "nodemailer": "^6.6.1" + }, + "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" +} diff --git a/packages/plugin-notifications/src/__tests__/notifications.test.ts b/packages/plugin-notifications/src/__tests__/notifications.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..d8e9ef4328b1faf91e19489f3d3fd4fcb5ce3eba --- /dev/null +++ b/packages/plugin-notifications/src/__tests__/notifications.test.ts @@ -0,0 +1,55 @@ +import Database, { Model, ModelCtor } from '@nocobase/database'; +import { Notification, NotificationService } from '../models'; +import nodemailerMock from 'nodemailer-mock'; +import { mockServer } from '@nocobase/test'; +import _ from 'lodash'; +import plugin from '../server'; + +jest.setTimeout(300000); + +describe('notifications', () => { + let db: Database; + let NotificationModel: ModelCtor; + + beforeEach(async () => { + const app = mockServer(); + app.plugin(plugin); + await app.load(); + db = app.db; + await db.sync(); + NotificationService.createTransport = nodemailerMock.createTransport; + NotificationModel = db.getModel('notifications') as ModelCtor; + }); + + afterEach(() => db.close()); + + it('create', async () => { + const notification = await NotificationModel.create({ + subject: 'Subject', + body: 'hell world', + receiver_options: { + data: 'to@nocobase.com', + fromTable: 'users', + filter: {}, + dataField: 'email', + }, + }); + await notification.updateAssociations({ + service: { + type: 'email', + title: '阿里云邮件推送', + options: { + host: 'smtpdm.aliyun.com', + port: 465, + secure: true, + auth: { + user: 'from@nocobase.com', + pass: 'pass', + }, + from: 'NocoBase', + }, + }, + }); + await notification.send(); + }); +}); diff --git a/packages/plugin-notifications/src/collections/notification_logs.ts b/packages/plugin-notifications/src/collections/notification_logs.ts new file mode 100644 index 0000000000000000000000000000000000000000..95d1242d8d12cf27ae508ad4b3e0cfa1efb5b3fb --- /dev/null +++ b/packages/plugin-notifications/src/collections/notification_logs.ts @@ -0,0 +1,24 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'notification_logs', + model: 'NotificationLog', + title: '通知日志', + fields: [ + { + title: '接收人', + type: 'json', + name: 'receiver', + }, + { + title: '状态', + type: 'string', + name: 'state', + }, + { + title: '详情', + type: 'json', + name: 'response', + }, + ] +} as TableOptions; diff --git a/packages/plugin-notifications/src/collections/notification_services.ts b/packages/plugin-notifications/src/collections/notification_services.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bd31ca56a8bee310ef1b4ed1a01d9cc02ebbfc9 --- /dev/null +++ b/packages/plugin-notifications/src/collections/notification_services.ts @@ -0,0 +1,24 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'notification_services', + model: 'NotificationService', + title: '通知服务', + fields: [ + { + title: '类型', + type: 'string', + name: 'type', + }, + { + title: '服务名称', + type: 'string', + name: 'title', + }, + { + title: '配置信息', + type: 'json', + name: 'options', + }, + ] +} as TableOptions; diff --git a/packages/plugin-notifications/src/collections/notifications.ts b/packages/plugin-notifications/src/collections/notifications.ts new file mode 100644 index 0000000000000000000000000000000000000000..f9d6cebb21cc40684b75317c2b307de965ef2825 --- /dev/null +++ b/packages/plugin-notifications/src/collections/notifications.ts @@ -0,0 +1,41 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'notifications', + model: 'Notification', + title: '通知', + fields: [ + { + type: 'uid', + name: 'name', + prefix: 'n_', + }, + { + title: '主题', + type: 'string', + name: 'subject', + }, + { + title: '内容', + type: 'text', + name: 'body', + }, + { + title: '接收人配置', + type: 'json', + name: 'receiver_options', + }, + { + title: '发送服务', + type: 'belongsTo', + name: 'service', + target: 'notification_services', + }, + { + title: '日志', + type: 'hasMany', + name: 'logs', + target: 'notification_logs', + }, + ] +} as TableOptions; diff --git a/packages/plugin-notifications/src/models/Notification.ts b/packages/plugin-notifications/src/models/Notification.ts new file mode 100644 index 0000000000000000000000000000000000000000..cffd737bb5d7a6156892e12286e652187a1c85cd --- /dev/null +++ b/packages/plugin-notifications/src/models/Notification.ts @@ -0,0 +1,68 @@ +import { Model } from '@nocobase/database'; +import { NotificationService } from './NotificationService'; +import _ from 'lodash'; + +export class Notification extends Model { + + async getReceiversByOptions(): Promise { + const { data, fromTable, filter, dataField } = this.receiver_options; + let receivers = []; + if (data) { + receivers = Array.isArray(data) ? data : [data]; + } else if (fromTable) { + const M = this.database.getModel(fromTable); + const rows = await M.findAll(M.parseApiJson2({ + filter, + })); + receivers = rows.map(row => row[dataField]); + } + return receivers; + } + + async send(options: any = {}) { + if (!this.service) { + this.service = await this.getService(); + } + const receivers = await this.getReceiversByOptions(); + let { to } = options; + if (to) { + to = Array.isArray(to) ? to : [to]; + receivers.push(...to); + } + console.log(receivers) + for (const receiver of receivers) { + try { + const response = await (this.service as NotificationService).send({ + to: receiver, + subject: this.getSubject(), + html: this.getBody(options), + }); + await this.createLog({ + receiver, + state: 'success', + response, + }); + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); + } catch (error) { + console.error(error); + await this.createLog({ + receiver, + state: 'fail', + response: {}, + }); + } + } + } + + getSubject() { + return this.subject; + } + + getBody(data) { + const compiled = _.template(this.body) + const body = compiled(data); + return body; + } +} diff --git a/packages/plugin-notifications/src/models/NotificationLog.ts b/packages/plugin-notifications/src/models/NotificationLog.ts new file mode 100644 index 0000000000000000000000000000000000000000..0587cfa0ea7bac901a240b70d0ff109d21d84bc5 --- /dev/null +++ b/packages/plugin-notifications/src/models/NotificationLog.ts @@ -0,0 +1,5 @@ +import { Model } from '@nocobase/database'; + +export class NotificationLog extends Model { + +} diff --git a/packages/plugin-notifications/src/models/NotificationService.ts b/packages/plugin-notifications/src/models/NotificationService.ts new file mode 100644 index 0000000000000000000000000000000000000000..3270aca707ef9d9276bdf31deacf3bf89bcdf96b --- /dev/null +++ b/packages/plugin-notifications/src/models/NotificationService.ts @@ -0,0 +1,24 @@ +import { Model } from '@nocobase/database'; +import nodemailer from 'nodemailer'; + +export class NotificationService extends Model { + + static createTransport = nodemailer.createTransport; + + get transporter() { + if (this._transporter) { + return this._transporter; + } + return this._transporter = NotificationService.createTransport(this.options); + } + + async send(options) { + const { from } = this.options; + const mailOptions = { + from, + ...options, + }; + console.log({ mailOptions }); + return this.transporter.sendMail(mailOptions); + } +} diff --git a/packages/plugin-notifications/src/models/index.ts b/packages/plugin-notifications/src/models/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..190994a9d4717b1d4557aec1d9365798d1192753 --- /dev/null +++ b/packages/plugin-notifications/src/models/index.ts @@ -0,0 +1,3 @@ +export * from './Notification'; +export * from './NotificationLog'; +export * from './NotificationService'; diff --git a/packages/plugin-notifications/src/server.ts b/packages/plugin-notifications/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5e9c169e4fc744173ef343f79907be9eb60abb3 --- /dev/null +++ b/packages/plugin-notifications/src/server.ts @@ -0,0 +1,15 @@ +import path from 'path'; +import Database, { registerModels } from '@nocobase/database'; +import { PluginOptions } from '@nocobase/server'; +import * as models from './models'; + +registerModels(models); + +export default { + name: 'notifications', + async load() { + this.app.db.import({ + directory: path.resolve(__dirname, 'collections'), + }); + } +} as PluginOptions diff --git a/packages/plugin-pages/package.json b/packages/plugin-pages/package.json deleted file mode 100644 index d5a8a8045ba96605dec6ff8c84a3745796156070..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "@nocobase/plugin-pages", - "version": "0.4.0-alpha.7", - "main": "lib/index.js", - "license": "MIT", - "dependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7", - "crypto-random-string": "^3.3.1" - }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" -} diff --git a/packages/plugin-pages/src/actions/getCollection.ts b/packages/plugin-pages/src/actions/getCollection.ts deleted file mode 100644 index d85848efe617605d58d16fae242ea02a5b6d37e2..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getCollection.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; - -export default async (ctx, next) => { - const { resourceName, resourceKey } = ctx.action.params; - const [Collection, Field, Tab, View] = ctx.db.getModels(['collections', 'fields', 'tabs', 'views']) as ModelCtor[]; - const collection = await Collection.findOne(Collection.parseApiJson({ - filter: { - name: resourceName, - }, - })); - const permissions = (await ctx.ac.isRoot() || collection.developerMode || collection.internal) - ? await ctx.ac.getRootPermissions() - : await ctx.ac.can(resourceName).permissions(); - const defaultView = await collection.getViews({ - where: { - default: true, - }, - limit: 1, - plain: true, - }); - collection.setDataValue('defaultViewName', defaultView.get('name')); - const options = Tab.parseApiJson({ - filter: ctx.state.developerMode ? { - 'id.in': permissions.tabs, - enabled: true, - } : { - 'id.in': permissions.tabs, - enabled: true, - developerMode: { '$isFalsy': true }, - }, - fields: { - appends: ['associationField'], - }, - sort: ['sort'], - }); - const tabs = await collection.getTabs(options) as Model[]; - const tabItems = []; - for (const tab of tabs) { - const itemTab = { - ...tab.get(), - }; - if (itemTab.type === 'details' && !itemTab.viewName) { - itemTab.viewName = 'details'; - } - // if (itemTab.type == 'association') { - // itemTab.field = await collection.getFields({ - // where: { - // name: itemTab.association, - // }, - // limit: 1, - // plain: true, - // }); - // } - tabItems.push(itemTab); - } - ctx.body = { - ...collection.toJSON(), - tabs: tabItems, - }; - await next(); -} diff --git a/packages/plugin-pages/src/actions/getCollections.ts b/packages/plugin-pages/src/actions/getCollections.ts deleted file mode 100644 index 8984039235f0757c89265313d71914c2594c36c3..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getCollections.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; -import _ from 'lodash'; - -async function getPageInfo(ctx, { resourceName, resourceKey }) { - // const { resourceName, resourceKey } = ctx.action.params; - const M = ctx.db.getModel(resourceName) as ModelCtor; - const model = await M.findByPk(resourceKey); - const Field = ctx.db.getModel('fields') as ModelCtor; - const field = await Field.findOne({ - where: { - collection_name: resourceName, - type: 'string', - }, - order: [['sort', 'asc']], - }); - return { - pageTitle: field ? (model.get(field.get('name')) || `#${model.get(M.primaryKeyAttribute)} 无标题`) : model.get(M.primaryKeyAttribute), - ...model.toJSON(), - }; -}; - - -async function getCollection(ctx, resourceName) { - const [Collection, Field, Tab, View] = ctx.db.getModels(['collections', 'fields', 'tabs', 'views']) as ModelCtor[]; - const collection = await Collection.findOne(Collection.parseApiJson({ - filter: { - name: resourceName, - }, - })); - const permissions = (await ctx.ac.isRoot() || collection.developerMode || collection.internal) - ? await ctx.ac.can(resourceName).getRootPermissions() - : await ctx.ac.can(resourceName).permissions(); - const defaultView = await collection.getViews({ - where: { - default: true, - }, - limit: 1, - plain: true, - }); - collection.setDataValue('defaultViewName', defaultView.get('name')); - const options = Tab.parseApiJson({ - filter: ctx.state.developerMode ? { - 'id.in': permissions.tabs, - enabled: true, - } : { - 'id.in': permissions.tabs, - enabled: true, - developerMode: { '$isFalsy': true }, - }, - fields: { - appends: ['associationField'], - }, - sort: ['sort'], - }); - const tabs = await collection.getTabs(options) as Model[]; - const tabItems = []; - for (const tab of tabs) { - const itemTab = { - ...tab.get(), - }; - if (itemTab.type === 'details' && !itemTab.viewName) { - itemTab.viewName = 'details'; - } - // if (itemTab.type == 'association') { - // itemTab.field = await collection.getFields({ - // where: { - // name: itemTab.association, - // }, - // limit: 1, - // plain: true, - // }); - // } - tabItems.push(itemTab); - } - return { - ...collection.toJSON(), - tabs: tabItems, - }; -} - -export default async (ctx, next) => { - const { resourceName, values = {} } = ctx.action.params; - const { tabs: items = [] } = values; - // console.log({items}) - const collection = await getCollection(ctx, resourceName); - - ctx.body = [ - collection, - ]; - - const lastItem = items.pop(); - - for (const item of items) { - const lastCollection = ctx.body[ctx.body.length - 1]; - lastCollection.pageInfo = await getPageInfo(ctx, { resourceName: lastCollection.name, resourceKey: item.itemId }); - const activeTab = _.find(lastCollection.tabs, tab => tab.name == item.tabName) || {}; - if (activeTab && activeTab.type === 'association') { - // console.log(activeTab.associationField.target); - const nextCollection = await getCollection(ctx, activeTab.associationField.target); - ctx.body.push(nextCollection); - } - } - - const lastCollection = ctx.body[ctx.body.length - 1]; - lastCollection.pageInfo = await getPageInfo(ctx, { resourceName: lastCollection.name, resourceKey: lastItem.itemId }); - - await next(); -} diff --git a/packages/plugin-pages/src/actions/getInfo.ts b/packages/plugin-pages/src/actions/getInfo.ts deleted file mode 100644 index 2c370786833ab769ac97b15bb6b9c61302a917d9..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getInfo.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ResourceOptions } from '@nocobase/resourcer'; -import { Model, ModelCtor } from '@nocobase/database'; -import _ from 'lodash'; -import { Op } from 'sequelize'; - -export default async (ctx, next) => { - const { resourceKey } = ctx.action.params; - let primaryKey: any; - let pageName: any; - let collectionName: any; - const roles = ctx.ac ? await ctx.ac.getRoles() : []; - const isRoot = ctx.ac.constructor.isRoot(roles); - const MenuPermission = ctx.db.getModel('menus_permissions'); - const menu_permissions = await MenuPermission.findAll({ - where: { - role_id: { - [Op.in]: roles.map(role => role.id), - } - } - }); - const menuIds = menu_permissions.map(item => item.menu_id); - const Menu = ctx.db.getModel('menus') as ModelCtor; - const menu = await Menu.findOne({ - where: isRoot ? { - name: resourceKey, - } : { - id: { - [Op.in]: menuIds, - }, - name: resourceKey, - } - }); - if (!menu) { - ctx.throw(404, 'Not Found'); - } - const body: any = { - ...menu.toJSON(), - }; - if (body.views) { - const views = []; - for (const item of body.views) { - let name: string; - if (typeof item === 'object') { - if (item.view) { - item.name = item.view.collection_name ? `${item.view.collection_name}.${item.view.name}` : item.view.name; - } - views.push(item); - } else if (typeof item === 'string') { - views.push({ - name: item, - width: '100%', - }); - } - } - body.views = views; - } - ctx.body = body; - await next(); -}; diff --git a/packages/plugin-pages/src/actions/getPageInfo.ts b/packages/plugin-pages/src/actions/getPageInfo.ts deleted file mode 100644 index cb59809c0d1bba054f82a7c49187643424a9b908..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getPageInfo.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ResourceOptions } from '@nocobase/resourcer'; -import { Model, ModelCtor } from '@nocobase/database'; - -export default async (ctx, next) => { - const { resourceName, resourceKey } = ctx.action.params; - const M = ctx.db.getModel(resourceName) as ModelCtor; - const model = await M.findByPk(resourceKey); - const Field = ctx.db.getModel('fields') as ModelCtor; - const field = await Field.findOne({ - where: { - collection_name: resourceName, - type: 'string', - }, - order: [['sort', 'asc']], - }); - ctx.body = { - pageTitle: field ? (model.get(field.get('name')) || `#${model.get(M.primaryKeyAttribute)} 无标题`) : model.get(M.primaryKeyAttribute), - ...model.toJSON(), - }; - await next(); -}; diff --git a/packages/plugin-pages/src/actions/getRoutes.ts b/packages/plugin-pages/src/actions/getRoutes.ts deleted file mode 100644 index af9e10d028e802320e7c5ab0e75027741ca74493..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getRoutes.ts +++ /dev/null @@ -1,181 +0,0 @@ -import Database from '@nocobase/database'; -import { ResourceOptions } from '@nocobase/resourcer'; -import { flatToTree } from '../utils'; -import { get } from 'lodash'; -import { Op } from 'sequelize'; - -function pages2routes(pages: Array) { - let routes: any = {}; - pages.forEach(page => { - const { children = [], ...restProps } = page; - const route: any = { - ...restProps, - }; - // page.type === 'layout' && - if (!page.redirect && children.length) { - const items = children.filter(item => item.showInMenu).sort((a, b) => a.sort - b.sort); - const redirect = get(items, [0, 'path']); - if (redirect) { - route.redirect = redirect; - } - } - if (page.type === 'layout' && children.length) { - const items = children.filter(item => item.showInMenu).sort((a, b) => a.sort - b.sort); - route.menu = items.map(child => ({ - ...child, - title: child.title, - path: child.path, - sort: child.sort, - })); - } - if (page.children) { - routes = { ...routes, ...pages2routes(page.children) }; - } - routes[page.path] = route; - }); - return routes; -} - -export default async function getRoutes(ctx, next) { - const database: Database = ctx.database; - const Page = database.getModel('pages'); - const View = database.getModel('views'); - const Collection = database.getModel('collections'); - const RoutePermission = database.getModel('routes_permissions'); - const roles = ctx.ac ? await ctx.ac.getRoles() : []; - // TODO(optimize): isRoot 的判断需要在内部完成,尽量不要交给调用者 - const isRoot = true; // ctx.ac ? ctx.ac.constructor.isRoot(roles) : true; - const routesPermissionsMap = new Map(); - if (!isRoot) { - const routesPermissions = await RoutePermission.findAll({ - where: { - role_id: roles.map(({ id }) => id) - } - }); - routesPermissions.forEach(permission => { - routesPermissionsMap.set(`${permission.routable_type}:${permission.routable_id}`, permission); - }); - } - let pages = await Page.findAll(Page.parseApiJson(ctx.state.developerMode ? { - filter: { - }, - sort: ['sort'], - } : { - filter: { - developerMode: { '$isFalsy': true }, - }, - sort: ['sort'], - })); - const items = []; - for (const page of pages) { - if (!isRoot - && !routesPermissionsMap.has(`pages:${page.id}`) - // 以下路径先临时处理 - && page.get('path') !== '/' - && page.get('path') !== '/admin' - && page.get('path') !== '/register' - && page.get('path') !== '/login' - ) { - continue; - } - items.push(page.toJSON()); - if (page.get('path') === '/collections') { - const collections = await Collection.findAll(Collection.parseApiJson(ctx.state.developerMode ? { - filter: { - showInDataMenu: true, - }, - sort: ['sort'], - } : { - filter: { - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - }, - sort: ['sort'], - })); - for (const collection of collections) { - if (!isRoot && !routesPermissionsMap.has(`collections:${collection.id}`)) { - continue; - } - const pageId = `collection-${collection.id}`; - items.push({ - id: pageId, - type: 'collection', - collection: collection.get('name'), - title: collection.get('title'), - icon: collection.get('icon'), - path: `/collections/${collection.name}`, - parent_id: page.id, - showInMenu: true, - sort: collection.get('sort'), - }); - const views = await collection.getViews({ - where: { - [Op.or]: [ - { showInDataMenu: true }, - { default: true } - ] - }, - order: [['sort', 'asc']] - }); - if (views.length > 1) { - for (const view of views) { - if (!isRoot && !routesPermissionsMap.has(`views:${view.id}`)) { - continue; - } - items.push({ - id: `view-${view.get('id')}`, - type: 'collection', - collection: collection.get('name'), - title: view.title, - viewName: view.name, - path: `/collections/${collection.name}/views/${view.name}`, - parent_id: pageId, - showInMenu: true, - sort: view.get('sort'), - }); - } - } - } - } else if (page.get('path') === '/users/users') { - const userViews = await View.findAll(View.parseApiJson(ctx.state.developerMode ? { - filter: { - collection_name: 'users', - showInDataMenu: true, - }, - sort: ['sort'], - } : { - filter: { - collection_name: 'users', - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - }, - sort: ['sort'], - })); - if (userViews.length > 1) { - for (const view of userViews) { - if (!isRoot && !routesPermissionsMap.has(`views:${view.id}`)) { - continue; - } - items.push({ - id: `view-${view.get('id')}`, - type: 'collection', - collection: 'users', - title: view.title, - viewName: view.name, - path: `${page.get('path')}/views/${view.name}`, - parent_id: page.id, - showInMenu: true, - sort: view.get('sort'), - }); - } - } - } - } - const data = flatToTree(items, { - id: 'id', - parentId: 'parent_id', - children: 'children', - }); - ctx.body = pages2routes(data); - await next(); -} diff --git a/packages/plugin-pages/src/actions/getTree.ts b/packages/plugin-pages/src/actions/getTree.ts deleted file mode 100644 index e75388fbc222920487f3c05045f8a175b4de3df5..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getTree.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; -import { flatToTree } from '../utils'; -import { Op } from 'sequelize'; - -export function generateName(): string { - return `${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} - -function toPaths(item) { - if (!Array.isArray(item.children)) { - return []; - } - if (item.children.length === 0) { - return []; - } - let paths = []; - for (const child of item.children) { - if (child.path && !child.children) { - paths.push(child.path); - } - if (child.children) { - child.paths = toPaths(child); - paths = paths.concat(child.paths); - } - } - return paths; -} - -export default async (ctx, next) => { - const { resourceName, resourceKey } = ctx.action.params; - const [Menu] = ctx.db.getModels(['menus']) as ModelCtor[]; - const roles = ctx.ac ? await ctx.ac.getRoles() : []; - const isRoot = ctx.ac.constructor.isRoot(roles); - const MenuPermission = ctx.db.getModel('menus_permissions'); - const menu_permissions = await MenuPermission.findAll({ - where: { - role_id: { - [Op.in]: roles.map(role => role.id), - } - } - }); - const menuIds = menu_permissions.map(item => item.menu_id); - const menus = await Menu.findAll(Menu.parseApiJson({ - filter: isRoot ? { - } : { - 'id.in': menuIds, - }, - sort: 'sort', - })); - const data = flatToTree(menus.map(item => { - const json: any = item.toJSON(); - if (item.url) { - json.path = item.url; - } else { - json.path = item.name; - } - return json; - }), { - id: 'id', - parentId: 'parent_id', - children: 'children', - }); - const items = []; - for (const item of data) { - if (item.parent_id) { - continue; - } - item.paths = toPaths(item); - if (item.paths[0]) { - item.path = item.paths[0]; - } - items.push(item); - } - ctx.body = items; - await next(); -} diff --git a/packages/plugin-pages/src/actions/getView.ts b/packages/plugin-pages/src/actions/getView.ts deleted file mode 100644 index 6af3bc595a246a7d230b33b06405be6a77f2ff73..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/getView.ts +++ /dev/null @@ -1,589 +0,0 @@ -import { Model, ModelCtor, BELONGSTOMANY } from '@nocobase/database'; -import { get, set, isString } from 'lodash'; -import { Op } from 'sequelize'; - -const transforms = { - table: async (fields: Model[], context?: any) => { - const arr = []; - for (const field of fields) { - if (!field.get('component.showInTable')) { - continue; - } - if (!context.listFields.includes(field.id)) { - continue; - } - arr.push({ - ...field.get(), - sorter: field.get('sortable'), - dataIndex: field.name.split('.'), - }); - } - return arr; - }, - form: async (fields: Model[], ctx?: any) => { - const [Field] = ctx.db.getModels(['fields']) as ModelCtor[]; - const mode = get(ctx.action.params, ['values', 'mode'], ctx.action.params.mode); - const schema = {}; - for (const field of fields) { - if (field.get('component.type') === 'hidden') { - continue; - } - if (!field.get('component.showInForm')) { - continue; - } - if (!ctx.listFields.includes(field.id)) { - continue; - } - const interfaceType = field.get('interface'); - const type = field.get('component.type') || 'string'; - const prop: any = { - type, - title: field.title || field.name, - ...(field.component || {}), - } - if (field.interface === 'description') { - field.title && set(prop, 'x-component-props.title', field.title); - field.get('component.tooltip') && set(prop, 'x-component-props.children', field.get('component.tooltip')); - } - if (ctx.formMode === 'update') { - if (!ctx.updateFields.includes(field.id)) { - set(prop, 'x-component-props.disabled', true); - } - } else if (!ctx.createFields.includes(field.id)) { - set(prop, 'x-component-props.disabled', true); - } - if (field.get('name') === 'interface' && ctx.state.developerMode === false) { - const dataSource = field.get('dataSource').filter(item => item.key !== 'developerMode'); - field.set('dataSource', dataSource); - } - const { values } = ctx.action.params; - if (field.get('component.type') === 'filter' && get(values, 'associatedKey') && isString(get(values, 'associatedKey'))) { - const options = Field.parseApiJson(ctx.state.developerMode ? { - filter: { - collection_name: get(values, 'associatedKey'), - }, - sort: 'sort', - } : { - filter: { - collection_name: get(values, 'associatedKey'), - developerMode: { '$isFalsy': true }, - }, - sort: 'sort', - }); - const all = await Field.findAll(options); - set(prop, 'x-component-props.fields', all.filter(f => f.get('filterable'))); - } - if (type === 'select') { - prop.type = 'string' - } - if (field.get('component.tooltip')) { - // prop.description = `{{html('${encodeURIComponent(field.get('component.tooltip'))}')}}`; - } - if (field.get('name') === 'dataSource') { - - set(prop, 'x-component-props.operationsWidth', 'auto'); - set(prop, 'x-component-props.bordered', true); - set(prop, 'x-component-props.className', 'data-source-table'); - const properties = {}; - if (ctx.state.developerMode) { - Object.assign(properties, { - value: { - type: "string", - title: "值", - // required: true, - 'x-component-props': { - bordered: false, - }, - }, - }); - } - Object.assign(properties, { - label: { - type: "string", - title: "选项", - required: true, - 'x-component-props': { - bordered: false, - }, - }, - color: { - type: "colorSelect", - title: "颜色", - 'x-component-props': { - bordered: false, - }, - }, - }); - set(prop, 'items.properties', properties); - } - if (['number', 'percent'].includes(interfaceType) && field.get('precision')) { - set(prop, 'x-component-props.step', field.get('precision')); - } - if (field.get('required')) { - prop.required = true; - } - if (mode === 'update' && field.get('createOnly')) { - set(prop, 'x-component-props.disabled', true); - } - if (typeof field.get('showTime') === 'boolean') { - set(prop, 'x-component-props.showTime', field.get('showTime')); - } - const defaultValue = get(field.options, 'defaultValue'); - if (typeof defaultValue !== 'undefined') { - prop.default = defaultValue; - } - if (interfaceType === 'boolean') { - set(prop, 'x-component-props.children', prop.title); - delete prop.title; - } - if (interfaceType === 'linkTo') { - set(prop, 'x-component-props.associatedName', field.get('collection_name')); - set(prop, 'x-component-props.target', field.get('target')); - set(prop, 'x-component-props.multiple', field.get('multiple')); - set(prop, 'x-component-props.labelField', field.get('labelField')); - } - if (interfaceType === 'multipleSelect') { - set(prop, 'x-component-props.mode', 'multiple'); - } - if (interfaceType === 'subTable' && field.get('target')) { - set(prop, 'x-component-props.target', field.get('target')); - // resourceName - } - if (['radio', 'select', 'multipleSelect', 'checkboxes'].includes(interfaceType)) { - prop.enum = field.get('dataSource'); - } - if (interfaceType === 'chinaRegion') { - set(prop, 'x-component-props.target', field.get('target')); - set(prop, 'x-component-props.labelField', field.get('labelField')); - set(prop, 'x-component-props.valueField', field.get('targetKey')); - set(prop, 'x-component-props.parentField', field.get('parentField')); - set(prop, 'x-component-props.maxLevel', field.get('maxLevel')); - set(prop, 'x-component-props.changeOnSelect', field.get('incompletely')); - } - schema[field.name] = { - id: field.id, - ...prop, - }; - } - return schema; - }, - details: async (fields: Model[], context?: any) => { - const [Field] = context.db.getModels(['fields']) as ModelCtor[]; - const arr = []; - for (const field of fields) { - if (!get(field.component, 'showInDetail')) { - continue; - } - if (!context.listFields.includes(field.id)) { - continue; - } - const props = {}; - if (field.get('interface') === 'subTable') { - const children = await Field.findAll(Field.parseApiJson({ - filter: { - collection_name: field.get('target'), - }, - perPage: -1, - sort: ['sort'], - })); - // const children = await field.getChildren({ - // order: [['sort', 'asc']], - // }); - props['children'] = children.filter(item => item.get('component.showInTable')).map(child => ({ ...child.toJSON(), dataIndex: child.name.split('.') })) - } - arr.push({ - ...field.toJSON(), - ...props, - }); - } - return arr; - }, - filter: async (fields: Model[], ctx?: any) => { - const properties = { - filter: { - type: 'filter', - 'x-component-props': { - fields: fields.filter(field => ctx.listFields.includes(field.id) && field.get('filterable')), - }, - }, - } - return properties; - }, -}; - -export default async (ctx, next) => { - const { resourceName, resourceKey, values = {} } = ctx.action.params; - const [View, Collection, Field, Action] = ctx.db.getModels(['views', 'collections', 'fields', 'actions']) as ModelCtor[]; - const collection = await Collection.findOne({ - where: { - name: resourceName, - }, - }); - let view = await View.findOne(View.parseApiJson({ - filter: { - collection_name: resourceName, - name: resourceKey, - }, - // fields: { - // appends: ['actions', 'fields'], - // }, - })); - let throughName; - const { resourceKey: resourceKey2, associatedName, resourceFieldName, associatedKey } = values; - // TODO: 暂时不处理 developerMode 和 internal 的情况 - const permissions = (await ctx.ac.isRoot() || collection.developerMode || collection.internal) - ? await ctx.ac.getRootPermissions() - : await ctx.ac.can(resourceName).permissions(); - ctx.listFields = []; - ctx.createFields = []; - ctx.updateFields = []; - ctx.allowedActions = []; - for (const action of permissions.actions) { - ctx.allowedActions.push(action.name); - } - // console.log(ctx.allowedActions); - for (const permissionField of permissions.fields) { - const pfc = permissionField.actions; - if (pfc.includes(`${resourceName}:list`)) { - ctx.listFields.push(permissionField.field_id); - } - if (pfc.includes(`${resourceName}:create`)) { - ctx.createFields.push(permissionField.field_id); - } - if (pfc.includes(`${resourceName}:update`)) { - ctx.updateFields.push(permissionField.field_id); - } - } - // console.log({ - // a: (await ctx.ac.isRoot() || collection.developerMode || collection.internal), - // listFields: ctx.listFields, - // createFields: ctx.createFields, - // updateFields: ctx.updateFields, - // }) - if (associatedName) { - const table = ctx.db.getTable(associatedName); - const resourceField = table.getField(resourceFieldName); - if (resourceField instanceof BELONGSTOMANY) { - // console.log({associatedName, resourceField}); - throughName = resourceField.options.through; - } - } - if (!view) { - // 如果不存在 view,新建一个 - view = new View({ type: resourceKey, template: 'FilterForm' }); - } - - // const where: any = { - // developerMode: ctx.state.developerMode, - // } - const filter: any = {} - if (!ctx.state.developerMode) { - filter.developerMode = { '$isFalsy': true } - } - if (!view.get('draggable')) { - filter.type = { - not: 'sort', - }; - } - const fieldOptions = Field.parseApiJson({ - filter, - sort: 'sort', - }); - let fields = await collection.getFields(fieldOptions); - fields = fields.filter(field => { - if (field.get('interface') === 'linkTo') { - if (throughName && throughName === field.get('through')) { - return false; - } - } - return true; - }) - const options = Action.parseApiJson(ctx.state.developerMode ? { - filter: {}, - sort: 'sort', - } : { - filter: { - developerMode: { '$isFalsy': true }, - }, - sort: 'sort', - }); - const actions = await collection.getActions(options); - let actionNames = view.get('actionNames') || []; - if (actionNames.length === 0 && resourceKey !== 'permissionTable') { - actionNames = ['filter', 'create', 'destroy']; - } - const defaultTabs = await collection.getTabs({ - where: { - id: { [Op.in]: permissions.tabs }, - }, - order: [['sort', 'asc']], - }); - - const defaultTab = defaultTabs.find(tab => tab.default) || get(defaultTabs, [0]); - - view.setDataValue('defaultTabName', get(defaultTab, ['name'])); - if (view.get('type') === 'table') { - view.setDataValue('rowViewName', 'form'); - } - if (view.get('type') === 'calendar') { - view.setDataValue('template', 'Calendar'); - view.setDataValue('rowViewName', 'form'); - } - if (view.get('updateViewName')) { - view.setDataValue('rowViewName', view.get('updateViewName')); - } - if (!view.get('template')) { - if (view.get('type') === 'table') { - view.setDataValue('template', 'Table'); - } else if (view.get('type') === 'calendar') { - view.setDataValue('template', 'Calendar'); - } - } - // view.setDataValue('viewCollectionName', view.collection_name); - let title = collection.get('title'); - const mode = get(ctx.action.params, ['values', 'mode'], ctx.action.params.mode); - ctx.formMode = mode; - if (mode === 'update') { - title = `编辑${title}`; - } else { - title = `新增${title}`; - } - const viewType = view.get('type'); - const actionDefaultParams: any = {}; - if (resourceName === 'collections') { - actionDefaultParams.sort = ['sort']; - } - if (view.filter) { - actionDefaultParams.filter = view.filter; - } - const appends = []; - - const others: any = {}; - - if (viewType === 'form') { - if (associatedName === 'automations' && resourceFieldName === 'jobs' && mode !== 'update') { - const Automation = ctx.db.getModel('automations'); - others['initialValues'] = { - automation: await Automation.findByPk(associatedKey), - }; - } - } - - for (const field of fields) { - if (!['subTable', 'linkTo', 'attachment', 'createdBy', 'updatedBy', 'chinaRegion'].includes(field.get('interface'))) { - continue; - } - let showInKey; - switch (viewType) { - case 'table': - showInKey = 'showInTable'; - break; - case 'form': - showInKey = 'showInForm'; - break; - case 'details': - showInKey = 'showInDetail'; - break; - } - if (showInKey && field.get(`component.${showInKey}`)) { - appends.push(field.name); - if (field.get('interface') === 'attachment') { - appends.push(`${field.name}.storage`); - } - if (field.get('interface') === 'subTable') { - const children = await field.getChildren(); - // console.log(children); - for (const child of children) { - if (!['subTable', 'linkTo', 'attachment', 'updatedBy', 'createdBy'].includes(child.get('interface'))) { - continue; - } - appends.push(`${field.name}.${child.name}`); - } - } - } - } - actionDefaultParams['fields[appends]'] = appends.join(','); - if (resourceFieldName === 'pages' && resourceKey === 'permissionTable') { - ctx.body = { - ...view.get(), - title, - actionDefaultParams, - original: fields, - disableRowClick: true, - fields: [ - { - "title": "页面", - "name": "title", - "interface": "string", - "type": "string", - "parent_id": null, - "required": true, - "developerMode": false, - "component": { - "type": "string", - "className": "drag-visible", - "showInForm": true, - "showInTable": true, - "showInDetail": true - }, - "dataIndex": ["title"] - }, - { - "title": "访问权限", - "name": "accessible", - "interface": "boolean", - "type": "boolean", - "parent_id": null, - "required": true, - "editable": true, - "resource": 'roles.pages', - "developerMode": false, - "component": { - "type": "boolean", - "showInTable": true, - }, - "dataIndex": ["accessible"] - } - ], - }; - } else if (resourceFieldName === 'collections' && resourceKey === 'permissionTable') { - ctx.body = { - ...view.get(), - title, - actionDefaultParams, - original: fields, - rowKey: 'name', - fields: [ - { - "title": "数据表名称", - "name": "title", - "interface": "string", - "type": "string", - "parent_id": null, - "required": true, - "developerMode": false, - "component": { - "type": "string", - "className": "drag-visible", - "showInForm": true, - "showInTable": true, - "showInDetail": true - }, - "dataIndex": ["title"] - }, - { - "title": "描述", - "name": "permissions[0].description", - "interface": "string", - "type": "string", - "parent_id": null, - "required": true, - "developerMode": false, - "component": { - "type": "string", - "className": "drag-visible", - "showInForm": true, - "showInTable": true, - "showInDetail": true - }, - "dataIndex": ["permissions", 0, 'description'] - } - ], - }; - } else if ( - (resourceFieldName === 'collections' && resourceKey === 'permissionForm') - || - (resourceFieldName === 'roles' && resourceKey === 'permissionForm') - ) { - ctx.body = { - ...view.get(), - title, - actionDefaultParams, - original: fields, - fields: { - actions: { - type: 'permissions.actions', - title: '数据操作权限', - 'x-linkages': [ - { - type: "value:schema", - target: "actions", - schema: { - "x-component-props": { - resourceKey: resourceFieldName === 'roles' ? associatedKey : "{{ $form.values && $form.values.resourceKey }}" - }, - }, - }, - ], - 'x-component-props': { - dataSource: [], - }, - }, - fields: { - type: 'permissions.fields', - title: '字段权限', - 'x-linkages': [ - { - type: "value:schema", - target: "fields", - schema: { - "x-component-props": { - resourceKey: resourceFieldName === 'roles' ? associatedKey : "{{ $form.values && $form.values.resourceKey }}" - }, - }, - }, - ], - 'x-component-props': { - dataSource: [], - } - }, - tabs: { - type: 'permissions.tabs', - title: '标签页权限', - 'x-linkages': [ - { - type: "value:schema", - target: "tabs", - schema: { - "x-component-props": { - resourceKey: resourceFieldName === 'roles' ? associatedKey : "{{ $form.values && $form.values.resourceKey }}" - }, - }, - }, - ], - 'x-component-props': { - dataSource: [], - } - }, - description: { - type: 'textarea', - title: '权限描述', - }, - }, - }; - } else { - let allowedUpdate = false; - if (view.type === 'details' && await ctx.ac.can(resourceName).act('update').one(resourceKey2)) { - allowedUpdate = true; - } - ctx.body = { - ...view.get(), - ...others, - title, - actionDefaultParams, - original: fields, - fields: await (transforms[view.type] || transforms.table)(fields, ctx), - actions: actions.filter(action => { - if (view.type === 'details' && action.name === 'update') { - return allowedUpdate; - } - return actionNames.includes(action.name) && ctx.allowedActions.includes(`${resourceName}:${action.name}`); - }).map(action => ({ - ...action.toJSON(), - ...action.options, - // viewCollectionName: action.collection_name, - })), - }; - } - await next(); -}; diff --git a/packages/plugin-pages/src/actions/menus.ts b/packages/plugin-pages/src/actions/menus.ts deleted file mode 100644 index 0c2caeb2665bb93e5bb5d1d053be1eed3d4e0b31..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/menus.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Model, ModelCtor } from '@nocobase/database'; -import { actions } from '@nocobase/actions'; -import { flatToTree } from '../utils'; - -export const list = async (ctx, next) => { - await actions.common.list(ctx, async () => { - const items = ctx.body.rows as any; - ctx.body.rows = flatToTree(items.map(item => item.toJSON()), { - id: 'id', - parentId: 'parent_id', - children: 'children', - }); - }); - await next(); -} \ No newline at end of file diff --git a/packages/plugin-pages/src/actions/roles.menus.ts b/packages/plugin-pages/src/actions/roles.menus.ts deleted file mode 100644 index 2d7c2765ef3a2c053db05feab52871363ac99c7e..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/roles.menus.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Op } from 'sequelize'; -import { actions } from '@nocobase/actions'; -import _ from 'lodash'; -import { flatToTree } from '../utils'; - -export async function list(ctx: any, next: actions.Next) { - const { associated, associatedKey } = ctx.action.params; - // TODO: 暂时 action 中间件就这么写了 - ctx.action.mergeParams({ - associated: null - }); - await actions.common.list(ctx, async () => { - }); - const MenuPermission = ctx.db.getModel('menus_permissions'); - const rows = ctx.body.rows as any; - for (const row of rows) { - row.setDataValue('associatedKey', associatedKey); - const mp = await MenuPermission.findOne({ - where: { - role_id: associatedKey, - menu_id: row.id, - }, - }); - row.setDataValue('accessible', !!mp); - } - ctx.body.rows = flatToTree(rows.map(item => item.toJSON()), { - id: 'id', - parentId: 'parent_id', - children: 'children', - }); - await next(); -} diff --git a/packages/plugin-pages/src/actions/roles.pages.ts b/packages/plugin-pages/src/actions/roles.pages.ts deleted file mode 100644 index b9cc5fd8470335b4583ab1c22899e3748cdd6d2d..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/roles.pages.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { actions } from '@nocobase/actions'; -import Database from '@nocobase/database'; -import { flatToTree } from '../utils'; -import { Op } from 'sequelize'; - -async function getRoutes(ctx) { - const database: Database = ctx.db; - const Page = database.getModel('pages'); - const View = database.getModel('views'); - const Collection = database.getModel('collections'); - let pages = await Page.findAll(Page.parseApiJson(ctx.state.developerMode ? { - filter: { - 'parent_id.$notNull': true, - }, - sort: ['sort'], - } : { - filter: { - 'parent_id.$notNull': true, - developerMode: { '$isFalsy': true }, - }, - sort: ['sort'], - })); - const items = []; - for (const page of pages) { - items.push({ - routable_type: 'pages', - routable_id: page.id, - }); - if (page.get('path') === '/collections') { - const collections = await Collection.findAll(Collection.parseApiJson(ctx.state.developerMode ? { - filter: { - showInDataMenu: true, - }, - sort: ['sort'], - } : { - filter: { - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - }, - sort: ['sort'], - })); - for (const collection of collections) { - items.push({ - routable_type: 'collections', - routable_id: collection.id, - }); - const views = await collection.getViews({ - where: { - [Op.or]: [ - { showInDataMenu: true }, - { default: true } - ] - }, - order: [['sort', 'asc']] - }); - if (views.length > 1) { - for (const view of views) { - items.push({ - routable_id: view.id, - routable_type: 'views', - }); - } - } - } - } else if (page.get('path') === '/users/users') { - const userViews = await View.findAll(View.parseApiJson(ctx.state.developerMode ? { - filter: { - showInDataMenu: true, - collection_name: 'users', - }, - sort: ['sort'], - } : { - filter: { - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - collection_name: 'users', - }, - sort: ['sort'], - })); - if (userViews.length > 1) { - for (const view of userViews) { - items.push({ - routable_id: view.id, - routable_type: 'views', - }); - } - } - } - } - return items; -} - -export async function list(ctx: actions.Context, next: actions.Next) { - const database: Database = ctx.db; - const { associatedKey, associated } = ctx.action.params; - const Page = database.getModel('pages'); - const View = database.getModel('views'); - const Collection = database.getModel('collections'); - // TODO(optimize): isRoot 的判断需要在内部完成,尽量不要交给调用者 - const isRoot = ctx.ac.constructor.isRoot(associated); - const routesPermissionsMap = new Map(); - if (!isRoot) { - const routesPermissions = await associated.getRoutes(); - - routesPermissions.forEach(permission => { - routesPermissionsMap.set(`${permission.routable_type}:${permission.routable_id}`, permission); - }); - } - let pages = await Page.findAll(Page.parseApiJson(ctx.state.developerMode ? { - filter: { - 'parent_id.$notNull': true, - }, - sort: ['sort'], - } : { - filter: { - 'parent_id.$notNull': true, - developerMode: { '$isFalsy': true }, - }, - sort: ['sort'], - })); - const items = []; - for (const page of pages) { - items.push({ - id: page.id, - key: `page-${page.id}`, - title: page.title, - tableName: 'pages', - parent_id: `page-${page.parent_id}`, - associatedKey, - accessible: isRoot || routesPermissionsMap.has(`pages:${page.id}`), // TODO 对接权限 - }); - if (page.get('path') === '/collections') { - const collections = await Collection.findAll(Collection.parseApiJson(ctx.state.developerMode ? { - filter: { - showInDataMenu: true, - }, - sort: ['sort'], - } : { - filter: { - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - }, - sort: ['sort'], - })); - for (const collection of collections) { - items.push({ - associatedKey, - id: collection.id, - key: `collection-${collection.id}`, - tableName: 'collections', - title: collection.get('title'), - parent_id: `page-${page.id}`, - accessible: isRoot || routesPermissionsMap.has(`collections:${collection.id}`), // TODO 对接权限 - }); - const views = await collection.getViews({ - where: { - [Op.or]: [ - { showInDataMenu: true }, - { default: true } - ] - }, - order: [['sort', 'asc']] - }); - if (views.length > 1) { - for (const view of views) { - items.push({ - associatedKey, - id: view.id, - tableName: 'views', - title: view.title, - key: `view-${view.id}`, - parent_id: `collection-${collection.id}`, - accessible: isRoot || routesPermissionsMap.has(`views:${view.id}`), // TODO 对接权限 - }); - } - } - } - } else if (page.get('path') === '/users/users') { - const userViews = await View.findAll(View.parseApiJson(ctx.state.developerMode ? { - filter: { - showInDataMenu: true, - collection_name: 'users', - }, - sort: ['sort'], - } : { - filter: { - collection_name: 'users', - developerMode: { '$isFalsy': true }, - showInDataMenu: true, - }, - sort: ['sort'], - })); - if (userViews.length > 1) { - for (const view of userViews) { - items.push({ - associatedKey, - id: view.id, - tableName: 'views', - title: view.title, - key: `view-${view.id}`, - parent_id: `page-${page.id}`, - accessible: isRoot || routesPermissionsMap.has(`views:${view.id}`), // TODO 对接权限 - }); - } - } - } - } - const data = flatToTree(items, { - id: 'key', - parentId: 'parent_id', - children: 'children', - }); - ctx.body = data; - // TODO: 暂时 action 中间件就这么写了 - // ctx.action.mergeParams({associated: null}); - // const { associatedKey } = ctx.action.params; - // ctx.action.mergeParams({ - // filter: { - // 'parent_id.$notNull': true, - // } - // }) - // const done = async () => { - // ctx.body.rows = ctx.body.rows.map(row => { - // row.setDataValue('tableName', 'pages'); - // row.setDataValue('associatedKey', parseInt(associatedKey)); - // return row.get(); - // }); - // console.log(ctx.body.rows); - // await next(); - // } - // return actions.common.list(ctx, done); -} - -export async function update(ctx: actions.Context, next: actions.Next) { - const { - associated, - resourceKey, - values: { - tableName, - accessible - } - } = ctx.action.params; - - if (!resourceKey) { - if (accessible === false) { - await associated.updateAssociations({ - routes: [], - }); - } else if (accessible === true) { - const routes = await getRoutes(ctx); - // console.log(routes); - await associated.updateAssociations({ - routes, - }); - } - ctx.body = {}; - return next(); - } - - // console.log(ctx.action.params, { routable_type: tableName, routable_id: resourceKey }); - let [route] = await associated.getRoutes({ - where: { routable_type: tableName, routable_id: resourceKey }, - limit: 1 - }); - if (accessible) { - if (!route) { - route = await associated.createRoute({ routable_type: tableName, routable_id: resourceKey }); - } - ctx.body = route; - } else { - if (route) { - await route.destroy(); - } - } - - await next(); -} diff --git a/packages/plugin-pages/src/actions/views_v2.ts b/packages/plugin-pages/src/actions/views_v2.ts deleted file mode 100644 index 4d50f3bb8e925f666252cac9ee11571b2381615e..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/actions/views_v2.ts +++ /dev/null @@ -1,404 +0,0 @@ -import { ResourceOptions } from '@nocobase/resourcer'; -import { Model, ModelCtor } from '@nocobase/database'; -import actions from '@nocobase/actions'; -import { merge } from '../utils'; -import _ from 'lodash'; -import { getViewTypeLinkages } from '../views'; - -export const getInfo = async (ctx: actions.Context, next) => { - const { resourceKey } = ctx.action.params; - const View = ctx.db.getModel('views_v2') as ModelCtor; - const Field = ctx.db.getModel('fields') as ModelCtor; - let primaryKey: string; - let viewName: string; - let collectionName: string; - let associatedName: string; - let resourceName: string; - let associationField: any; - - if (!resourceKey.includes('.')) { - const view = await View.findOne({ - where: { - name: resourceKey, - }, - }); - const viewData: any = view.toJSON(); - for (const [key, value] of Object.entries(viewData[`x-${viewData.type}-props`] || {})) { - if (_.get(viewData, key) === null || _.get(viewData, key) === undefined) { - _.set(viewData, key, value); - } - } - ctx.body = viewData; - return next(); - } - - if (resourceKey.includes('.')) { - const keys = resourceKey.split('.'); - viewName = keys.pop(); - const key1 = keys.shift(); - const key2 = keys.join('.'); - // const [key1, key2] = keys; - if (key2) { - const field = ctx.db.getTable(key1).getField(key2); - associationField = await Field.findOne({ - where: { - collection_name: key1, - name: key2, - }, - }); - collectionName = field.options.target; - associatedName = key1; - resourceName = key2; - } else { - collectionName = key1; - } - } - // console.log({viewName, collectionName, associatedName}) - let view = await View.findOne({ - where: { - name: viewName, - collection_name: collectionName - }, - }); - - if (view && view.type === 'form') { - const count = await Field.count({ - where: { - name: 'status', - collection_name: view.collection_name, - } - }); - const statusable = !!count;//!!ctx.db.getTable(view.collection_name).getField('status'); - if (statusable) { - view.setDataValue('statusable', statusable); - } - } - - const Collection = ctx.db.getModel('collections') as ModelCtor; - const M = ctx.db.getModel(collectionName) as ModelCtor; - - // if (!view && viewName === 'descriptions') { - // view = await View.findOne({ - // where: { - // name: 'form', - // collection_name: collectionName - // }, - // }); - // view.type = 'descriptions'; - // } - let viewData: any = view ? view.toJSON() : {}; - - if (view) { - viewData.fields = view.get(`x-${view.type}-props.fields`) || view.get('fields') || []; - viewData.actions = view.get(`x-${view.type}-props.actions`) || view.get('actions') || []; - viewData.details = view.get(`x-${view.type}-props.details`) || view.get('details') || []; - } - - if (!view) { - const collection = await Collection.findOne({ - where: { - name: collectionName, - } - }); - const fields = await collection.getFields({ - order: [['sort', 'asc']], - }); - if (viewName === 'table') { - viewData = { - collection_name: collectionName, - type: 'table', - name: 'table', - title: '全部数据', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - // labelField: 'title', - fields: fields.filter(field => { - return field.name !== 'action_logs'; - }).map(field => field.name), - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }; - } else if (viewName === 'form') { - viewData = { - collection_name: collectionName, - type: 'form', - name: 'form', - title: '表单', - actions: [ - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - } - ], - // labelField: 'title', - fields: fields.filter(field => { - return field.name !== 'action_logs'; - }).map(field => field.name), - }; - } else if (viewName === 'descriptions') { - viewData = { - collection_name: collectionName, - type: 'descriptions', - name: 'descriptions', - title: '详情', - // labelField: 'title', - actions: [], - fields: fields.filter(field => { - return field.name !== 'action_logs'; - }).map(field => field.name), - }; - } - } - - // ctx.body = {}; - // return next(); - - const fields = []; - for (const field of viewData.fields || []) { - let fieldName: any; - let json: any; - if (typeof field === 'string') { - fieldName = field; - } else if (typeof field === 'object') { - // console.log({field}); - if (field.field) { - const { field: f, ...others } = field; - fieldName = f.name; - json = { ...others }; - } else if (field.name) { - fieldName = field.name; - json = field; - } - } - const model = await Field.findOne({ - where: { - collection_name: viewData.collection_name, - name: fieldName, - }, - }); - if (model) { - const target = model.get('target'); - if (target && model.get('interface') === 'subTable') { - const children = await Field.findAll(Field.parseApiJson({ - filter: { - collection_name: target, - 'name.ne': 'action_logs', - }, - sort: 'sort', - })); - if (children.length) { - model.setDataValue('children', children); - } - } - model.setDataValue('dataIndex', model.name.split('.')); - if (typeof field === 'object') { - json = merge(model.toJSON(), json); - } else { - json = model.toJSON(); - } - } - if (!json.name) { - continue; - } - // console.log({field, json}) - if (json.name === 'type' && json.collection_name === 'views_v2') { - json.linkages = getViewTypeLinkages(); - } - json && fields.push(json); - } - - const actions = []; - const toFields = async (values = []) => { - const fields = []; - for (const value of values) { - if (typeof value === 'string') { - const model = await Field.findOne({ - where: { - collection_name: viewData.collection_name, - name: value, - }, - }); - if (model) { - fields.push(model); - } - } - } - return fields; - } - if (viewData.actions) { - const parts = resourceKey.split('.'); - parts.pop(); - for (const action of viewData.actions || []) { - if (action.viewName) { - if (!action.viewName.includes('.')) { - action.viewName = `${parts.join('.')}.${action.viewName}`; - } - } - if (action.view && action.view.name) { - action.viewName = `${parts.join('.')}.${action.view.name}`; - } - if (action.fields) { - action.fields = await toFields(action.fields); - } - actions.push({ - ...action, - }) - } - } - const details = []; - for (const item of viewData.details || []) { - let vName: string; - if (typeof item === 'string') { - vName = item; - const sView = await View.findOne({ - where: { - collection_name: viewData.collection_name, - name: vName, - } - }); - if (sView) { - details.push({ - title: sView.title, - views: [sView], - }); - } else { - details.push({ - title: '表单', - views: [{ - name: item, - width: '50%', - }], - }); - } - } else if (typeof item === 'object') { - if (item.views) { - // TODO 标签页多视图支持 - } else if (item.view) { - const { view: v, ...others } = item; - vName = v.name; - const sView = await View.findOne({ - where: { - collection_name: viewData.collection_name, - name: vName, - } - }); - sView && details.push({ - ...others, - views: [sView], - }); - } - } - } - const data: any = { - ...viewData, - details, - actions, - fields, - }; - if (data.target_field_id) { - const targetField = await Field.findByPk(data.target_field_id); - data.targetFieldName = targetField.name; - } - if (data.target_view_id) { - const targetView = await View.findByPk(data.target_view_id); - data.targetViewName = targetView.name; - } - if (associationField) { - data.associationField = associationField; - } - if (data.dataSourceType === 'association') { - const field = await Field.findOne({ - where: { - name: data.targetFieldName, - collection_name: collectionName, - } - }); - // console.log(field, data.targetFieldName, collectionName) - const targetViewName = `${field.get('target')}.${data.targetViewName}`; - const resourceName = `${collectionName}.${data.targetFieldName}`; - ctx.action.mergeParams({ - resourceKey: targetViewName, - }); - await getInfo(ctx, async () => { }); - const body = ctx.body as any; - const actions = body.actions.map(action => { - if (action.viewName) { - const names = action.viewName.split('.'); - action.viewName = `${resourceName}.${names.pop()}`; - } - return action; - }); - const item = { - ...body, - associationField: field, - resourceName, - actions, - rowKey: resourceKey === 'roles.collections' ? 'name' : body.rowKey, - } - ctx.body = item; - return next(); - } else { - data.rowKey = data.rowKey || M.primaryKeyAttribute; - if (associatedName) { - data.resourceName = `${associatedName}.${resourceName}`; - } else { - data.resourceName = collectionName; - } - data.appends = data.fields.filter(field => { - return ['hasMany', 'hasOne', 'belongsToMany', 'belongsTo'].includes(field.type); - }).map(field => field.name); - - for (const field of data.fields) { - if (field.interface === 'attachment') { - data.appends.push(`${field.name}.storage`); - } - } - } - delete data['resourceKey']; - delete data['associatedKey']; - for (const [key, value] of Object.entries(viewData[`x-${viewData.type}-props`] || {})) { - if (_.get(data, key) === null || _.get(data, key) === undefined) { - _.set(data, key, value); - } - } - - if (_.isEmpty(data.sort)) { - data.sort = []; - } - - if (data.type === 'kanban' && data.groupField) { - const groupField = await Field.findOne({ - where: { - name: data.groupField, - collection_name: data.collection_name, - } - }); - data.groupField = groupField; - } - - data.actions = data.actions.map(action => { - if (action.type === 'filter') { - if (!action.fields) { - action.fields = data.fields.filter(({ filterable }) => filterable); - } - } - return action; - }); - - ctx.body = data; - await next(); -}; diff --git a/packages/plugin-pages/src/collections/menus.ts b/packages/plugin-pages/src/collections/menus.ts deleted file mode 100644 index 53acddc52e69a0184435381d05179a93f48066db..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/menus.ts +++ /dev/null @@ -1,334 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'menus', - title: '菜单和页面配置', - internal: true, - // model: 'CollectionModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['parent_id'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, - }, - { - interface: 'string', - type: 'randomString', - name: 'name', - title: '缩略名', - required: true, - createOnly: true, - randomString: { - length: 6, - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - developerMode: true, - }, - { - interface: 'linkTo', - multiple: false, - type: 'belongsTo', - name: 'parent', - title: '父级菜单', - target: 'menus', - foreignKey: 'parent_id', - targetKey: 'id', - labelField: 'title', - valueField: 'id', - component: { - type: 'drawerSelect', - 'x-component-props': { - placeholder: '请选择菜单组', - labelField: 'title', - valueField: 'id', - filter: { - type: 'group', - }, - }, - }, - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '菜单/页面名称', - required: true, - }, - { - interface: 'icon', - type: 'string', - name: 'icon', - title: '图标', - component: { - type: 'icon', - }, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '菜单类型', - required: true, - dataSource: [ - { value: 'group', label: '菜单组', color: 'red' }, - { value: 'page', label: '页面', color: 'green' }, - { value: 'link', label: '自定义链接', color: 'orange' }, - ], - component: { - 'x-linkages': [ - { - "type": "value:visible", - "target": "views", - "condition": "{{ $self.value === 'page' }}" - }, - { - "type": "value:visible", - "target": "url", - "condition": "{{ $self.value === 'link' }}" - }, - ], - }, - }, - { - interface: 'string', - type: 'string', - name: 'url', - title: '链接地址', - required: true, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - developerMode: true, - defaultValue: false, - }, - { - interface: 'json', - type: 'json', - name: 'views', - title: '显示在页面里的视图', - target: 'menus_views_v2', - component: { - type: 'subTable', - 'x-component-props': { - viewName: 'menus.views', - }, - 'x-linkages': [ - { - type: 'value:schema', - target: 'views', - schema: { - 'x-component-props': { - __parent: '{{ $form.values && $form.values.associatedKey }}', - associatedKey: "{{ $form.values && $form.values.id }}" - }, - }, - }, - ], - }, - }, - // { - // interface: 'subTable', - // type: 'hasMany', - // name: 'menus_views', - // title: '显示在页面里的视图', - // target: 'menus_views_v2', - // sourceKey: 'id', - // foreignKey: 'menu_id', - // component: { - // type: 'subTable', - // 'x-component-props': { - // viewName: 'menus.menus_views', - // filter: { - // or: [ - // { - // 'type.neq': 'descriptions', - // }, - // { - // 'data_source_type.neq': 'association', - // } - // ], - // }, - // }, - // 'x-linkages': [ - // { - // type: 'value:schema', - // target: 'menus_views', - // schema: { - // 'x-component-props': { - // __parent: '{{ $form.values && $form.values.associatedKey }}', - // associatedKey: "{{ $form.values && $form.values.id }}" - // }, - // }, - // }, - // ], - // }, - // }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - { - type: 'hasMany', - name: 'children', - target: 'menus', - foreignKey: 'parent_id', - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], - views: [ - { - type: 'form', - name: 'form', - title: '表单', - template: 'DrawerForm', - }, - { - type: 'details', - name: 'details', - title: '详情', - template: 'Details', - actionNames: ['update'], - }, - { - type: 'table', - name: 'simple', - title: '简易模式', - template: 'SimpleTable', - default: true, - mode: 'simple', - actionNames: ['create', 'destroy'], - detailsViewName: 'details', - updateViewName: 'form', - paginated: false, - }, - { - type: 'table', - name: 'table', - title: '列表', - template: 'Table', - actionNames: ['create', 'destroy'], - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - expandable: { - expandIconColumnIndex: 3, - }, - paginated: false, - fields: ['sort', 'title', 'icon', 'type'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['sort'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['type', 'parent', 'title', 'icon', 'url', 'views'], - }, - { - developerMode: true, - type: 'table', - name: 'permissions_table', - title: '权限表格', - labelField: 'title', - actions: [], - expandable: {}, - fields: [ - 'title', - { - interface: 'boolean', - name: 'accessible', - type: 'boolean', - title: '允许访问', - dataIndex: ['accessible'], - editable: true, - resourceName: 'roles.menus', - component: { - type: 'checkbox', - }, - }, - ], - // detailsOpenMode: 'drawer', // window - details: [], - sort: ['sort'], - }, - { - developerMode: true, - type: 'form', - name: 'permissions_form', - title: '权限表单', - fields: ['type', 'title'], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/menus_views_v2.ts b/packages/plugin-pages/src/collections/menus_views_v2.ts deleted file mode 100644 index 3f180dbc550df77e680070dc4dba327feae4c640..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/menus_views_v2.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'menus_views_v2', - title: '页面视图', - internal: true, - // model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'linkTo', - type: 'belongsTo', - name: 'view', - target: 'views_v2', - title: '视图', - labelField: 'title', - valueField: 'id', - multiple: false, - viewName: 'views_v2.form', - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'views_v2.table', - resourceName: 'views_v2', - labelField: 'title', - valueField: 'id', - }, - 'x-linkages': [ - { - "type": "value:visible", - "target": "returnType", - "condition": "{{ $self.value && $self.value.type === 'form' }}" - }, - { - "type": "value:visible", - "target": "redirect", - "condition": "{{ $self.value && $self.value.type === 'form' }}" - }, - { - "type": "value:visible", - "target": "message", - "condition": "{{ $self.value && $self.value.type === 'form' }}" - }, - { - "type": "value:visible", - "target": "draft.returnType", - "condition": "{{ $self.value && $self.value.type === 'form' }}" - }, - ], - }, - }, - { - interface: 'string', - type: 'virtual', - name: 'view.collection.title', - title: '所属数据表', - }, - { - interface: 'radio', - type: 'string', - name: 'width', - title: '宽度', - dataSource: [ - { label: '50%', value: '50%' }, - { label: '100%', value: '100%' }, - ], - component: { - type: 'radio', - 'x-linkages': [ - { - "type": "value:visible", - "target": "float", - "condition": "{{ $self.value && $self.value === '50%' }}" - }, - ] - }, - }, - { - interface: 'radio', - type: 'string', - name: 'float', - title: '位置', - dataSource: [ - { label: '左边', value: 'left' }, - { label: '右边', value: 'right' }, - ], - component: { - type: 'radio', - }, - }, - { - interface: 'radio', - type: 'string', - name: 'returnType', - title: '表单提交成功后', - dataSource: [ - { label: '显示文字信息', value: 'message' }, - { label: '跳转到页面', value: 'redirect' }, - ], - component: { - type: 'radio', - 'x-linkages': [ - { - "type": "value:visible", - "target": "message", - "condition": "{{ $self.value === 'message' }}" - }, - { - "type": "value:visible", - "target": "redirect", - "condition": "{{ $self.value === 'redirect' }}" - }, - ], - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'redirect', - target: 'menus', - title: '跳转到页面', - labelField: 'title', - valueField: 'id', - multiple: false, - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'menus.table', - resourceName: 'menus', - labelField: 'title', - valueField: 'id', - }, - }, - }, - { - interface: 'markdown', - type: 'json', - title: '显示文字信息', - name: 'message', - component: { - type: 'markdown', - }, - }, - { - interface: 'radio', - type: 'virtual', - name: 'draft.returnType', - title: '草稿提交成功后', - dataSource: [ - { label: '显示文字信息', value: 'message' }, - { label: '跳转到页面', value: 'redirect' }, - ], - component: { - type: 'radio', - 'x-linkages': [ - { - "type": "value:visible", - "target": "draft.message", - "condition": "{{ $self.value === 'message' }}" - }, - { - "type": "value:visible", - "target": "draft.redirect", - "condition": "{{ $self.value === 'redirect' }}" - }, - ], - }, - }, - { - interface: 'linkTo', - type: 'virtual', - name: 'draft.redirect', - target: 'menus', - title: '跳转到页面', - labelField: 'title', - valueField: 'id', - multiple: false, - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'menus.table', - resourceName: 'menus', - labelField: 'title', - valueField: 'id', - }, - }, - }, - { - interface: 'markdown', - type: 'virtual', - title: '显示文字信息', - name: 'draft.message', - component: { - type: 'markdown', - }, - } - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - draggable: true, - actions: [ - { - name: 'add', - type: 'add', - title: '选择', - transform: { - 'data': 'view', - 'data.title': 'title', - }, - viewName: 'views_v2.table', - componentProps: { - type: 'primary', - }, - filter: { - and: [ - { 'type.ne': 'descriptions' }, - { 'data_source_type.ne': 'association' }, - ] - }, - }, - { - name: 'create', - type: 'create', - title: '新增', - transform: { - 'data': 'view', - 'data.title': 'title', - }, - componentProps: { - type: 'default', - }, - viewName: 'views_v2.form', - }, - { - name: 'destroy', - type: 'destroy', - title: '移除', - }, - ], - fields: [ - 'view', - 'view.collection.title', - 'width', - 'float' - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'view', - 'width', - 'float', - 'returnType', - 'redirect', - 'message', - 'draft.returnType', - 'draft.redirect', - 'draft.message', - ], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - actions: [ - { - name: 'update', - type: 'update', - title: '编辑', - }, - ], - fields: [ - 'view', - 'width', - 'float', - 'returnType', - 'redirect', - 'message', - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/pages.ts b/packages/plugin-pages/src/collections/pages.ts deleted file mode 100644 index da2b9dfed9f6a1c6fba9a0caf8c538cc6881cb59..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/pages.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'pages', - title: '页面配置', - model: 'PageModel', - internal: true, - developerMode: true, - fields: [ - { - interface: 'sort', - type: 'sort', - name: 'sort', - scope: ['parent_id'], - title: '排序', - component: { - type: 'sort', - className: 'drag-visible', - width: 60, - showInTable: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'title', - title: '名称', - component: { - type: 'string', - className: 'drag-visible', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'number', - type: 'integer', - name: 'parent_id', - title: '父级页面', - component: { - type: 'number', - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'path', - title: '路径', - unique: true, - component: { - type: 'string', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'icon', - type: 'string', - name: 'icon', - title: '图标', - component: { - type: 'icon', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'select', - type: 'string', - name: 'type', - title: '类型', - dataSource: [ - { - label: '页面', - value: 'page', - }, - { - label: '布局', - value: 'layout', - }, - { - label: '数据集', - value: 'collection', - }, - ], - component: { - type: 'string', - showInTable: true, - showInForm: true, - showInDetail: true, - 'x-linkages': [ - { - "type": "value:visible", - "target": "collection", - "condition": "{{ ['collection'].indexOf($self.value) !== -1 }}" - }, - ] - }, - }, - { - interface: 'select', - type: 'string', - name: 'collection', - title: '属于哪种数据集?', - component: { - type: 'select', - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'select', - type: 'string', - name: 'template', - title: '模板', - dataSource: [ - { - label: '顶部菜单布局', - value: 'TopMenuLayout', - }, - { - label: '左侧菜单布局', - value: 'SideMenuLayout', - }, - ], - component: { - type: 'select', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'showInMenu', - title: '在菜单里显示', - defaultValue: false, - component: { - type: 'checkbox', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'inherit', - title: '继承父级页面内容', - defaultValue: true, - component: { - type: 'checkbox', - showInTable: true, - showInForm: true, - showInDetail: true, - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - { - interface: 'linkTo', - type: 'hasMany', - name: 'children', - title: '子页面', - target: 'pages', - foreignKey: 'parent_id', - sourceKey: 'id', - component: { - type: 'drawerSelect', - }, - }, - { - interface: 'number', - type: 'integer', - name: 'viewId', - title: '视图ID', - component: { - type: 'number', - }, - }, - // { - // type: 'belongsToMany', - // name: 'roles', - // through: 'routes_permissions', - // foreignKey: 'routable_id', - // otherKey: 'role_id', - // morphType: 'routable', - // constraints: false, - // }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '元数据', - component: { - type: 'hidden', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/pages_v2.ts b/packages/plugin-pages/src/collections/pages_v2.ts deleted file mode 100644 index 2ffe0c039854f5688d8734c18b9bd00be0ad8a69..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/pages_v2.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'pages_v2', - title: '页面配置', - internal: true, - model: 'BaseModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '页面名称', - required: true, - }, - { - interface: 'string', - type: 'string', - name: 'path', - title: '路径', - required: true, - unique: true, - createOnly: true, - developerMode: true, - }, - { - interface: 'string', - type: 'randomString', - name: 'name', - title: '缩略名', - required: true, - createOnly: true, - randomString: { - length: 6, - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - developerMode: true, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '类型', - required: true, - defaultValue: 'static', - dataSource: [ - { value: 'static', label: '多条数据页面' }, - { value: 'dynamic', label: '单条数据子页面' }, - ], - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - target: 'collections', - targetKey: 'name', - title: '所属数据表', - labelField: 'title', - valueField: 'name', - multiple: false, - component: { - type: 'remoteSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections', - labelField: 'title', - valueField: 'name', - }, - }, - }, - { - interface: 'json', - type: 'virtual', - name: 'views', - title: '显示在页面里的视图', - target: 'pages_views_v2', - component: { - type: 'subTable', - 'x-linkages': [ - { - type: 'value:schema', - target: 'views', - schema: { - 'x-component-props': { - __parent: '{{ $form.values && $form.values.associatedKey }}', - associatedKey: "{{ $form.values && $form.values.id }}" - }, - }, - }, - ], - }, - }, - // { - // interface: 'subTable', - // type: 'hasMany', - // name: 'pages_views', - // target: 'pages_views_v2', - // // sourceKey: 'path', - // title: '显示在页面里的视图(pages_views)', - // component: { - // type: 'subTable', - // 'x-linkages': [ - // { - // type: 'value:schema', - // target: 'pages_views', - // schema: { - // 'x-component-props': { - // __parent: '{{ $form.values && $form.values.associatedKey }}', - // associatedKey: "{{ $form.values && $form.values.id }}" - // }, - // }, - // }, - // ], - // }, - // }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'all_pages', - title: '全部页面', - rowKey: 'path', - labelField: 'title', - fields: ['title', 'collection'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - filter: { - type: 'static', - }, - actions: [ - { - name: 'filter', - type: 'filter', - title: '过滤', - fields: [ - 'title', - ], - } - ], - }, - { - developerMode: true, - type: 'table', - name: 'collection_pages', - title: '数据表页面', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['title'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'table', - name: 'global_pages', - title: '独立页面', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'global_form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - filter: { - collection_name: null, - }, - fields: ['title'], - detailsOpenMode: 'drawer', // window - details: ['global_form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'table', - name: 'permissions_table', - title: '全部数据', - labelField: 'title', - actions: [], - fields: ['title'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['title', 'type', 'views', 'pages_views'], - }, - { - developerMode: true, - type: 'form', - name: 'global_form', - title: '独立页面表单', - fields: ['title', 'views', 'pages_views'], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/pages_views_v2.ts b/packages/plugin-pages/src/collections/pages_views_v2.ts deleted file mode 100644 index 1a8fcb78caa245310de4f865b05ffabf38abeb52..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/pages_views_v2.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'pages_views_v2', - title: '页面视图', - internal: true, - // model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'linkTo', - type: 'belongsTo', - name: 'view', - target: 'views_v2', - title: '视图', - labelField: 'title', - valueField: 'id', - multiple: false, - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'views_v2.table', - resourceName: 'views_v2', - labelField: 'title', - valueField: 'id', - }, - }, - }, - { - interface: 'radio', - type: 'string', - name: 'width', - title: '宽度', - dataSource: [ - { label: '50%', value: '50%' }, - { label: '100%', value: '100%' }, - ], - component: { - type: 'radio', - }, - } - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: [ - 'view', - 'width' - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'view', - 'width' - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/roles.ts b/packages/plugin-pages/src/collections/roles.ts deleted file mode 100644 index f96c022a67b647c6a4b52beef69956bc259555fe..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/roles.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { extend } from '@nocobase/database'; - -export default extend({ - name: 'roles', - fields: [ - { - type: 'hasMany', - name: 'routes', - target: 'routes_permissions', - }, - { - interface: 'linkTo', - type: 'belongsToMany', - name: 'pages', - title: '可访问的页面', - through: 'routes_permissions', - foreignKey: 'role_id', - otherKey: 'routable_id', - morphType: 'routable', // 现在没有多态关联的设置,暂时先这么写了 - constraints: false, // 多态关联建立外键约束会有问题 - } - ], -}); diff --git a/packages/plugin-pages/src/collections/routes_permissions.ts b/packages/plugin-pages/src/collections/routes_permissions.ts deleted file mode 100644 index 68cb3114da576a764cd6c68656eba0709f951629..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/routes_permissions.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'routes_permissions', - title: '页面权限', - developerMode: true, - internal: true, - fields: [ - { - type: 'integer', - name: 'id', - primaryKey: true, - autoIncrement: true, - }, - { - type: 'string', - name: 'routable_type', - title: '关联的表', // 仅 pages 和 collections - }, - { - type: 'integer', - name: 'routable_id', - title: '关联的对象' - }, - { - type: 'belongsTo', - name: 'role' - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/system_settings.ts b/packages/plugin-pages/src/collections/system_settings.ts deleted file mode 100644 index 2ce38aa6f387eafffb057583782d197ca012bc11..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/system_settings.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'system_settings', - title: '系统配置', - internal: true, - // model: 'CollectionModel', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '系统名称', - }, - { - interface: 'attachment', - type: 'belongsTo', - name: 'logo', - filterable: false, - target: 'attachments', - title: 'LOGO', - component: { - 'x-component-props': { - multiple: false, - }, - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['title', 'logo'], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - fields: ['title', 'logo'], - actions: [ - { - name: 'update', - type: 'update', - title: '编辑', - viewName: 'form', - }, - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/views_actions_v2.ts b/packages/plugin-pages/src/collections/views_actions_v2.ts deleted file mode 100644 index 7d06deb47ff982f68dfe36012bdcf11cd7999861..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/views_actions_v2.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'views_actions_v2', - title: '视图操作配置', - internal: true, - // model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '按钮名称', - component: { - type: 'string', - }, - }, - { - interface: 'radio', - type: 'string', - name: 'type', - title: '操作类型', - dataSource: [ - { label: '筛选', value: 'filter' }, - { label: '打印', value: 'print' }, - { label: '导出', value: 'export' }, - { label: '新增', value: 'create' }, - { label: '编辑', value: 'update' }, - { label: '删除', value: 'destroy' }, - ], - component: { - type: 'radio', - 'x-linkages': [ - { - "type": "value:visible", - "target": "view", - "condition": "{{ $self.value === 'create' || $self.value === 'update' }}" - }, - // { - // "type": "value:visible", - // "target": "fields", - // "condition": "{{ $self.value === 'filter' }}" - // }, - ], - }, - }, - { - interface: 'string', - type: 'string', - name: 'name', - title: '操作ID', - component: { - type: 'string', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'view', - target: 'views_v2', - title: '操作绑定的视图', - labelField: 'title', - valueField: 'id', - multiple: false, - required: true, - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'views_v2.table', - resourceName: 'views_v2', - labelField: 'title', - valueField: 'id', - }, - }, - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - draggable: true, - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: [ - 'title', - 'type', - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'type', - 'view' - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/views_details_v2.ts b/packages/plugin-pages/src/collections/views_details_v2.ts deleted file mode 100644 index 1b74c377ea67fd98657d0fac51613220467e48b5..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/views_details_v2.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'views_details_v2', - title: '详情子视图', - internal: true, - // model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '标签页名称', - component: { - type: 'string', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'view', - target: 'views_v2', - title: '标签页显示的视图', - labelField: 'title', - valueField: 'id', - multiple: false, - required: true, - viewName: 'views_v2.form', - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'views_v2.table', - resourceName: 'views_v2', - labelField: 'title', - valueField: 'id', - }, - }, - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - draggable: true, - actions: [ - { - name: 'add', - type: 'add', - title: '选择', - transform: { - 'data': 'view', - 'data.title': 'title', - }, - viewName: 'collections.views_v2.table', - componentProps: { - type: 'primary', - }, - filter: { - or: [ - { 'type': 'form' }, - { 'type': 'descriptions' }, - { 'data_source_type': 'association' }, - ] - }, - }, - { - name: 'create', - type: 'create', - title: '新增', - transform: { - 'data': 'view', - 'data.title': 'title', - }, - viewName: 'collections.views_v2.form', - componentProps: { - type: 'default', - }, - }, - { - name: 'destroy', - type: 'destroy', - title: '移除', - }, - ], - fields: [ - 'title', - 'view', - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'view', - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/views_fields_v2.ts b/packages/plugin-pages/src/collections/views_fields_v2.ts deleted file mode 100644 index 17bc37afaa4cd05de1bbf3c0877dd5759bcd10c0..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/views_fields_v2.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'views_fields_v2', - title: '视图字段配置', - internal: true, - // model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '字段名称', - component: { - type: 'string', - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'field', - target: 'fields', - title: '字段', - labelField: 'title', - valueField: 'id', - multiple: false, - viewName: 'fields.form', - component: { - type: 'drawerSelect', - 'x-component-props': { - viewName: 'fields.table', - resourceName: 'fields', - labelField: 'title', - valueField: 'id', - }, - "x-linkages": [ - { - "type": "value:schema", - "target": "field", - "schema": { - "x-component-props": { - "filter": { - "collection_name": "{{ $self.value && $self.value.collection_name }}" - } - } - } - } - ] - }, - }, - { - interface: 'textarea', - type: 'text', - name: 'tooltip', - title: '提示信息', - component: { - type: 'textarea', - }, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'required', - title: '必填项', - component: { - type: 'checkbox', - }, - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - draggable: true, - actions: [ - { - name: 'add', - type: 'add', - title: '选择', - transform: { - 'data': 'field', - 'data.title': 'title', - }, - viewName: 'collections.fields.table', - componentProps: { - type: 'primary', - }, - }, - { - name: 'destroy', - type: 'destroy', - title: '移除', - }, - ], - fields: [ - 'title', - 'field', - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'field', - 'tooltip', - ], - }, - { - developerMode: true, - type: 'table', - name: 'tableForForm', - title: '全部数据', - labelField: 'title', - draggable: true, - actions: [ - { - name: 'add', - type: 'add', - title: '选择', - transform: { - 'data': 'field', - 'data.title': 'title', - }, - viewName: 'collections.fields.table', - componentProps: { - type: 'primary', - }, - }, - { - name: 'destroy', - type: 'destroy', - title: '移除', - }, - ], - fields: [ - 'title', - 'field', - 'required', - ], - detailsOpenMode: 'drawer', // window - details: ['formForForm'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'formForForm', - title: '表单', - fields: [ - 'title', - 'field', - 'tooltip', - 'required', - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/collections/views_v2.ts b/packages/plugin-pages/src/collections/views_v2.ts deleted file mode 100644 index f4d32104f7f34ac29af5dd6714eacc5fa28277e7..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/collections/views_v2.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { TableOptions } from '@nocobase/database'; -import { getTypeFieldOptions, getViewFields } from '../views'; - -const fields = getViewFields(); -const associatedKeyValue = "{{ $form.values && $form.values.collection && $form.values.collection.name }}"; - -export default { - name: 'views_v2', - title: '视图配置', - internal: true, - model: 'BaseModelV2', - developerMode: true, - createdAt: false, - updatedAt: false, - fields: [ - { - interface: 'string', - type: 'string', - name: 'title', - title: '视图名称', - required: true, - }, - getTypeFieldOptions(), - { - interface: 'string', - type: 'randomString', - name: 'name', - title: '缩略名', - required: true, - createOnly: true, - randomString: { - length: 6, - characters: 'abcdefghijklmnopqrstuvwxyz0123456789', - }, - developerMode: true, - }, - { - interface: 'radio', - type: 'string', - name: 'dataSourceType', - title: '数据来源', - defaultValue: 'collection', - dataSource: [ - { label: '所属数据表', value: 'collection' }, - { label: '所属数据表的相关数据', value: 'association' }, - ], - linkages: [ - { - "type": "value:visible", - "target": "targetField", - "condition": "{{ $self.value === 'association' }}" - }, - ...['form', 'descriptions', 'table', 'kanban', 'calendar'].map(type => { - return { - "type": "value:visible", - "target": `x-${type}-props.*`, - "condition": `{{ $form.values.type === '${type}' && $self.value === 'collection' }}` - } - }), - ], - }, - { - interface: 'linkTo', - type: 'belongsTo', - title: '相关数据', - name: 'targetField', - target: 'fields', - required: true, - multiple: false, - component: { - type: 'remoteSelect', - 'x-component-props': { - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'id', - objectValue: true, - filter: { - interface: 'linkTo', - }, - multiple: false, - }, - 'x-linkages': [ - { - "type": "value:visible", - "target": "targetView", - "condition": "{{ !!$self.value }}" - }, - { - type: 'value:schema', - target: 'targetView', - "condition": "{{ !!$self.value }}", - schema: { - 'x-component-props': { - associatedKey: "{{ $self.value && $self.value.target }}" - }, - }, - }, - ], - }, - }, - { - interface: 'linkTo', - type: 'belongsTo', - title: '相关数据表视图', - name: 'targetView', - target: 'views_v2', - required: true, - multiple: false, - component: { - type: 'remoteSelect', - 'x-component-props': { - resourceName: 'collections.views_v2', - labelField: 'title', - valueField: 'id', - multiple: false, - }, - }, - }, - // { - // interface: 'select', - // type: 'virtual', - // title: '相关数据表的视图', - // name: 'targetViewName', - // required: true, - // component: { - // type: 'remoteSelect', - // resourceName: 'collections.views', - // labelField: 'title', - // valueField: 'name', - // 'x-component-props': { - // resourceName: 'collections.views', - // labelField: 'title', - // valueField: 'name', - // multiple: false, - // }, - // }, - // }, - ...fields, - { - interface: 'linkTo', - type: 'belongsTo', - name: 'collection', - target: 'collections', - targetKey: 'name', - title: '所属数据表', - labelField: 'title', - valueField: 'name', - multiple: false, - component: { - type: 'drawerSelect', - showInDetail: true, - showInForm: true, - 'x-component-props': { - resourceName: 'collections', - labelField: 'title', - valueField: 'name', - }, - 'x-linkages': [ - { - type: 'value:schema', - target: '*', - schema: { - 'x-component-props': { - associatedKey: associatedKeyValue, - }, - }, - }, - ], - }, - }, - { - interface: 'json', - type: 'json', - name: 'options', - title: '配置信息', - defaultValue: {}, - developerMode: true, - }, - { - interface: 'boolean', - type: 'boolean', - name: 'developerMode', - title: '开发者模式', - defaultValue: false, - component: { - type: 'boolean', - }, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: [ - 'title', - 'type', - 'collection', - ], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: [ - 'title', - 'type', - 'collection', - 'dataSourceType', - 'targetField', - 'targetView', - ...fields.map(field => field.name), - ], - }, - ], -} as TableOptions; diff --git a/packages/plugin-pages/src/fields/randomString.ts b/packages/plugin-pages/src/fields/randomString.ts deleted file mode 100644 index bb22d43667a447f6e4cc0923a709c0aaa2f44009..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/fields/randomString.ts +++ /dev/null @@ -1,27 +0,0 @@ -import cryptoRandomString from 'crypto-random-string'; -import { STRING, FieldContext } from '@nocobase/database'; -import { - DataTypes -} from 'sequelize'; - -export class RANDOMSTRING extends STRING { - constructor(options: any, context: FieldContext) { - super(options, context); - const Model = context.sourceTable.getModel(); - const { name, randomString } = options; - randomString && Model.addHook('beforeValidate', (model) => { - const { template, ...opts } = randomString; - let value = cryptoRandomString(opts); - if (template && template.includes('%r')) { - value = template.replace('%r', value); - } - if (!model.get(name)) { - model.set(name, value); - } - }); - } - - getDataType() { - return DataTypes.STRING; - } -} diff --git a/packages/plugin-pages/src/models/BaseModel.ts b/packages/plugin-pages/src/models/BaseModel.ts deleted file mode 100644 index aa4eb5a880b69ad8511e72df990d0f4cd3e7bfb7..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/models/BaseModel.ts +++ /dev/null @@ -1,214 +0,0 @@ -import _ from 'lodash'; -import { getDataTypeKey, Model } from '@nocobase/database'; -import { merge } from '../utils'; - -export function generateName(title?: string): string { - return `${Math.random().toString(36).replace('0.', '').slice(-4).padStart(4, '0')}`; -} - -export class BaseModel extends Model { - - generateName() { - this.set('name', generateName()); - } - - generateNameIfNull() { - if (!this.get('name')) { - this.generateName(); - } - } - - get additionalAttribute() { - const tableOptions = this.database.getTable(this.constructor.name).getOptions(); - return _.get(tableOptions, 'additionalAttribute') || 'options'; - } - - hasGetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 get 方法就直接走 get - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.get; - } - return !!attribute; - } - - hasSetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 set 方法就直接走 set - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.set; - } - return !!attribute; - } - - get(key?: any, options?: any) { - if (typeof key === 'string') { - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.get(column, options); - if (path.length) { - return _.get(value, path); - } - return value; - } - return _.get(super.get(this.additionalAttribute, options) || {}, key); - } - const data = super.get(); - return { - ...(data[this.additionalAttribute] || {}), - ..._.omit(data, [this.additionalAttribute]), - }; - } - - getDataValue(key: any) { - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.getDataValue(column); - if (path.length) { - return _.get(value, path); - } - return value; - } - const options = super.getDataValue(this.additionalAttribute) || {}; - return _.get(options, key); - } - - set(key?: any, value?: any, options: any = {}) { - if (typeof key === 'string') { - // 不处理关系数据 - // @ts-ignore - if (_.get(this.constructor.associations, key)) { - return super.set(key, value, options); - } - // 如果是 object 数据,merge 处理 - if (_.isPlainObject(value)) { - // TODO 需要改进 JSON 字段的内部处理逻辑,暂时这里跳过了特殊的 filter 字段 - if (key !== 'filter') { - // console.log(key, value); - // @ts-ignore - value = merge(this.get(key) || {}, value); - } - } - const [column, ...path] = key.split('.'); - if (!options.raw) { - this.changed(column, true); - } - if (this.hasSetAttribute(column)) { - if (!path.length) { - return super.set(key, value, options); - } - const values = this.get(column, options) || {}; - _.set(values, path, value); - return super.set(column, values, options); - } - // 如果未设置 attribute,存到 additionalAttribute 里 - const opts = this.get(this.additionalAttribute, options) || {}; - _.set(opts, key, value); - if (!options.raw) { - this.changed(this.additionalAttribute, true); - } - return super.set(this.additionalAttribute, opts, options); - } - return super.set(key, value, options); - } - - setDataValue(key: any, value: any) { - // 不处理关系数据 - // @ts-ignore - if (_.get(this.constructor.associations, key)) { - return super.setDataValue(key, value); - } - if (_.isPlainObject(value)) { - // @ts-ignore - value = Utils.merge(this.get(key) || {}, value); - } - const [column, ...path] = key.split('.'); - this.changed(column, true); - if (this.hasSetAttribute(column)) { - if (!path.length) { - return super.setDataValue(key, value); - } - const values = this.get(column) || {}; - _.set(values, path, value); - return super.setDataValue(column, values); - } - const opts = this.get(this.additionalAttribute) || {}; - _.set(opts, key, value); - this.changed(this.additionalAttribute, true); - return super.setDataValue(this.additionalAttribute, opts); - } -} - -export class BaseModel2 extends Model { - - get additionalAttribute() { - const tableOptions = this.database.getTable(this.constructor.name).getOptions(); - return _.get(tableOptions, 'additionalAttribute') || 'options'; - } - - hasGetAttribute(key: string) { - const attribute = this.rawAttributes[key]; - // virtual 如果有 get 方法就直接走 get - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.get; - } - return !!attribute; - } - - hasSetAttribute(key: string) { - // @ts-ignore - if (this.constructor.hasAlias(key)) { - return false; - } - const attribute = this.rawAttributes[key]; - // virtual 如果有 set 方法就直接走 set - if (attribute && attribute.type && getDataTypeKey(attribute.type) === 'VIRTUAL') { - return !!attribute.set; - } - return !!attribute; - } - - get(key?: any, options?: any) { - if (typeof key !== 'string') { - const data = super.get(key); - return { - ..._.omit(data, [this.additionalAttribute]), - ...(data[this.additionalAttribute] || {}), - }; - } - const [column, ...path] = key.split('.'); - if (this.hasGetAttribute(column)) { - const value = super.get(column, options); - if (path.length) { - return _.get(value, path); - } - return value; - } - return _.get(super.get(this.additionalAttribute, options) || {}, key); - } - - set(key?: any, value?: any, options: any = {}) { - if (typeof key !== 'string') { - return super.set(key, value, options); - } - // @ts-ignore - if (this.constructor.hasAlias(key)) { - return this; - } - const [column] = key.split('.'); - if (this.hasSetAttribute(column)) { - return super.set(key, value, options); - } - return super.set(`${this.additionalAttribute}.${key}`, value, options); - } - - // getDataValue(key: any) { - // return super.getDataValue(key); - // } - - // setDataValue(key: any, value: any) { - // return super.setDataValue(key, value); - // } -} - -export default BaseModel; diff --git a/packages/plugin-pages/src/server.ts b/packages/plugin-pages/src/server.ts deleted file mode 100644 index c2f2b02bef31605835e1a4137678905cbe8208ea..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/server.ts +++ /dev/null @@ -1,287 +0,0 @@ -import path from 'path'; -import Database from '@nocobase/database'; -import Resourcer from '@nocobase/resourcer'; -import getCollection from './actions/getCollection'; -import getView from './actions/getView'; -import getRoutes from './actions/getRoutes'; -import getPageInfo from './actions/getPageInfo'; -import * as rolesPagesActions from './actions/roles.pages'; -import getCollections from './actions/getCollections'; -import { list as menusList } from './actions/menus'; -import getTree from './actions/getTree'; -import getInfo from './actions/getInfo'; -import { getInfo as viewGetInfo } from './actions/views_v2'; -import { RANDOMSTRING } from './fields/randomString'; -import { registerFields, registerModels } from '@nocobase/database'; -import { BaseModel } from './models/BaseModel' -import * as rolesMenusActions from './actions/roles.menus'; -import _ from 'lodash'; - -export default async function (options = {}) { - const database: Database = this.database; - const resourcer: Resourcer = this.resourcer; - - registerFields({ - RANDOMSTRING, - }); - - registerModels({ - BaseModelV2: BaseModel, - }); - - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); - - resourcer.use(async (ctx, next) => { - const { actionName, resourceName, resourceKey } = ctx.action.params; - if (resourceName === 'system_settings' && actionName === 'get') { - const SystemSetting = database.getModel('system_settings'); - let model = await SystemSetting.findOne(); - if (!model) { - model = await SystemSetting.create(); - } - ctx.action.mergeParams({ - resourceKey: model.id, - }); - } - await next(); - }); - - resourcer.use(async (ctx, next) => { - const { actionName, resourceName, values } = ctx.action.params; - if (resourceName === 'menus' && ['create', 'update'].includes(actionName)) { - if (values.parent) { - delete values.parent.children; - ctx.action.mergeParams({ - values: {...values}, - }, { - payload: 'replace', - }); - } - } - await next(); - }); - - resourcer.use(async (ctx, next) => { - await next(); - const { actionName, resourceName } = ctx.action.params; - if (resourceName === 'menus' && actionName === 'get') { - const menu = ctx.body; - const items = menu.get('views') || []; - const View = database.getModel('views_v2'); - for (const item of items) { - if (!(item.view && item.view.id)) { - continue; - } - const view = await View.findOne(View.parseApiJson({ - filter: { - id: item.view.id, - }, - fields: { - appends: ['collection', 'targetField', 'targetView'], - }, - })); - if (!view) { - continue; - } - const details = view.get(`options.x-${view.type}-props.details`); - if (!Array.isArray(details)) { - item.view = view; - continue; - } - for (const detail of details) { - if (!(detail.view && detail.view.id)) { - continue; - } - const detailView = await View.findOne(View.parseApiJson({ - filter: { - id: detail.view.id, - }, - fields: { - appends: ['collection', 'targetField', 'targetView'], - }, - })); - if (!detailView) { - continue; - } - detail.view = detailView; - } - view.set(`options.x-${view.type}-props.details`, details); - item.view = view; - } - menu.set('views', items); - } - }); - - resourcer.use(async (ctx, next) => { - await next(); - const { actionName, resourceName } = ctx.action.params; - if (actionName === 'get' && resourceName === 'views_v2') { - // console.log('ctx.body', ctx.body) - const View = database.getModel('views_v2'); - const view = ctx.body; - const details = view.get(`options.x-${view.type}-props.details`) || []; - for (const detail of details) { - if (!(detail.view && detail.view.id)) { - continue; - } - const detailView = await View.findOne(View.parseApiJson({ - filter: { - id: detail.view.id, - }, - fields: { - appends: ['collection', 'targetField', 'targetView'], - }, - })); - if (!detailView) { - continue; - } - detail.view = detailView; - } - if (details.length) { - view.set(`options.x-${view.type}-props.details`, details); - } - } - }); - - resourcer.registerActionHandler('getCollection', getCollection); - resourcer.registerActionHandler('getView', getView); - resourcer.registerActionHandler('getPageInfo', getPageInfo); - resourcer.registerActionHandler('getCollections', getCollections); - resourcer.registerActionHandler('pages:getRoutes', getRoutes); - resourcer.registerActionHandler('menus:getTree', getTree); - resourcer.registerActionHandler('menus:getInfo', getInfo); - resourcer.registerActionHandler('views_v2:getInfo', viewGetInfo); - - resourcer.registerActionHandler('menus:list', menusList); - - Object.keys(rolesPagesActions).forEach(actionName => { - resourcer.registerActionHandler(`roles.pages:${actionName}`, rolesPagesActions[actionName]); - }); - - Object.keys(rolesMenusActions).forEach(actionName => { - resourcer.registerActionHandler(`roles.menus:${actionName}`, rolesMenusActions[actionName]); - }); - - const createDetailsViews = async (model, options) => { - const data = model.get(); - const View = database.getModel('views_v2'); - const types = ['table', 'calendar', 'kanban']; - for (const type of types) { - const items = _.get(data, `x-${type}-props.details`) || []; - if (items.length) { - const details = []; - for (const item of items) { - if (item.view) { - if (!item.view.id) { - const view = await View.create(item.view); - await view.updateAssociations(item.view); - item.view.id = view.id; - } else { - const view = await View.findByPk(item.view.id); - if (view) { - await view.update(item.view); - await view.updateAssociations(item.view); - } - } - const view = await View.findOne(View.parseApiJson({ - filter: { - id: item.view.id, - }, - fields: { - appends: ['collection', 'targetField', 'targetView'], - }, - })); - if (view) { - console.log({view}); - item.view = view.toJSON(); - } - } - details.push(item); - } - model.set(`options.x-${type}-props.details`, details); - } - } - }; - - database.getModel('views_v2').addHook('beforeCreate', createDetailsViews); - database.getModel('views_v2').addHook('beforeUpdate', createDetailsViews); - - database.getModel('views_v2').addHook('beforeSave', async (model, options) => { - const data = model.get(); - if (data.type !== 'kanban') { - return; - } - let groupField = _.get(data, `x-kanban-props.groupField`); - if (!groupField) { - return; - } - if (typeof groupField === 'object' && groupField.name) { - groupField = groupField.name; - } - const Field = database.getModel('fields'); - let field = await Field.findOne({ - where: { - name: `${groupField}_sort`, - collection_name: data.collection_name, - }, - }); - if (field) { - return; - } - await Field.create({ - interface: 'sort', - type: 'sort', - name: `${groupField}_sort`, - // TODO: 不支持相关数据 - collection_name: data.collection_name, - scope: [groupField], - title: '看板分组排序', - developerMode: true, - component: { - type: 'sort', - }, - }); - }); - - database.getModel('menus').addHook('beforeSave', async (model, options) => { - const { transaction } = options; - // console.log('beforeSave', model.get('views')); - const items = model.get('views'); - if (!Array.isArray(items)) { - return; - } - const View = database.getModel('views_v2'); - const views = []; - for (const item of items) { - if (item.view) { - if (!item.view.id) { - const view = await View.create(item.view); - await view.updateAssociations(item.view); - item.view.id = view.id; - } else { - const view = await View.findByPk(item.view.id); - await view.update(item.view); - await view.updateAssociations(item.view); - } - const view = await View.findOne(View.parseApiJson({ - filter: { - id: item.view.id, - }, - fields: { - appends: ['collection', 'targetField', 'targetView'], - }, - })); - if (view) { - console.log({view}); - item.view = view.toJSON(); - } - } - views.push(item); - } - model.set('views', views); - // @ts-ignore - model.changed('views', true); - }); -} diff --git a/packages/plugin-pages/src/utils.ts b/packages/plugin-pages/src/utils.ts deleted file mode 100644 index 3e942f44093632d58efea75f328283c4c6f65143..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/utils.ts +++ /dev/null @@ -1,46 +0,0 @@ -import deepmerge from 'deepmerge'; - -export const flatToTree = (flatArray, options) => { - options = { - id: "id", - parentId: "parentId", - children: "children", - ...options - }; - const dictionary = {}; // a hash table mapping to the specific array objects with their ids as key - const tree = []; - const children = options.children; - flatArray.forEach(node => { - const nodeId = node[options.id]; - const nodeParentId = node[options.parentId]; - // set up current node data in dictionary - dictionary[nodeId] = { - [children]: [], // init a children property - ...node, // add other propertys - ...dictionary[nodeId] // children will be replaced if this node already has children property which was set below - }; - dictionary[nodeParentId] = dictionary[nodeParentId] || { [children]: [] }; // if it's not exist in dictionary, init an object with children property - dictionary[nodeParentId][children].push(dictionary[nodeId]); // add reference to current node object in parent node object - }); - // find root nodes - Object.values(dictionary).forEach(obj => { - if (typeof obj[options.id] === "undefined") { - tree.push(...obj[children]); - } - }); - return treeData(tree); -}; - -function treeData(pages: Array) { - return pages.map(data => { - return { ...data, children: data.children && data.children.length ? treeData(data.children) : undefined } - }); -} - -const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray - -export function merge(obj1: any, obj2: any) { - return deepmerge(obj1, obj2, { - arrayMerge: overwriteMerge, - }); -} diff --git a/packages/plugin-pages/src/views/index.ts b/packages/plugin-pages/src/views/index.ts deleted file mode 100644 index c5f2e1036cf6334f0b063414ece90c2847ab1424..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/views/index.ts +++ /dev/null @@ -1,99 +0,0 @@ -import * as types from './types'; -import _ from 'lodash'; - -export const views = new Map(); - -export function registerView(type: string, value: any) { - views.set(type, value); -} - -export function registerViews(values: any) { - Object.keys(values).forEach(type => { - registerView(type, { - ...values[type], - type, - }); - }); -} - -registerViews(types); - -export function getOptions() { - const options = []; - for (const [type, view] of views) { - options.push({ - key: type, - value: type, - label: view.title, - disabled: !!view.disabled, - }); - } - return options; -} - -export function getViewTypeLinkages() { - let xlinkages = []; - for (const [key, item] of views) { - const { linkages = {}, properties = {} } = _.cloneDeep(item); - if (key === 'markdown') { - xlinkages.push({ - "type": "value:visible", - "target": `x-${key}-props.*`, - "condition": `{{ $self.value === '${key}' }}`, - }); - } else { - xlinkages.push({ - "type": "value:visible", - "target": `x-${key}-props.*`, - "condition": `{{ $self.value === '${key}' && $form.values.dataSourceType === 'collection' }}`, - }); - } - if (linkages.type) { - xlinkages.push(...linkages.type); - } - } - return xlinkages; -} - -export function getTypeFieldOptions() { - return { - interface: 'select', - type: 'string', - name: 'type', - title: '视图类型', - required: true, - dataSource: getOptions(), - createOnly: false, - component: { - type: 'select', - }, - linkages: getViewTypeLinkages(), - }; -} - -export function getViewFields() { - const fields = new Map(); - for (const [key, item] of views) { - const { properties = {}, linkages = {} } = _.cloneDeep(item); - Object.keys(properties).forEach(name => { - const property = { - ...properties[name], - name, - }; - if (!property.type) { - property.type = 'virtual'; - } - if (property.type === 'virtual') { - property.name = `x-${key}-props.${name}`; - } - if (linkages[name]) { - property.linkages = linkages[name].map((linkage: any) => { - linkage.target = `x-${key}-props.${linkage.target}`; - return linkage; - }); - } - fields.set(`x-${key}-props.${name}`, property); - }); - } - return [...fields.values()]; -} diff --git a/packages/plugin-pages/src/views/types.ts b/packages/plugin-pages/src/views/types.ts deleted file mode 100644 index 05792797646be10802726555382a07ab0b0e3fa2..0000000000000000000000000000000000000000 --- a/packages/plugin-pages/src/views/types.ts +++ /dev/null @@ -1,492 +0,0 @@ -const fields = { - interface: 'json', - type: 'virtual', - title: '要显示的字段', - target: 'views_fields_v2', - component: { - type: 'subTable', - }, -}; - -const actions = { - interface: 'json', - type: 'virtual', - title: '操作按钮配置', - target: 'views_actions_v2', - component: { - type: 'subTable', - }, -}; - -const details = { - interface: 'json', - type: 'virtual', - title: '单条数据页面的标签页和视图', - target: 'views_details_v2', - component: { - type: 'subTable', - }, -}; - -const detailsOpenMode = { - interface: 'radio', - // type: 'string', - title: '单条数据页面的打开方式', - required: true, - dataSource: [ - { - label: '{{ markdown(\'常规页面 点击数据进入独立的页面\') }}', - value: 'window', - style: { - display: 'block', - lineHeight: '32px', - }, - }, - { - label: '{{ markdown(\'快捷抽屉 点击数据不离开当前页面,在右侧抽屉里打开操作界面\') }}', - value: 'drawer', - style: { - display: 'block', - lineHeight: '32px', - }, - }, - ], - defaultValue: 'drawer', - component: { - type: 'radio', - default: 'default', - }, -}; - -export const form = { - // fields, - title: '表单', - options: { - // fields, - }, - properties: { - info1: { - interface: 'description', - type: 'virtual', - title: '表单配置', - component: { - type: 'description', - }, - }, - fields: { - ...fields, - viewName: 'tableForForm', - title: '显示在表单里的字段' - }, - }, - linkages: { - - }, -}; - -export const descriptions = { - title: '详情', - options: { - // actions, - // fields, - }, - properties: { - info1: { - interface: 'description', - type: 'virtual', - title: '详情配置', - component: { - type: 'description', - }, - }, - fields: { - ...fields, - title: '显示在详情里的字段' - }, - info2: { - interface: 'description', - type: 'virtual', - title: '操作按钮配置', - component: { - type: 'description', - }, - }, - actions, - }, - linkages: { - - }, -}; - -export const table = { - title: '表格', - options: { - defaultPerPage: 20, - draggable: false, - filter: {}, - sort: [], - detailsOpenMode: 'drawer', - // actions, - // fields, - // details, - // labelField, - }, - properties: { - info1: { - interface: 'description', - type: 'virtual', - title: '表格配置', - component: { - type: 'description', - }, - }, - // 表格配置 - labelField: { - interface: 'select', - type: 'virtual', - title: '作为单条数据标题的字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - fields: { - ...fields, - title: '显示在表格里的字段' - }, - defaultPerPage: { - interface: 'radio', - type: 'virtual', - name: 'defaultPerPage', - title: '每页默认显示几条数据', - defaultValue: 50, - dataSource: [ - { label: '10', value: 10 }, - { label: '20', value: 20 }, - { label: '50', value: 50 }, - { label: '100', value: 100 }, - ], - }, - draggable: { - interface: 'boolean', - type: 'virtual', - title: '表格里支持拖拽数据排序', - }, - info2: { - interface: 'description', - type: 'virtual', - title: '数据配置', - component: { - type: 'description', - }, - }, - filter: { - interface: 'json', - type: 'virtual', - title: '只显示符合以下条件的数据', - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - }, - }, - // sort: { - // interface: 'json', - // type: 'virtual', - // title: '默认排序', - // mode: 'replace', - // defaultValue: [], - // component: { - // type: 'string', - // }, - // }, - info3: { - interface: 'description', - type: 'virtual', - title: '操作按钮配置', - component: { - type: 'description', - }, - }, - actions, - info4: { - interface: 'description', - type: 'virtual', - title: '单条数据页面配置', - component: { - type: 'description', - }, - }, - detailsOpenMode, - details, - }, - linkages: { - }, -}; - -export const calendar = { - title: '日历', - options: { - // filter, - // labelField, - // startDateField, - // endDateField, - // openMode, - // details, - }, - properties: { - info1: { - interface: 'description', - type: 'virtual', - title: '日历配置', - component: { - type: 'description', - }, - }, - // 日历配置 - labelField: { - interface: 'select', - type: 'virtual', - title: '作为单条数据标题的字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - startDateField: { - interface: 'select', - type: 'virtual', - title: '开始日期字段', - required: true, - component: { - type: 'remoteSelect', - placeholder: '默认为创建时间字段', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - endDateField: { - interface: 'select', - type: 'virtual', - title: '结束日期字段', - // required: true, - component: { - type: 'remoteSelect', - placeholder: '默认为创建时间字段', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'date', - }, - }, - }, - info2: { - interface: 'description', - type: 'virtual', - title: '数据配置', - component: { - type: 'description', - }, - }, - filter: { - interface: 'json', - type: 'virtual', - title: '只显示符合以下条件的数据', - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - }, - }, - info3: { - interface: 'description', - type: 'virtual', - title: '操作按钮配置', - component: { - type: 'description', - }, - }, - actions, - info4: { - interface: 'description', - type: 'virtual', - title: '单条数据页面配置', - component: { - type: 'description', - }, - }, - detailsOpenMode, - details, - }, - linkages: { - - }, -}; - -export const kanban = { - title: '看板', - options: { - }, - properties: { - info1: { - interface: 'description', - type: 'virtual', - title: '看板配置', - component: { - type: 'description', - }, - }, - labelField: { - interface: 'select', - type: 'virtual', - title: '作为单条数据标题的字段', - name: 'labelField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - groupField: { - interface: 'select', - type: 'virtual', - title: '看板分组字段', - name: 'groupField', - required: true, - component: { - type: 'remoteSelect', - resourceName: 'collections.fields', - labelField: 'title', - valueField: 'name', - filter: { - type: 'string', - }, - }, - }, - fields: { - ...fields, - title: '显示在看板里的字段' - }, - info2: { - interface: 'description', - type: 'virtual', - title: '数据配置', - component: { - type: 'description', - }, - }, - filter: { - interface: 'json', - type: 'virtual', - title: '只显示符合以下条件的数据', - mode: 'replace', - defaultValue: {}, - component: { - type: 'filter', - }, - }, - info3: { - interface: 'description', - type: 'virtual', - title: '操作按钮配置', - component: { - type: 'description', - }, - }, - actions, - info4: { - interface: 'description', - type: 'virtual', - title: '单条数据页面配置', - component: { - type: 'description', - }, - }, - detailsOpenMode, - details, - }, -}; - -export const markdown = { - title: 'Markdown', - options: { - // html, - }, - properties: { - // 数据配置 - html: { - interface: 'markdown', - type: 'virtual', - title: 'Markdown 内容', - component: { - type: 'markdown', - }, - }, - }, - linkages: { - type: [ - { - type: "value:visible", - target: 'collection', - condition: `{{ $self.value && $self.value !== 'markdown' }}`, - }, - { - type: "value:visible", - target: 'dataSourceType', - condition: `{{ $self.value && $self.value !== 'markdown' }}`, - }, - ], - }, -}; - -export const map = { - title: '地图', - disabled: true, - options: {}, - properties: {}, -}; - -export const chart = { - title: '图表', - disabled: true, - options: {}, - properties: {}, -}; - -export const report = { - title: '报表', - disabled: true, - options: {}, - properties: {}, -}; - -export const aggregate = { - title: '汇总指标', - disabled: true, - options: {}, - properties: {}, -}; diff --git a/packages/plugin-permissions/package.json b/packages/plugin-permissions/package.json index a3cd5bfd8c772f15f0651235963b3fd17077489c..b79c756aef8adb5c0aa33e4d7a5d73c408fcff98 100644 --- a/packages/plugin-permissions/package.json +++ b/packages/plugin-permissions/package.json @@ -1,13 +1,10 @@ { "name": "@nocobase/plugin-permissions", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", "dependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7" + "@nocobase/server": "^0.5.0-alpha.25" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-permissions/src/AccessController.ts b/packages/plugin-permissions/src/AccessController.ts deleted file mode 100644 index 372c817fe12139f6b2576b850d61d92c3f880237..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/AccessController.ts +++ /dev/null @@ -1,436 +0,0 @@ -import { Op } from 'sequelize'; - -import { ROLE_TYPE_ANONYMOUS, ROLE_TYPE_ROOT, ROLE_TYPE_USER } from './constants'; - - - -function getPermissions(roles) { - return roles.reduce((permissions, role) => permissions.concat(role.permissions), []); -} - -function getActionPermissions(permissions) { - const actionsMap = new Map(); - - permissions.forEach(permission => { - permission.get('actions').forEach(action => { - // 如果没有同名 action - if (!actionsMap.has(action.name)) { - actionsMap.set(action.name, action); - return; - } - - const existedScope = actionsMap.get(action.name).get('scope'); - // 如果之前的同名 action 没有 scope 或 filter 为空 - if (!existedScope || !existedScope.get('filter') || !Object.keys(existedScope.get('filter')).length) { - actionsMap.set(action.name, action); - return; - } - - const newScope = action.get('scope'); - // 如果新 action 没有 scope 或 filter 为空 - if (!newScope || !newScope.get('filter') || !Object.keys(newScope.get('filter')).length) { - return; - } - - // 以 or 关系合并两个 scope 中的 filter - existedScope.set('filter', { 'or': [existedScope.get('filter'), newScope.get('filter')] }); - }); - }); - - return Array.from(actionsMap.values()); -} - -function getFieldPermissions(permissions) { - const fieldsMap = new Map(); - permissions.forEach(permission => { - permission.get('fields_permissions').forEach(field => { - if (!fieldsMap.has(field.field_id)) { - fieldsMap.set(field.field_id, field); - return; - } - - const existedActions = fieldsMap.get(field.field_id).get('actions'); - if (!existedActions || !existedActions.length) { - fieldsMap.set(field.field_id, field); - return; - } - - const newActions = field.get('actions'); - if (!newActions || !newActions.length) { - return; - } - - const actions = new Set(existedActions); - newActions.forEach(item => actions.add(item)); - fieldsMap.get(field.field_id).set('actions', Array.from(actions)); - }); - }); - - return Array.from(fieldsMap.values()); -} - -function getTabPemissions(permissions) { - const tabs = new Set(); - permissions.forEach(permission => { - permission.get('tabs_permissions').forEach(tabPermission => tabs.add(tabPermission.tab_id)); - }); - - return Array.from(tabs); -} - -export type CollectionPermissions = { - actions: any[]; - fields: any[]; - tabs: any[] -}; - -export type PermissionParams = boolean | { - filter: any, - fields: any[] -}; - -// ctx.can = new AccessController(ctx).can; -// ctx.can('collection').permissions() -// => [{ name: 'list', scope: { id: 1, filter: {} } }] -// ctx.can('collection').act('list').any() -// => { filter: {}, fields: [] } -// ctx.can('collection').act('update').any() -// ctx.can('collection').act('update').one(resourceKey) -// ctx.can('collection').act('get').one(resourceKey) -// ctx.as(roles).can('collection').permissions() - -// TODO(optimize): 需要优化链式调用结构和上下文,以避免顺序或重置等问题 -export default class AccessController { - static isRoot(roles): boolean { - return (Array.isArray(roles) ? roles : [roles]).some(role => role.type === ROLE_TYPE_ROOT); - } - - context; - roles; - resourceName: string | null = null; - actionName: string | null = null; - - constructor(ctx) { - this.context = ctx; - } - - /** - * 用于临时创建新的身份进行相关操作 - * @param roles Array - */ - as(roles) { - const instance = new (this.constructor as T)(this.context); - instance.roles = Array.isArray(roles) ? roles : [roles]; - return instance; - } - - can(resourceName: string | null) { - this.resourceName = resourceName; - this.actionName = null; - return this; - } - - act(name: string | null) { - this.actionName = name; - return this; - } - - async permissions(): Promise { - const roles = await this.getRolesWithPermissions(); - if ((this.constructor as T).isRoot(roles)) { - return this.getRootPermissions(); - } - - const permissions = getPermissions(roles); - - return { - actions: getActionPermissions(permissions), - fields: getFieldPermissions(permissions), - tabs: getTabPemissions(permissions) - }; - } - - async any(): Promise { - const roles = await this.getRolesWithPermissions(); - if ((this.constructor as T).isRoot(roles)) { - return true; - } - if (this.resourceName === 'action_logs' && this.actionName === 'list') { - console.log(`skip ${this.resourceName}:${this.actionName}`); - return true; - } - if (this.resourceName === 'china_regions' && this.actionName === 'list') { - console.log(`skip ${this.resourceName}:${this.actionName}`); - return true; - } - // 只处理 actions 表里的权限,其余跳过 - const getActionNames = await this.getActionNames(); - if (!getActionNames.includes(this.actionName)) { - console.log(`skip ${this.resourceName}:${this.actionName}`); - return true; - } - const permissions = getPermissions(roles); - const actionPermissions = getActionPermissions(permissions); - - if (!actionPermissions.length) { - // 如果找不到可用的 action 记录 - // 则认为没有权限 - return false; - } - - const filters = actionPermissions - .filter(item => Boolean(item.scope) && Object.keys(item.scope.filter).length) - .map(item => item.scope.filter); - - const fields = getFieldPermissions(permissions); - - return { - filter: filters.length - ? filters.length > 1 ? { or: filters } : filters[0] - : {}, - fields - }; - } - - async one(resourceKey): Promise { - const any = await this.any(); - - if (typeof any === 'boolean') { - return any; - } - - const { filter } = any; - - const Collection = this.context.db.getModel(this.resourceName); - const existed = await Collection.count({ - where: { - ...Collection.parseApiJson({ filter, context: this.context }).where, - [Collection.primaryKeyAttribute]: resourceKey - } - }); - - return existed ? any : false; - } - - async getPermissions(): Promise { - const [Collection, Permission] = this.context.db.getModels(['collections', 'permissions']); - const roles = await this.getRoles(); - const permissions = await Permission.findAll({ - where: { - role_id: roles.map(role => role.id), - } - }); - return permissions; - } - - async getCollections(): Promise { - const [Collection, Permission] = this.context.db.getModels(['collections', 'permissions']); - const isRoot = await this.isRoot(); - if (isRoot) { - const collections = await Collection.findAll(); - return collections.map(collection => collection.name); - } - const roles = await this.getRoles(); - const permissions = await Permission.findAll({ - where: { - role_id: roles.map(role => role.id), - } - }); - return permissions.map(permission => permission.collection_name); - } - - async isRoot(): Promise { - const { context } = this; - const { currentUser } = context.state; - if (!currentUser) { - return false; - } - - const count = await currentUser.countRoles({ - where: { - type: ROLE_TYPE_ROOT - } - }); - - return !!count; - } - - async getRoles() { - if (this.roles) { - return this.roles; - } - const { context } = this; - let userRoles = []; - const { currentUser } = context.state; - if (currentUser) { - const rootRoles = await currentUser.getRoles({ - where: { - type: ROLE_TYPE_ROOT - } - }); - if (rootRoles.length) { - return rootRoles; - } - - userRoles = await currentUser.getRoles({ - where: { - type: ROLE_TYPE_USER - } - }); - } - - const Role = context.db.getModel('roles'); - const anonymousRoles = await Role.findAll({ - where: { - type: ROLE_TYPE_ANONYMOUS - } - }); - - return [...userRoles, ...anonymousRoles]; - } - - async getRolesWithPermissions() { - const { context, resourceName, actionName = null } = this; - if (!resourceName) { - throw new Error('resource name must be set first by `can(resourceName)`'); - } - - const permissionOptions = { - where: { - collection_name: resourceName - }, - include: [ - { - association: 'actions', - ...(actionName ? { - where: { - name: `${resourceName}:${actionName}` - }, - required: true, - } : {}), - // 对 hasMany 关系可以进行拆分查询,避免联表过多标识符超过 PG 的 64 字符限制 - separate: true, - include: [ - { - association: 'scope' - } - ] - }, - { - association: 'fields_permissions', - include: [ - { - association: 'field' - } - ], - separate: true, - }, - { - association: 'tabs_permissions', - separate: true, - } - ] - }; - const permissionInclusion = { - ...permissionOptions, - association: 'permissions', - required: true - }; - - if (this.roles) { - if (!(this.constructor as T).isRoot(this.roles)) { - for (const role of this.roles) { - role.permissions = await role.getPermissions(permissionOptions); - role.set('permissions', role.permissions); - } - } - return this.roles; - } - - let userRoles = []; - // 获取登入用户的角色及权限 - const { currentUser } = context.state; - if (currentUser) { - const rootRoles = await currentUser.getRoles({ - where: { - type: ROLE_TYPE_ROOT - } - }); - if (rootRoles.length) { - return rootRoles; - } - - userRoles = await currentUser.getRoles({ - where: { - type: ROLE_TYPE_USER - }, - include: [ - permissionInclusion - ] - }); - } - - // 获取匿名用户的角色及权限 - const Role = context.db.getModel('roles'); - const anonymousRoles = await Role.findAll({ - where: { - type: ROLE_TYPE_ANONYMOUS - }, - include: [ - permissionInclusion - ] - }); - - return [...anonymousRoles, ...userRoles]; - } - - async getActionNames() { - const { context, resourceName = null } = this; - const Action = context.db.getModel('actions'); - const actions = await Action.findAll({ - where: { - collection_name: { [Op.or]: [resourceName, null] } - } - }); - return actions.map(action => action.name); - } - - async getRootPermissions(): Promise { - const { context, resourceName = null } = this; - const Action = context.db.getModel('actions'); - const actions = await Action.findAll({ - where: { - collection_name: { [Op.or]: [resourceName, null] } - } - }); - - const Field = context.db.getModel('fields'); - const fields = await Field.findAll({ - where: { - collection_name: resourceName - } - }); - - const Tab = context.db.getModel('tabs'); - const tabs = await Tab.findAll({ - where: { - collection_name: resourceName - }, - attribute: [Tab.primaryKeyAttribute] - }); - - const actionsNames = actions.map(action => ({ - name: `${resourceName}:${action.name}` - })); - - return { - actions: actionsNames, - fields: fields.map(field => ({ - field, - field_id: field.id, - actions: actionsNames.map(({ name }) => name) - })), - tabs: tabs.map(tab => tab[Tab.primaryKeyAttribute]) - } - } -} diff --git a/packages/plugin-permissions/src/__tests__/AccessController.test.ts b/packages/plugin-permissions/src/__tests__/AccessController.test.ts deleted file mode 100644 index e189ca86366f9fdedbde403f7d832b34ef72e082..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/AccessController.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { getApp } from '.'; -import AccessController from '../AccessController'; - -describe('AccessController', () => { - let app; - let db; - const ac: any = {}; - - beforeEach(async () => { - app = await getApp(); - db = app.database; - - ac.anonymous = new AccessController({ - state: {}, - db - }); - - const User = db.getModel('users'); - const user = await User.findByPk(1); - ac.user = new AccessController({ - state: { currentUser: user }, - db - }); - - const root = await User.findByPk(4); - ac.root = new AccessController({ - state: { currentUser: root }, - db - }); - }); - - afterEach(() => db.close()); - - describe('can().permissions()', () => { - it('anonymous', async () => { - const result = await ac.anonymous.can('posts').permissions(); - expect(result).toMatchObject({ - actions: [ - { name: 'posts:list', scope: { filter: { status: 'published' }, collection_name: 'posts' } } - ], - fields: [ - { actions: ['posts:list'] } - ], - tabs: [] - }); - }); - }); - - describe('can().act()', () => { - it('normal user invoke can().permissions() invoked after .act()', async () => { - const actionResult = await ac.user.can('posts').act('list').any(); - expect(actionResult.filter).toEqual({ - or: [ - { status: 'published' }, - { status: 'draft', 'created_by_id.$currentUser': true } - ] - }); - - const permissionsResult = await ac.user.can('posts').permissions(); - expect(permissionsResult).toMatchObject({ - actions: [ - { - name: 'posts:list', - scope: { filter: { or: [{ status: 'published' }, { status: 'draft', 'created_by_id.$currentUser': true }] } } - }, - { - name: 'posts:update', - scope: { filter: { status: 'draft', 'created_by_id.$currentUser': true }, collection_name: 'posts' }, - } - ], - tabs: [] - }); - }); - }); -}); diff --git a/packages/plugin-permissions/src/__tests__/index.ts b/packages/plugin-permissions/src/__tests__/index.ts deleted file mode 100644 index fcb7d5b5249394aab1e7ae2ebc92cc46df6846ee..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/index.ts +++ /dev/null @@ -1,149 +0,0 @@ -import path from 'path'; -import qs from 'qs'; -import supertest from 'supertest'; -import bodyParser from 'koa-bodyparser'; -import { Dialect } from 'sequelize'; -import Database from '@nocobase/database'; -import { actions, middlewares } from '@nocobase/actions'; -import { Application } from '@nocobase/server'; -import middleware from '@nocobase/server/src/middleware'; -import plugin from '../server'; -import seed from './seed'; - -function getTestKey() { - const { id } = require.main; - const key = id - .replace(`${process.env.PWD}/packages`, '') - .replace(/src\/__tests__/g, '') - .replace('.test.ts', '') - .replace(/[^\w]/g, '_') - .replace(/_+/g, '_'); - return key -} - -const config = { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: Number.parseInt(process.env.DB_PORT, 10), - dialect: process.env.DB_DIALECT as Dialect, - logging: process.env.DB_LOG_SQL === 'on', - sync: { - force: true, - alter: { - drop: true, - }, - }, - hooks: { - beforeDefine(columns, model) { - model.tableName = `${getTestKey()}_${model.tableName || model.name.plural}`; - } - }, -}; - -export function getDatabase() { - return new Database(config); -}; - -export async function getApp() { - const app = new Application({ - database: config, - resourcer: { - prefix: '/api', - }, - }); - app.resourcer.use(middlewares.associated); - app.resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); - app.registerPlugin({ - collections: path.resolve(__dirname, '../../../plugin-collections'), - users: path.resolve(__dirname, '../../../plugin-users'), - permissions: plugin - }); - await app.loadPlugins(); - const testTables = app.database.import({ - directory: path.resolve(__dirname, './tables') - }); - try { - await app.database.sync(); - } catch (err) { - console.error(err); - } - - for (const table of testTables.values()) { - // TODO(bug): 由于每个用例结束后不会清理用于测试的数据表,导致再次创建和更新 - // 创建和更新里面仍会再次创建 fields,导致创建相关的数据重复,数据库报错。 - await app.database.getModel('collections').import(table.getOptions(), { update: true, migrate: false }); - } - - await seed(app.database); - - app.context.db = app.database; - app.use(bodyParser()); - app.use(middleware({ - prefix: '/api', - resourcer: app.resourcer, - database: app.database, - })); - return app; -} - -interface ActionParams { - resourceKey?: string | number; - // resourceName?: string; - // associatedName?: string; - associatedKey?: string | number; - fields?: any; - filter?: any; - values?: any; - [key: string]: any; -} - -interface Handler { - get: (params?: ActionParams) => Promise; - list: (params?: ActionParams) => Promise; - create: (params?: ActionParams) => Promise; - update: (params?: ActionParams) => Promise; - destroy: (params?: ActionParams) => Promise; - [name: string]: (params?: ActionParams) => Promise; -} - -export interface Agent { - resource: (name: string) => Handler; -} - -export function getAgent(app: Application) { - return supertest.agent(app.callback()); -} - -export function getAPI(app: Application) { - const agent = getAgent(app); - return { - resource(name: string): any { - return new Proxy({}, { - get(target, method: string, receiver) { - return (params: ActionParams = {}) => { - const { associatedKey, resourceKey, values = {}, filePath, ...restParams } = params; - let url = `/api/${name}`; - if (associatedKey) { - url = `/api/${name.split('.').join(`/${associatedKey}/`)}`; - } - url += `:${method as string}`; - if (resourceKey) { - url += `/${resourceKey}`; - } - - switch (method) { - case 'list': - case 'get': - return agent.get(`${url}?${qs.stringify(restParams)}`); - - default: - return agent.post(`${url}?${qs.stringify(restParams)}`).send(values); - } - } - } - }); - } - }; -} diff --git a/packages/plugin-permissions/src/__tests__/list.test.ts b/packages/plugin-permissions/src/__tests__/list.test.ts deleted file mode 100644 index a2297e7522ced78c7c6a54b5359f8c99b72a4221..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/list.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { getApp, getAgent, getAPI } from '.'; -import AccessController from '../AccessController'; - -describe('list', () => { - let app; - let agent; - let api; - let db; - let userAgents; - - beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - db = app.database; - - const User = db.getModel('users'); - const users = await User.findAll({ order: [['id', 'ASC']] }); - userAgents = users.map(user => { - const userAgent = getAgent(app); - userAgent.set('Authorization', `Bearer ${user.token}`); - return userAgent; - }); - - }); - - afterEach(() => db.close()); - - describe('anonymous', () => { - it('fetch all drafts only get empty list', async () => { - const response = await agent.get('/api/posts'); - expect(response.status).toBe(200); - expect(response.body.count).toBe(0); - }); - }); - - describe('normal user', () => { - it('user could get posts created by self and limited fields', async () => { - const response = await userAgents[0].get('/api/posts?sort=title'); - expect(response.body.count).toBe(2); - // TODO(bug): fields 过滤暂时先跳过了 - // expect(response.body.rows).toEqual([ - // { title: 'title1', status: 'draft', category: null }, - // { title: 'title2', status: 'draft', category: null } - // ]); - }); - }); -}); diff --git a/packages/plugin-permissions/src/__tests__/seed.ts b/packages/plugin-permissions/src/__tests__/seed.ts deleted file mode 100644 index 6af7e14313225a69b28957a6a60f3238ba3c0976..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/seed.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { ROLE_TYPE_ANONYMOUS, ROLE_TYPE_ROOT, ROLE_TYPE_USER } from '../constants'; - -export default async function (db) { - const User = db.getModel('users'); - const users = await User.bulkCreate([ - { username: 'user1', token: 'token1' }, - { username: 'user2', token: 'token2' }, - { username: 'user3', token: 'token3' }, - { username: 'user4', token: 'token4' }, - ]); - - const Role = db.getModel('roles'); - const roles = await Role.bulkCreate([ - { title: '匿名用户', type: ROLE_TYPE_ANONYMOUS }, - { title: '普通用户' }, - { title: '编辑' }, - { title: '管理员', type: ROLE_TYPE_ROOT }, - ]); - - const Scope = db.getModel('scopes'); - const scopePublished = await Scope.create({ collection_name: 'posts', filter: { status: 'published' } }, { logging: true }); - // TODO(bug): 字段应使用 'created_by' 名称,通过程序映射成外键 - const scopeCreatedBy = await Scope.create({ collection_name: 'posts', filter: { status: 'draft', 'created_by_id.$currentUser': true } }); - - const Field = db.getModel('fields'); - const postTitleField = await Field.findOne({ - where: { - name: 'title', - collection_name: 'posts' - } - }); - const postStatusField = await Field.findOne({ - where: { - name: 'status', - collection_name: 'posts' - } - }); - const postCategoryField = await Field.findOne({ - where: { - name: 'category', - collection_name: 'posts' - } - }); - - // 匿名用户 - await roles[0].updateAssociations({ - permissions: [ - { - collection_name: 'posts', - actions: [ - { - name: 'posts:list', - scope: scopePublished, - } - ], - fields_permissions: [ - { - field_id: postTitleField[Field.primaryKeyAttribute], - actions: ['posts:list'] - } - ] - }, - { - collection_name: 'categories', - actions: [ - { name: 'posts:list' } - ] - } - ] - }, { migrate: false }); - - // 普通用户 - await roles[1].updateAssociations({ - users: [users[0], users[3]], - permissions: [ - { - collection_name: 'posts', - actions: [ - { - name: 'posts:list', - scope: scopeCreatedBy, - }, - { - name: 'posts:update', - scope: scopeCreatedBy, - } - ], - fields: [ - { - id: postTitleField.id, - fields_permissions: { actions: ['posts:list', 'posts:create', 'posts:update'] } - }, - { - id: postStatusField.id, - fields_permissions: { actions: ['posts:list'] } - }, - { - id: postCategoryField.id, - fields_permissions: { actions: ['posts:list'] } - }, - ] - } - ] - }, { migrate: false }); - - // 编辑 - await roles[2].updateAssociations({ - users: [users[1], users[3]], - permissions: [ - { - collection_name: 'posts', - actions: [ - { - name: 'posts:update' - } - ], - fields_permissions: [ - { - field_id: postTitleField[Field.primaryKeyAttribute], - actions: ['posts:update'] - }, - { - field_id: postStatusField[Field.primaryKeyAttribute], - actions: ['posts:update'] - }, - { - field_id: postCategoryField[Field.primaryKeyAttribute], - actions: ['posts:update'] - }, - ] - }, - { - collection_name: 'categories', - actions: [ - { name: 'posts:create' }, - { name: 'posts:update' }, - { name: 'posts:destroy' }, - ] - } - ] - }, { migrate: false }); - - // 管理员 - - const Post = db.getModel('posts'); - await Post.bulkCreate([ - { title: 'title1', created_by_id: users[0].id, status: 'draft' }, - { title: 'title2', created_by_id: users[0].id, status: 'draft' }, - { title: 'title3', created_by_id: users[1].id, status: 'draft' }, - { title: 'title4', created_by_id: users[3].id, status: 'draft' }, - ]); -} diff --git a/packages/plugin-permissions/src/__tests__/tables/categories.ts b/packages/plugin-permissions/src/__tests__/tables/categories.ts deleted file mode 100644 index 7d1e0f501d324ff2729563ba1a3ecdac37ef40f2..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/tables/categories.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'categories', - fields: [ - { - type: 'string', - name: 'title', - }, - { - type: 'hasMany', - name: 'posts', - }, - ] -} as TableOptions; diff --git a/packages/plugin-permissions/src/__tests__/tables/comments.ts b/packages/plugin-permissions/src/__tests__/tables/comments.ts deleted file mode 100644 index 1253e4da4a8fdf7c7cdcc56a333f3f6821c9feed..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/tables/comments.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'comments', - fields: [ - { - type: 'string', - name: 'content', - }, - { - type: 'belongsTo', - name: 'post', - }, - { - type: 'belongsTo', - name: 'user', - }, - ] -} as TableOptions; diff --git a/packages/plugin-permissions/src/__tests__/tables/posts.ts b/packages/plugin-permissions/src/__tests__/tables/posts.ts deleted file mode 100644 index 7c6c1ddbd901c44c08dd4d4359289834d0bedb05..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/__tests__/tables/posts.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TableOptions } from "@nocobase/database"; - -export default { - name: 'posts', - // 目前默认就带了 - // createdBy: true, - statusable: false, - fields: [ - { - type: 'string', - name: 'title', - }, - { - type: 'string', - name: 'status', - // TODO(BUG): 默认值无效 - defaultValue: 'draft', - }, - { - type: 'belongsTo', - name: 'category', - }, - { - type: 'hasMany', - name: 'comments', - }, - ] -} as TableOptions; diff --git a/packages/plugin-permissions/src/actions/collections.roles.ts b/packages/plugin-permissions/src/actions/collections.roles.ts deleted file mode 100644 index eab23ed5426694be9f5287d67a617dc1d2bd4d79..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/actions/collections.roles.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { actions, middlewares } from '@nocobase/actions'; -import * as rolesCollectionsActions from './roles.collections'; - -export async function list(ctx: actions.Context, next: actions.Next) { - // TODO: 暂时 action 中间件就这么写了 - ctx.action.mergeParams({ - associated: null, - }); - return actions.common.list(ctx, next); -} - -export async function get(ctx: actions.Context, next: actions.Next) { - const { resourceName, resourceKey, associatedName, associatedKey } = ctx.action.params; - ctx.action.mergeParams({ - associated: null, - resourceName: associatedName, - resourceKey: associatedKey, - associatedName: resourceName, - associatedKey: resourceKey, - }); - await middlewares.associated(ctx, async () => { - }); - return rolesCollectionsActions.get(ctx, next); -} - -export async function update(ctx: actions.Context, next: actions.Next) { - const { resourceName, resourceKey, associatedName, associatedKey } = ctx.action.params; - ctx.action.mergeParams({ - associated: null, - resourceName: associatedName, - resourceKey: associatedKey, - associatedName: resourceName, - associatedKey: resourceKey, - }); - await middlewares.associated(ctx, async () => { - }); - return rolesCollectionsActions.update(ctx, next); -} diff --git a/packages/plugin-permissions/src/actions/roles.collections.ts b/packages/plugin-permissions/src/actions/roles.collections.ts deleted file mode 100644 index 655c35da04cfc4ce5ef80e8dc6c30993f786ea78..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/actions/roles.collections.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { Op } from 'sequelize'; -import { actions } from '@nocobase/actions'; -import _ from 'lodash'; - -export async function list(ctx: actions.Context, next: actions.Next) { - const { associated } = ctx.action.params; - // TODO: 暂时 action 中间件就这么写了 - ctx.action.mergeParams({ - associated: null - }); - await actions.common.list(ctx, async () => { - const permissions = await associated.getPermissions(); - ctx.body.rows.forEach(item => { - const permission = permissions.find(p => p.collection_name === item.get('name')); - if (permission) { - // item.permissions = [permission]; // 不输出 - item.set('permissions', [permission]); // 输出 - } - }); - }); - await next(); -} - -export async function get(ctx: actions.Context, next: actions.Next) { - const { - resourceKey, - associated - } = ctx.action.params; - - const permissions = await ctx.ac.as(associated).can(resourceKey).permissions(); - - const permission = await associated.getPermissions({ - where: { - collection_name: resourceKey, - }, - plain: true, - limit: 1, - }); - - ctx.body = { - ...permissions, - description: _.get(permission, 'description'), - }; - - await next(); -} - -export async function update(ctx: actions.Context, next: actions.Next) { - const { - resourceKey, - associated, - values - } = ctx.action.params; - - const transaction = await ctx.db.sequelize.transaction(); - - // role.getPermissions - let [permission] = await associated.getPermissions({ - where: { - collection_name: resourceKey - }, - transaction - }); - - if (!permission) { - // 不存在则创建 - permission = await associated.createPermission({ - collection_name: resourceKey, - description: values.description - }, { transaction }); - } else { - // 存在则更新描述 - await permission.update({ description: values.description }, { transaction }); - } - - // 查找对应 collection 下所有“可用”的 actions - const ActionModel = ctx.db.getModel('actions'); - const availableActions = await ActionModel.findAll({ - where: { - // null 代表全局 action - collection_name: { - [Op.or]: [resourceKey, null] - }, - ...(ctx.state.developerMode ? {} : { developerMode: false }) - }, - transaction - }); - - // 需要移除的 = 所有可用的 - 要添加的 - const toRemoveActionNames = new Set(); - availableActions.forEach(action => { - const name = `${action.collection_name || resourceKey}:${action.name}`; - if (!values.actions.find(item => item.name === name)) { - toRemoveActionNames.add(name); - } - }); - - // 移除没有设置的 - // 因为只知道 name(不知道 id),所以只能从 Model 上调用移除 - const ActionPermission = ctx.db.getModel('actions_permissions'); - await ActionPermission.destroy({ - where: { - permission_id: permission.id, - name: Array.from(toRemoveActionNames) - }, - transaction - }); - // 更新或创建 - const existedActions = await permission.getActions({ transaction }); - for (const actionItem of values.actions) { - const action = existedActions.find(item => item.name === actionItem.name); - if (action) { - await action.update(actionItem, { transaction }); - } else { - await permission.createAction(actionItem, { transaction }); - } - }; - - const fieldsValue = values.fields.filter(field => field.actions && field.actions.length); - const existedFields = await permission.getFields_permissions({ - include: [ - { association: 'field' } - ], - transaction - }); - const toRemoveFields = []; - const fieldsLeft = []; - existedFields.forEach(field => { - if ( - !fieldsValue.find(({ field_id }) => field_id === field.field_id) - && !(field.field.developerMode ^ ctx.state.developerMode) - ) { - toRemoveFields.push(field.field); - } else { - fieldsLeft.push(field); - } - }); - if (toRemoveFields.length) { - await permission.removeFields(toRemoveFields, { transaction }); - } - for (const fieldItem of fieldsValue) { - const field = fieldsLeft.find(item => item.field_id === fieldItem.field_id); - if (field) { - await field.update(fieldItem, { transaction }); - } else { - await permission.createFields_permission(fieldItem, { transaction }); - } - } - - const TabModel = ctx.db.getModel('tabs'); - const existedTabs = await permission.getTabs({ transaction }); - const toRemoveTabs = existedTabs.filter(tab => ( - // 如果没找到 - !values.tabs.find(id => tab[TabModel.primaryKeyAttribute] === id) - // 且开发者模式匹配 - && !(tab.developerMode ^ ctx.state.developerMode))); - await permission.removeTabs(toRemoveTabs, { transaction }); - await permission.addTabs(values.tabs, { transaction }); - - await transaction.commit(); - - ctx.body = permission; - - await next(); -} diff --git a/packages/plugin-permissions/src/collections/action_permissions.ts b/packages/plugin-permissions/src/collections/action_permissions.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c4b521106048f4830ff044d84ee640d2ee20acf --- /dev/null +++ b/packages/plugin-permissions/src/collections/action_permissions.ts @@ -0,0 +1,38 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'action_permissions', + fields: [ + { + type: 'string', + name: 'actionName', + }, + { + type: 'belongsTo', + name: 'scope', + }, + { + type: 'belongsTo', + name: 'collection', + }, + { + type: 'belongsTo', + name: 'role', + }, + { + type: 'belongsTo', + name: 'user', + }, + { + type: 'hasMany', + name: 'fieldPermissions', + target: 'field_permissions', + foreignKey: 'action_permission_id', + }, + { + type: 'belongsToMany', + name: 'fields', + through: 'field_permissions', + }, + ], +} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/actions_permissions.ts b/packages/plugin-permissions/src/collections/actions_permissions.ts deleted file mode 100644 index 14e4d977548fa838029f4624c2a4ac4c42f6da6f..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/actions_permissions.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'actions_permissions', - title: '表操作权限', - developerMode: true, - internal: true, - fields: [ - { - comment: '程序操作名称("list", "create" 等)', - type: 'string', - name: 'name', - }, - { - comment: '操作范围', - type: 'belongsTo', - name: 'scope', - target: 'scopes' - }, - { - type: 'belongsTo', - name: 'permission', - onDelete: 'CASCADE' - }, - ], -} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/collections.ts b/packages/plugin-permissions/src/collections/collections.ts deleted file mode 100644 index ce9a951ca0fabaa89f1493414c8e8f3947d05a0a..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/collections.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { extend } from '@nocobase/database'; - -export default extend({ - name: 'collections', - fields: [ - { - interface: 'linkTo', - title: '权限', - type: 'belongsToMany', - name: 'roles', - through: 'permissions', - sourceKey: 'name' - }, - // { - // type: 'hasMany', - // name: 'permissions', - // sourceKey: 'name', - // foreignKey: 'collection_name' - // } - ], -}); diff --git a/packages/plugin-permissions/src/collections/fields_permissions.ts b/packages/plugin-permissions/src/collections/fields_permissions.ts deleted file mode 100644 index c22a2a0d5b0512391211ec395e1d398247f5e80b..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/fields_permissions.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'fields_permissions', - title: '列操作权限', - developerMode: true, - internal: true, - fields: [ - { - type: 'belongsTo', - name: 'permission', - }, - { - type: 'belongsTo', - name: 'field', - onDelete: 'CASCADE', - }, - { - type: 'jsonb', - name: 'actions' - } - ], -} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/permissions.ts b/packages/plugin-permissions/src/collections/permissions.ts deleted file mode 100644 index 71e9e8565bb757cab92ccc33bc83dc88d7c9cf05..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/permissions.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'permissions', - title: '权限集', - developerMode: true, - internal: true, - fields: [ - // TODO(feature): 黑白名单控制 - // { - // comment: '白名单或黑名单', - // type: 'boolean', - // name: 'mode', - // defaultValue: false - // }, - { - type: 'integer', - name: 'id', - primaryKey: true, - autoIncrement: true - }, - { - type: 'string', - name: 'description', - }, - { - comment: '关联的角色', - type: 'belongsTo', - name: 'role', - }, - { - comment: '关联的表名', - type: 'belongsTo', - name: 'collection', - targetKey: 'name' - }, - { - comment: '允许的操作集', - type: 'hasMany', - name: 'actions', - target: 'actions_permissions' - }, - { - type: 'belongsToMany', - name: 'fields', - through: 'fields_permissions', - }, - { - type: 'hasMany', - name: 'fields_permissions' - }, - // { - // comment: '允许的 views 列表', - // type: 'belongsToMany', - // name: 'views', - // through: 'views_permissions' - // }, - // { - // comment: '视图集(方便访问)', - // type: 'hasMany', - // name: 'views_permissions', - // }, - { - comment: '允许的 tabs 列表', - type: 'belongsToMany', - name: 'tabs', - through: 'tabs_permissions' - }, - { - comment: '标签页集(方便访问)', - type: 'hasMany', - name: 'tabs_permissions', - }, - ], -} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/roles.ts b/packages/plugin-permissions/src/collections/roles.ts index a88df62ba2d9475ab4eb2cf95267c961220d29cc..f4d59e46cfc292ab6d19e071ac84863ab50933c8 100644 --- a/packages/plugin-permissions/src/collections/roles.ts +++ b/packages/plugin-permissions/src/collections/roles.ts @@ -1,194 +1,35 @@ import { TableOptions } from '@nocobase/database'; -import { ROLE_TYPE_ROOT, ROLE_TYPE_USER, ROLE_TYPE_ANONYMOUS } from '../constants'; export default { name: 'roles', - title: '权限组配置', - developerMode: true, - internal: true, + sortable: 'sort', fields: [ { - interface: 'string', - title: '权限组名称', - comment: '角色名称', - type: 'string', - name: 'title', - component: { - showInTable: true, - showInForm: true, - showInDetail: true, - }, + type: 'uid', + name: 'name', + primaryKey: true, + prefix: 'r_', }, { - interface: 'select', - title: '角色类型', - type: 'integer', - name: 'type', - developerMode: true, - dataSource: [ - { value: ROLE_TYPE_ROOT, label: '系统角色' }, - { value: ROLE_TYPE_ANONYMOUS, label: '匿名角色' }, - { value: ROLE_TYPE_USER, label: '自定义角色' }, - ], - defaultValue: ROLE_TYPE_USER, - component: { - showInTable: true, - showInDetail: true, - } - }, - { - interface: 'boolean', - title: '默认权限组', - type: 'radio', - name: 'default', - component: { - showInTable: true, - showInForm: true, - showInDetail: true, - } + type: 'string', + name: 'title', }, { - interface: 'textarea', - title: '描述', - type: 'text', - name: 'description', - component: { - showInTable: true, - showInForm: true, - showInDetail: true, - }, + type: 'hasMany', + name: 'actionPermissions', + target: 'action_permissions', }, - // TODO(feature): 用户组后续考虑 - // TODO(feature): 用户表应通过插件配置关联,考虑到今后会有多账户系统的情况 { - interface: 'linkTo', - title: '用户', - comment: '关联的用户表', type: 'belongsToMany', name: 'users', target: 'users', - through: 'users_roles' + through: 'roles_users' }, { - interface: 'linkTo', - title: '数据表', - comment: '包含的以数据表分组的权限集', type: 'belongsToMany', - name: 'collections', - through: 'permissions', - targetKey: 'name' - }, - { - interface: 'linkTo', - title: '页面', - type: 'belongsToMany', - name: 'menus', - target: 'menus', - through: 'menus_permissions', - }, - { - comment: '权限集(方便访问)', - type: 'hasMany', - name: 'permissions' - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - // { - // type: 'get', - // name: 'get', - // title: '详情', - // }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - filter: { - type: ROLE_TYPE_USER, - default: false - } - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'title', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['title', 'description', 'default'], - detailsOpenMode: 'drawer', // window - details: ['descriptions', 'collections', 'pages'], - sort: ['id'], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - fields: ['title', 'description', 'default'], - actions: [ - { - name: 'update', - type: 'update', - title: '编辑', - viewName: 'form', - }, - ], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['title', 'description', 'default'], - }, - { - developerMode: true, - type: 'table', - dataSourceType: 'association', - name: 'collections', - title: '数据操作权限', - targetViewName: 'permissions_table', - targetFieldName: 'collections', - }, - { - developerMode: true, - type: 'table', - dataSourceType: 'association', - name: 'pages', - title: '菜单和页面权限', - targetViewName: 'permissions_table', - targetFieldName: 'menus', + name: 'ui_schemas', + target: 'ui_schemas', + through: 'roles_ui_schemas' }, ], } as TableOptions; diff --git a/packages/plugin-permissions/src/collections/scopes.ts b/packages/plugin-permissions/src/collections/scopes.ts new file mode 100644 index 0000000000000000000000000000000000000000..b61514d31c38b883b24b98ec23956c81c53c78b3 --- /dev/null +++ b/packages/plugin-permissions/src/collections/scopes.ts @@ -0,0 +1,20 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'scopes', + sortable: 'sort', + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'json', + name: 'filter', + }, + { + type: 'belongsTo', + name: 'collection', + }, + ], +} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/tabs_permissions.ts b/packages/plugin-permissions/src/collections/tabs_permissions.ts deleted file mode 100644 index 381df42e20520a02dd72a2119922d64f1270cf10..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/tabs_permissions.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'tabs_permissions', - title: '标签页访问权限', - developerMode: true, - internal: true, - fields: [ - { - type: 'belongsTo', - name: 'permission', - }, - { - type: 'belongsTo', - name: 'tab' - }, - ], -} as TableOptions; diff --git a/packages/plugin-permissions/src/collections/users.ts b/packages/plugin-permissions/src/collections/users.ts deleted file mode 100644 index 40eaab63f4f2e945e1c11471cedf77703b2e5c10..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/collections/users.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TableOptions } from '@nocobase/database'; - -export default { - name: 'users', - fields: [ - { - interface: 'linkTo', - type: 'belongsToMany', - name: 'roles', - title: '权限组', - target: 'roles', - labelField: 'title', - through: 'users_roles', - component: { - type: 'drawerSelect', - showInTable: true, - showInForm: true, - showInDetail: true, - 'x-component-props': { - resourceName: 'collections.roles', - labelField: 'title', - valueField: 'id', - }, - }, - }, - ], -}; diff --git a/packages/plugin-permissions/src/constants.ts b/packages/plugin-permissions/src/constants.ts deleted file mode 100644 index 915a34903e6896defb9a686f7176b76273264c67..0000000000000000000000000000000000000000 --- a/packages/plugin-permissions/src/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const ROLE_TYPE_ROOT = -1; -export const ROLE_TYPE_ANONYMOUS = 0; -export const ROLE_TYPE_USER = 1; diff --git a/packages/plugin-permissions/src/server.ts b/packages/plugin-permissions/src/server.ts index a7eddaaae1543a5a847e2ebe9eb6ca0685232a5a..88752bad0a37639201804ec4a1af83049e70e99b 100644 --- a/packages/plugin-permissions/src/server.ts +++ b/packages/plugin-permissions/src/server.ts @@ -1,166 +1,12 @@ import path from 'path'; -import { Op } from 'sequelize'; -import { Application } from '@nocobase/server'; -import { Operator } from '@nocobase/database'; -import * as collectionsRolesActions from './actions/collections.roles'; -import * as rolesCollectionsActions from './actions/roles.collections'; -import AccessController, { PermissionParams } from './AccessController'; - -// API -// const permissions = ctx.app.getPluginInstance('permissions'); -// const result: boolean = permissions.can(key, options); - - - -export class Permissions { - readonly app: Application; - readonly options: any; - - constructor(app: Application, options) { - this.app = app; - this.options = options; - - const { database, resourcer } = app; +import { PluginOptions } from '@nocobase/server'; +export default { + name: 'permissions', + async load() { + const database = this.app.db; database.import({ directory: path.resolve(__dirname, 'collections'), }); - - Object.keys(collectionsRolesActions).forEach(actionName => { - resourcer.registerActionHandler(`collections.roles:${actionName}`, collectionsRolesActions[actionName]); - }); - - Object.keys(rolesCollectionsActions).forEach(actionName => { - resourcer.registerActionHandler(`roles.collections:${actionName}`, rolesCollectionsActions[actionName]); - }); - - database.getModel('collections').addHook('afterCreate', async (model: any, options) => { - await model.updateAssociations({ - scopes: [ - { - title: '全部数据', - filter: {}, - locked: true - }, - { - title: '用户自己的数据', - filter: { - "created_by_id.$currentUser": true, - }, - locked: true - }, - ] - }, options); - }); - - database.getModel('users').addHook('afterCreate', async(model, options) => { - const { transaction = await database.sequelize.transaction() } = options; - const Role = database.getModel('roles'); - const defaultRole = await Role.findOne({ where: { default: true }, transaction }); - if (defaultRole) { - // @ts-ignore - await model.addRole(defaultRole, { transaction }); - } - if (!options.transaction) { - await transaction.commit(); - } - }); - - // 针对“自己创建的” scope 添加特殊的操作符以生成查询条件 - if (!Operator.has('$currentUser')) { - Operator.register('$currentUser', (value, { ctx }) => { - const user = ctx.state.currentUser; - return { [Op.eq]: user[user.constructor.primaryKeyAttribute] }; - }); - } - - resourcer.use(this.injection); - resourcer.use(this.middleware); - - resourcer.use(async (ctx, next) => { - const { resourceName } = ctx.action.params; - if (resourceName === 'action_logs' && !await ctx.ac.isRoot()) { - const collections = await ctx.ac.getCollections(); - ctx.action.mergeParams({ - filter: { - 'collection_name.in': collections - }, - }); - } - await next(); - }); } - - injection = async (ctx, next) => { - ctx.ac = new AccessController(ctx); - - return next(); - }; - - middleware = async (ctx, next) => { - const { - associatedName, - resourceField, - resourceName, - actionName - } = ctx.action.params; - - let result: PermissionParams = false; - - // 关系数据的权限 - if (associatedName && resourceField) { - if (resourceField.options.id && resourceField.options.interface === 'subTable') { - if (await ctx.ac.isRoot()) { - return next(); - } - const permissions = await ctx.ac.getPermissions(); - const FieldPermission = ctx.db.getModel('fields_permissions'); - const fps = await FieldPermission.findAll({ - where: { - field_id: resourceField.options.id, - permission_id: { - [Op.in]: permissions.map(p => p.id), - } - }, - }); - if (fps.length) { - for (const fp of fps) { - if (Array.isArray(fp.actions) && fp.actions.includes(`${resourceField.options.collection_name}:${actionName}`)) { - return next(); - } - } - return this.reject(ctx); - } - } - result = await ctx.ac.can(resourceField.options.target).act(actionName).any(); - } else { - result = await ctx.ac.can(resourceName).act(actionName).any(); - } - - if (!result) { - return this.reject(ctx); - } - - if (result === true) { - return next(); - } - - ctx.action.mergeParams({ - filter: result.filter, - // TODO: 在 fields 改进之前,先注释掉 - // fields: result.fields.map(item => item.get('field').get('name')) - }); - - return next(); - }; - - reject(ctx) { - ctx.throw(404); - } -} - -export default async function (options = {}) { - const instance = new Permissions(this, options); - - return instance; -} +} as PluginOptions; diff --git a/packages/plugin-system-settings/.npmignore b/packages/plugin-system-settings/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/plugin-system-settings/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/plugin-system-settings/package.json b/packages/plugin-system-settings/package.json new file mode 100644 index 0000000000000000000000000000000000000000..8db60c615827cee8379d56448a8a9c674b81b984 --- /dev/null +++ b/packages/plugin-system-settings/package.json @@ -0,0 +1,13 @@ +{ + "name": "@nocobase/plugin-system-settings", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25" + }, + "devDependencies": { + "@nocobase/test": "^0.5.0-alpha.25" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/plugin-system-settings/src/collections/system_settings.ts b/packages/plugin-system-settings/src/collections/system_settings.ts new file mode 100644 index 0000000000000000000000000000000000000000..9daa84cd1742dbad850cbf62f7290eacb2d2bb82 --- /dev/null +++ b/packages/plugin-system-settings/src/collections/system_settings.ts @@ -0,0 +1,20 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'system_settings', + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'boolean', + name: 'showLogoOnly', + }, + { + type: 'belongsTo', + name: 'logo', + target: 'attachments', + }, + ], +} as TableOptions; diff --git a/packages/plugin-system-settings/src/server.ts b/packages/plugin-system-settings/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..41acbba25d2c6f3bdd54ad39e6d188229878d0c2 --- /dev/null +++ b/packages/plugin-system-settings/src/server.ts @@ -0,0 +1,45 @@ +import path from 'path'; +import { PluginOptions } from '@nocobase/server'; + +export default { + name: 'system-settings', + async load() { + const database = this.app.db; + const resourcer = this.app.resourcer; + + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + const SystemSetting = database.getModel('system_settings'); + + resourcer.use(async (ctx, next) => { + const { actionName, resourceName, resourceKey } = ctx.action.params; + if (resourceName === 'system_settings' && actionName === 'get') { + let model = await SystemSetting.findOne(); + if (!model) { + model = await SystemSetting.create(); + } + ctx.action.mergeParams({ + resourceKey: model.id, + }); + } + await next(); + }); + + this.app.on('db.init', async () => { + const setting = await SystemSetting.create({ + title: 'NocoBase', + }); + await setting.updateAssociations({ + logo: { + title: 'nocobase-logo', + filename: '682e5ad037dd02a0fe4800a3e91c283b.png', + extname: '.png', + mimetype: 'image/png', + url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/682e5ad037dd02a0fe4800a3e91c283b.png', + }, + }); + }); + } +} as PluginOptions; diff --git a/packages/plugin-ui-router/.npmignore b/packages/plugin-ui-router/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/plugin-ui-router/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/plugin-ui-router/package.json b/packages/plugin-ui-router/package.json new file mode 100644 index 0000000000000000000000000000000000000000..522770ceb7fa9f390a87d9032a0583501186a717 --- /dev/null +++ b/packages/plugin-ui-router/package.json @@ -0,0 +1,15 @@ +{ + "name": "@nocobase/plugin-ui-router", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "deepmerge": "^4.2.2", + "flat-to-nested": "^1.1.1" + }, + "devDependencies": { + "@nocobase/test": "^0.5.0-alpha.25" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/plugin-full-collections/src/__tests__/index.ts b/packages/plugin-ui-router/src/__tests__/index.ts similarity index 91% rename from packages/plugin-full-collections/src/__tests__/index.ts rename to packages/plugin-ui-router/src/__tests__/index.ts index a642a2e5a35bfbfb86325bebd017869210d07247..d4439acdcb931c4b2b78cda6fd18c2cf7a6ac752 100644 --- a/packages/plugin-full-collections/src/__tests__/index.ts +++ b/packages/plugin-ui-router/src/__tests__/index.ts @@ -57,24 +57,24 @@ export async function getApp() { }); app.resourcer.use(middlewares.associated); app.resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); - app.registerPlugin('full-collections', [plugin]); + app.registerPlugin('collections', [plugin]); await app.loadPlugins(); - await app.database.sync(); + await app.db.sync(); // 表配置信息存到数据库里 - // const tables = app.database.getTables([]); + // const tables = app.db.getTables([]); // for (const table of tables) { - // const Collection = app.database.getModel('collections'); - // await Collection.import(table.getOptions(), { migrate: false }); + // const Collection = app.db.getModel('collections'); + // await Collection.import(table.getOptions(), { hooks: false }); // } app.use(async (ctx, next) => { - ctx.db = app.database; + ctx.db = app.db; await next(); }); app.use(bodyParser()); app.use(middleware({ prefix: '/api', resourcer: app.resourcer, - database: app.database, + database: app.db, })); return app; } diff --git a/packages/plugin-ui-router/src/__tests__/routes.test.ts b/packages/plugin-ui-router/src/__tests__/routes.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..02803260651c0f677d94317b001ea6b91d3c9756 --- /dev/null +++ b/packages/plugin-ui-router/src/__tests__/routes.test.ts @@ -0,0 +1,82 @@ +import { Agent, getAgent, getApp } from '.'; +import { Application } from '@nocobase/server'; +import Database from '@nocobase/database'; + +describe('routes', () => { + let app: Application; + let agent: Agent; + let db: Database; + + beforeEach(async () => { + app = await getApp(); + db = app.db; + agent = getAgent(app); + }); + + afterEach(() => app.db.close()); + + // it.only('create route', async () => { + // const Route = db.getModel('routes'); + // const item = { + // path: '/admin/:name(.+)?', + // component: 'AdminLayout', + // title: `后台`, + // uiSchema: { + // name: 'menu', + // }, + // }; + // console.log(Route.associations); + // const route = await Route.create(item); + // await route.updateAssociations(item); + // }); + + it('create route', async () => { + const Route = db.getModel('routes'); + const data = [ + { + type: 'redirect', + from: '/', + to: '/admin', + exact: true, + }, + { + path: '/admin/:name(.+)?', + component: 'AdminLayout', + title: `后台`, + uiSchema: { + key: 'qqzzjakwkwl', + name: 'qqzzjakwkwl', + }, + }, + { + component: 'AuthLayout', + children: [ + { + name: 'login', + path: '/login', + component: 'DefaultPage', + title: `登录`, + uiSchema: { + key: 'dtf9j0b8p9u', + name: 'dtf9j0b8p9u', + }, + }, + { + name: 'register', + path: '/register', + component: 'DefaultPage', + title: `注册`, + uiSchema: { + key: '46qlxqam3xk', + name: '46qlxqam3xk', + }, + }, + ], + }, + ]; + for (const item of data) { + const route = await Route.create(item); + await route.updateAssociations(item); + } + }); +}); diff --git a/packages/plugin-ui-router/src/actions/getAccessible.ts b/packages/plugin-ui-router/src/actions/getAccessible.ts new file mode 100644 index 0000000000000000000000000000000000000000..3338baf14d05d1a0f67c07b5f500cd02ee916fe7 --- /dev/null +++ b/packages/plugin-ui-router/src/actions/getAccessible.ts @@ -0,0 +1,19 @@ +import { Model, ModelCtor } from '@nocobase/database'; +import { Context, Next } from '@nocobase/actions'; +import FlatToNested from 'flat-to-nested'; + +const flatToNested = new FlatToNested({ + id: 'key', + parent: 'parentKey', + children: 'routes', +}); + +export default async (ctx: Context, next: Next) => { + const Route = ctx.db.getModel('routes'); + const routes = await Route.findAll(Route.parseApiJson({ + sort: 'sort', + })); + const data = flatToNested.convert(routes.map(route => route.toProps())); + ctx.body = data.routes; + await next(); +} diff --git a/packages/plugin-ui-router/src/collections/routes.ts b/packages/plugin-ui-router/src/collections/routes.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ac2f8c35514f443a500550854e23fdff2cc0d35 --- /dev/null +++ b/packages/plugin-ui-router/src/collections/routes.ts @@ -0,0 +1,46 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'routes', + title: '路由表', + model: 'Route', + sortable: { + type: 'sort', + name: 'sort', + scope: ['parentKey'], + }, + fields: [ + // { + // type: 'sort', + // name: 'sort', + // scope: ['parentKey'], + // }, + { + type: 'uid', + name: 'key', + prefix: 'r_', + primaryKey: true, + }, + { + type: 'string', + name: 'type', + }, + { + type: 'hasMany', + name: 'children', + target: 'routes', + sourceKey: 'key', + foreignKey: 'parentKey', + }, + { + type: 'belongsTo', + name: 'uiSchema', + target: 'ui_schemas', + }, + { + type: 'json', + name: 'options', + defaultValue: {}, + }, + ], +} as TableOptions; diff --git a/packages/plugin-ui-router/src/models/index.ts b/packages/plugin-ui-router/src/models/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d99221922a0eb246231b70b99eb79f807a94f656 --- /dev/null +++ b/packages/plugin-ui-router/src/models/index.ts @@ -0,0 +1 @@ +export * from './route'; diff --git a/packages/plugin-ui-router/src/models/route.ts b/packages/plugin-ui-router/src/models/route.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd8d72102f9fa3e2a38e8b0075eb9d8f273dc966 --- /dev/null +++ b/packages/plugin-ui-router/src/models/route.ts @@ -0,0 +1,33 @@ +import _ from 'lodash'; +import { Model } from '@nocobase/database'; + +export class Route extends Model { + static async create(value?: any, options?: any): Promise { + // console.log({ value }); + const attributes = this.toAttributes(value); + // @ts-ignore + const model: Model = await super.create(attributes, options); + return model; + } + + static toAttributes(value = {}): any { + const data = _.cloneDeep(value); + const keys = [ + ...Object.keys(this.rawAttributes), + ...Object.keys(this.associations), + ]; + const attrs = _.pick(data, keys); + const options = _.omit(data, keys); + return { ...attrs, options }; + } + + toProps() { + const json = this.toJSON(); + const data: any = _.omit(json, ['options', 'created_at', 'updated_at', 'ui_schema_key']); + const options = json['options'] || {}; + if (json['ui_schema_key']) { + data.uiSchemaKey = json['ui_schema_key']; + } + return { ...data, ...options } + } +} diff --git a/packages/plugin-ui-router/src/server.ts b/packages/plugin-ui-router/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d6c3de259f2a12d57b0d2b3e8be14d7a0d8f912 --- /dev/null +++ b/packages/plugin-ui-router/src/server.ts @@ -0,0 +1,64 @@ +import path from 'path'; +import { PluginOptions } from '@nocobase/server'; +import { registerModels } from '@nocobase/database'; +import * as models from './models'; +import getAccessible from './actions/getAccessible'; +import * as uiSchema from './ui-schema'; + +export default { + name: 'ui-router', + async load() { + const database = this.app.db; + registerModels(models); + + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + this.app.resourcer.registerActionHandler('routes:getAccessible', getAccessible); + + const Route = database.getModel('routes'); + + this.app.on('db.init', async () => { + const data = [ + { + type: 'redirect', + from: '/', + to: '/admin', + exact: true, + }, + { + type: 'route', + path: '/admin/:name(.+)?', + component: 'AdminLayout', + title: `后台`, + uiSchema: uiSchema.menu, + }, + { + type: 'route', + component: 'AuthLayout', + children: [ + { + type: 'route', + path: '/login', + component: 'RouteSchemaRenderer', + title: `登录`, + uiSchema: uiSchema.login, + }, + { + type: 'route', + path: '/register', + component: 'RouteSchemaRenderer', + title: `注册`, + uiSchema: uiSchema.register, + }, + ], + }, + ]; + for (const item of data) { + const route = await Route.create(item); + await route.updateAssociations(item); + } + }); + } +} as PluginOptions; diff --git a/packages/plugin-ui-router/src/ui-schema/index.ts b/packages/plugin-ui-router/src/ui-schema/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6bef8bfe2de8046f71cbf0fbcc85ad08f12a5901 --- /dev/null +++ b/packages/plugin-ui-router/src/ui-schema/index.ts @@ -0,0 +1,3 @@ +export * from './login'; +export * from './menu'; +export * from './register'; diff --git a/packages/plugin-ui-router/src/ui-schema/login.ts b/packages/plugin-ui-router/src/ui-schema/login.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ccf1da4d5797b4fd602cfc2838dc9e406126571 --- /dev/null +++ b/packages/plugin-ui-router/src/ui-schema/login.ts @@ -0,0 +1,64 @@ +export const login = { + key: 'dtf9j0b8p9u', + type: 'object', + title: '登录', + properties: { + email: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-component-props': { + placeholder: '电子邮箱', + style: { + // width: 240, + }, + }, + }, + password: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + 'x-component-props': { + placeholder: '密码', + style: { + // width: 240, + }, + }, + }, + actions: { + type: 'void', + 'x-component': 'Div', + properties: { + submit: { + type: 'void', + 'x-component': 'Action', + 'x-component-props': { + block: true, + type: 'primary', + useAction: '{{ useLogin }}', + style: { + width: '100%', + }, + }, + title: '登录', + }, + }, + }, + registerlink: { + type: 'void', + 'x-component': 'Div', + properties: { + link: { + type: 'void', + 'x-component': 'Action.Link', + 'x-component-props': { + to: '/register', + }, + title: '注册账号', + }, + }, + }, + }, +}; diff --git a/packages/plugin-ui-router/src/ui-schema/menu.ts b/packages/plugin-ui-router/src/ui-schema/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a666063153b0e634aae4aa5e069bcc674b49013 --- /dev/null +++ b/packages/plugin-ui-router/src/ui-schema/menu.ts @@ -0,0 +1,15 @@ +export const menu = { + key: 'qqzzjakwkwl', + name: 'qqzzjakwkwl', + type: 'void', + 'x-component': 'Menu', + 'x-designable-bar': 'Menu.DesignableBar', + 'x-component-props': { + mode: 'mix', + theme: 'dark', + defaultSelectedKeys: '{{ selectedKeys }}', + sideMenuRef: '{{ sideMenuRef }}', + onSelect: '{{ onSelect }}', + onRemove: '{{ onMenuItemRemove }}', + }, +}; diff --git a/packages/plugin-ui-router/src/ui-schema/register.ts b/packages/plugin-ui-router/src/ui-schema/register.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c183a3769a3e218283d9632a8e23df2728ec169 --- /dev/null +++ b/packages/plugin-ui-router/src/ui-schema/register.ts @@ -0,0 +1,100 @@ +export const register = { + key: '46qlxqam3xk', + type: 'object', + title: '注册', + properties: { + email: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-component-props': { + placeholder: '电子邮箱', + style: { + // width: 240, + }, + }, + }, + password: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + 'x-component-props': { + placeholder: '密码', + checkStrength: true, + style: { + // width: 240, + }, + }, + 'x-reactions': [ + { + dependencies: ['.confirm_password'], + fulfill: { + state: { + errors: + '{{$deps[0] && $self.value && $self.value !== $deps[0] ? "确认密码不匹配" : ""}}', + }, + }, + }, + ], + }, + confirm_password: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Password', + 'x-component-props': { + placeholder: '确认密码', + checkStrength: true, + style: { + // width: 240, + }, + }, + 'x-reactions': [ + { + dependencies: ['.password'], + fulfill: { + state: { + errors: + '{{$deps[0] && $self.value && $self.value !== $deps[0] ? "确认密码不匹配" : ""}}', + }, + }, + }, + ], + }, + actions: { + type: 'void', + 'x-component': 'Div', + properties: { + submit: { + type: 'void', + title: '注册', + 'x-component': 'Action', + 'x-component-props': { + block: true, + type: 'primary', + useAction: '{{ useRegister }}', + style: { + width: '100%', + }, + }, + }, + }, + }, + registerlink: { + type: 'void', + 'x-component': 'Div', + properties: { + link: { + type: 'void', + 'x-component': 'Action.Link', + 'x-component-props': { + to: '/login', + }, + title: '使用已有账号登录', + }, + }, + }, + }, +} diff --git a/packages/plugin-ui-router/src/utils.ts b/packages/plugin-ui-router/src/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..e58cbe491834ef6ecc76c749a029fb7249b96a9b --- /dev/null +++ b/packages/plugin-ui-router/src/utils.ts @@ -0,0 +1,9 @@ +import deepmerge from 'deepmerge'; + +const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray + +export function merge(obj1: any, obj2: any) { + return deepmerge(obj1, obj2, { + arrayMerge: overwriteMerge, + }); +} diff --git a/packages/plugin-ui-schema/.npmignore b/packages/plugin-ui-schema/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/plugin-ui-schema/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/plugin-ui-schema/package.json b/packages/plugin-ui-schema/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ddf39bd33c2547e6972df27823120ba1bb5f626d --- /dev/null +++ b/packages/plugin-ui-schema/package.json @@ -0,0 +1,14 @@ +{ + "name": "@nocobase/plugin-ui-schema", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "license": "MIT", + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "deepmerge": "^4.2.2" + }, + "devDependencies": { + "@nocobase/test": "^0.5.0-alpha.25" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/plugin-ui-schema/src/__tests__/ui_schemas.test.ts b/packages/plugin-ui-schema/src/__tests__/ui_schemas.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b3b16c7c5105cd17ed4ad810990d2f80d4fbff4 --- /dev/null +++ b/packages/plugin-ui-schema/src/__tests__/ui_schemas.test.ts @@ -0,0 +1,17 @@ +import { mockServer, MockServer } from '@nocobase/test'; +import { registerActions } from '@nocobase/actions'; + +describe('ui_schemas', () => { + let api: MockServer; + beforeEach(async () => { + api = mockServer(); + }); + + afterEach(async () => { + await api.destroy(); + }); + + it('create ui_schemas', async () => { + expect(1).toBe(1); + }); +}); diff --git a/packages/plugin-ui-schema/src/actions/index.ts b/packages/plugin-ui-schema/src/actions/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..552849941edbab79cffa374bbcff11ebff472925 --- /dev/null +++ b/packages/plugin-ui-schema/src/actions/index.ts @@ -0,0 +1,143 @@ +import { actions, middlewares, Context, Next } from '@nocobase/actions'; +import { cloneDeep, omit } from 'lodash'; + +export const create = async (ctx: Context, next: Next) => { + const values = cloneDeep(ctx.action.params.values); + ctx.action.mergeParams( + { + values: cloneDeep( + omit(values, [ + '__insertAfter__', + '__insertBefore__', + '__prepend__', + '_isJSONSchemaObject', + ]), + ), + }, + { + payload: 'replace', + }, + ); + await actions.create(ctx, async () => {}); + const sticky = values['__prepend__']; + const targetKey = values['__insertAfter__'] || values['__insertBefore__']; + if (sticky || targetKey) { + const body = ctx.body; + ctx.action.mergeParams( + { + associatedKey: values.parentKey, + resourceKey: body.key, + ...(sticky + ? { + sticky: true, + } + : { + method: values['__insertAfter__'] ? 'insertAfter' : null, + targetId: targetKey, + }), + }, + { + payload: 'replace', + }, + ); + await middlewares.associated(ctx, async () => {}); + await actions.sort(ctx, async () => {}); + } + await next(); +}; + +export const update = async (ctx: Context, next: Next) => { + const values = cloneDeep(ctx.action.params.values); + ctx.action.mergeParams( + { + values: cloneDeep( + omit(values, [ + '__insertAfter__', + '__insertBefore__', + '__prepend__', + '_isJSONSchemaObject', + ]), + ), + }, + { + payload: 'replace', + }, + ); + await actions.update(ctx, async () => {}); + const sticky = values['__prepend__']; + const targetKey = values['__insertAfter__'] || values['__insertBefore__']; + if (sticky || targetKey) { + const body = ctx.body; + ctx.action.mergeParams( + { + associatedKey: values.parentKey, + resourceKey: body.key, + ...(sticky + ? { + sticky: true, + } + : { + method: values['__insertAfter__'] ? 'insertAfter' : null, + // insertAfter: !!values['__insertAfter__'], + targetId: targetKey, + }), + }, + { + payload: 'replace', + }, + ); + // console.log(ctx.action.params.values); + await middlewares.associated(ctx, async () => {}); + await actions.sort(ctx, async () => {}); + // console.log(ctx.body.toJSON()); + } + await next(); +}; + +export const getTree = async (ctx: Context, next: Next) => { + const { resourceKey, filter } = ctx.action.params; + const UISchema = ctx.db.getModel('ui_schemas'); + if (resourceKey) { + const schema = await UISchema.findByPk(resourceKey); + const property = schema.toProperty(); + const properties = await schema.getProperties(); + if (Object.keys(properties).length) { + property.properties = properties; + } + ctx.body = property; + } else { + const schemas = await UISchema.findAll( + UISchema.parseApiJson({ + filter, + sort: ['sort'], + }), + ); + // console.log({ schemas }); + let properties = {}; + for (const schema of schemas) { + const property = schema.toProperty(); + const childProperties = await schema.getProperties(); + if (Object.keys(childProperties).length) { + property.properties = childProperties; + } + properties[property.name] = property; + } + ctx.body = { + type: 'object', + properties, + }; + } + + await next(); +}; + +export const getMenuItems = async (ctx: Context, next: Next) => { + const UISchema = ctx.db.getModel('ui_schemas'); + const schema = await UISchema.findOne({ + where: { + 'x-component': 'Menu', + }, + }); + ctx.body = await schema.getHierarchy(); + await next(); +}; diff --git a/packages/plugin-ui-schema/src/collections/ui_schemas.ts b/packages/plugin-ui-schema/src/collections/ui_schemas.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f56c7ce64d9789e847cc8999c6ee11d29467117 --- /dev/null +++ b/packages/plugin-ui-schema/src/collections/ui_schemas.ts @@ -0,0 +1,63 @@ +import { TableOptions } from '@nocobase/database'; + +export default { + name: 'ui_schemas', + title: '字段配置', + model: 'UISchema', + sortable: { + type: 'sort', + name: 'sort', + scope: ['parentKey'], + }, + fields: [ + { + type: 'uid', + name: 'key', + primaryKey: true, + }, + // { + // type: 'sort', + // name: 'sort', + // scope: ['parentKey'], + // }, + { + type: 'string', + name: 'name', + }, + { + type: 'string', + name: 'title', + }, + { + type: 'string', + name: 'type', + }, + { + type: 'string', + name: 'x-component', + }, + { + type: 'json', + name: 'options', + defaultValue: {}, + }, + { + type: 'boolean', + name: 'async', + defaultValue: false, + }, + { + type: 'hasMany', + name: 'children', + target: 'ui_schemas', + sourceKey: 'key', + foreignKey: 'parentKey', + }, + { + type: 'belongsToMany', + name: 'roles', + target: 'roles', + through: 'roles_ui_schemas' + }, + ], +} as TableOptions; diff --git a/packages/plugin-ui-schema/src/models/index.ts b/packages/plugin-ui-schema/src/models/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..349209b7c6585648750536ad6fffb518acb27c76 --- /dev/null +++ b/packages/plugin-ui-schema/src/models/index.ts @@ -0,0 +1 @@ +export * from './ui-schema'; diff --git a/packages/plugin-ui-schema/src/models/ui-schema.ts b/packages/plugin-ui-schema/src/models/ui-schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..b0bdb5bc5c5425a287a5972c954be955743341f7 --- /dev/null +++ b/packages/plugin-ui-schema/src/models/ui-schema.ts @@ -0,0 +1,108 @@ +import _ from 'lodash'; +import { Model } from '@nocobase/database'; +import { merge } from '../utils'; + +export class UISchema extends Model { + static async create(value?: any, options?: any): Promise { + // console.log({ value }); + const attributes = this.toAttributes(_.cloneDeep(value)); + // console.log({ attributes }) + // @ts-ignore + const model: Model = await super.create(attributes, options); + if (!attributes.children) { + attributes.children = this.properties2children(attributes.properties); + await model.updateAssociation('children', attributes.children, options); + } + return model; + } + + async update(key?: any, value?: any, options?: any): Promise { + const opts = this.get('options') || {}; + if (typeof key === 'object') { + const attributes = UISchema.toAttributes(key, opts); + return super.update(attributes, value, options); + } + return super.update(key, value, options); + } + + static toAttributes(value = {}, opts = {}): any { + const data = _.cloneDeep(value); + const keys = [ + 'properties', + ...Object.keys(this.rawAttributes||{}), + ...Object.keys(this.associations||{}), + ]; + const attrs = _.pick(data, keys); + const options = _.omit(data, keys); + return { + ...attrs, options: merge(opts, options) + }; + } + + static properties2children(properties = []) { + const children = []; + for (const [name, property] of Object.entries(properties)) { + if (property.properties) { + property.children = this.properties2children(property.properties); + } + children.push({ + name, + ...property, + }); + } + return children; + } + + toProperty() { + const options = this.get('options') || {}; + const data = _.omit(this.toJSON(), ['created_at', 'updated_at', 'options']); + return { ...data, ...options }; + } + + async toJSONSchema() { + const schema = this.toProperty(); + const properties = await this.getProperties(); + if (Object.keys(properties).length) { + schema['properties'] = properties; + } + return schema; + } + + async getProperties() { + const properties = {}; + const children: UISchema[] = await this.getChildren({ + where: { + async: false, + }, + order: [['sort', 'asc']], + }); + for (const child of children) { + const property = child.toProperty(); + const childProperties = await child.getProperties(); + if (Object.keys(childProperties).length) { + property['properties'] = childProperties; + } + properties[child.name] = property; + } + return properties; + } + + async getHierarchy() { + const data = []; + const children: UISchema[] = await this.getChildren({ + where: { + async: false, + }, + order: [['sort', 'asc']], + }); + for (const child of children) { + const item: any = child.toJSON(); + const nested = await child.getHierarchy(); + if (nested.length) { + item.children = nested; + } + data.push(item); + } + return data; + } +} diff --git a/packages/plugin-ui-schema/src/server.ts b/packages/plugin-ui-schema/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..eaa0a749cddcd1da32bee3dea68233e1edc0e433 --- /dev/null +++ b/packages/plugin-ui-schema/src/server.ts @@ -0,0 +1,22 @@ +import path from 'path'; +import { PluginOptions } from '@nocobase/server'; +import { registerModels } from '@nocobase/database'; +import * as models from './models'; +import * as actions from './actions'; + +registerModels(models); + +export default { + name: 'ui-schema', + async load() { + const database = this.app.db; + + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + for (const [name, action] of Object.entries(actions)) { + this.app.resourcer.registerActionHandler(`ui_schemas:${name}`, action); + } + } +} as PluginOptions; diff --git a/packages/plugin-ui-schema/src/utils.ts b/packages/plugin-ui-schema/src/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..e58cbe491834ef6ecc76c749a029fb7249b96a9b --- /dev/null +++ b/packages/plugin-ui-schema/src/utils.ts @@ -0,0 +1,9 @@ +import deepmerge from 'deepmerge'; + +const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray + +export function merge(obj1: any, obj2: any) { + return deepmerge(obj1, obj2, { + arrayMerge: overwriteMerge, + }); +} diff --git a/packages/plugin-users/package.json b/packages/plugin-users/package.json index fac72fab78947c680b04118f246ec352d1b443f5..fd937fd9acdce7e42b3e15e1820ff853c9110194 100644 --- a/packages/plugin-users/package.json +++ b/packages/plugin-users/package.json @@ -1,16 +1,14 @@ { "name": "@nocobase/plugin-users", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "license": "MIT", - "devDependencies": { - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/server": "^0.4.0-alpha.7" - }, "dependencies": { - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", + "@nocobase/server": "^0.5.0-alpha.25", "crypto-random-string": "^3.3.0" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "devDependencies": { + "@nocobase/test": "^0.5.0-alpha.25" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/plugin-users/src/__tests__/fields.test.ts b/packages/plugin-users/src/__tests__/fields.test.ts index 195e2fc276fa9b8272e15eb3d8b55bfd10014e9d..4a22a32d042fc34586b39dccca57951ade1877c1 100644 --- a/packages/plugin-users/src/__tests__/fields.test.ts +++ b/packages/plugin-users/src/__tests__/fields.test.ts @@ -1,134 +1,124 @@ -import { getApp, getAgent } from '.'; +// @ts-nocheck +import Database from '@nocobase/database'; +import { mockServer, MockServer } from '@nocobase/test'; describe('user fields', () => { - let app; - let agent; - let db; + let api: MockServer; + let db: Database; beforeEach(async () => { - app = await getApp(); - agent = getAgent(app); - db = app.database; + api = mockServer(); + api.plugin(require('../server').default); + await api.load(); + db = api.db; }); afterEach(async () => { - await db.sync(); await db.close(); }); describe('model definition', () => { - it('add model without createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts', internal: true }); + it('createdBy=false/updatedBy=false', async () => { + db.table({ + name: 'posts', + createdBy: false, + updatedBy: false, + }); + await db.sync(); const Post = db.getModel('posts'); - const post = await Post.create(); expect(post.created_by_id).toBeUndefined(); expect(post.updated_by_id).toBeUndefined(); }); - it('add model without createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts' }); + it('without createdBy/updatedBy', async () => { + db.table({ + name: 'posts', + }); + await db.sync(); const Post = db.getModel('posts'); - const post = await Post.create(); expect(post.created_by_id).toBeDefined(); expect(post.updated_by_id).toBeDefined(); }); - it('add model with named createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts', createdBy: 'author', updatedBy: 'editor' }); - const Post = db.getModel('posts'); - - const post = await Post.create(); - expect(post.author_id).toBeDefined(); - expect(post.editor_id).toBeDefined(); - }); - - it('add model with named createdBy/updatedBy field and target', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ + it('updatedBy=author/updatedBy=editor', async () => { + db.table({ name: 'posts', - createdBy: { name: 'author', target: 'users' }, - updatedBy: { name: 'editor', target: 'users' } + createdBy: 'author', + updatedBy: 'editor', }); + await db.sync(); const Post = db.getModel('posts'); - const post = await Post.create(); expect(post.author_id).toBeDefined(); expect(post.editor_id).toBeDefined(); }); - it('add model with boolean createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts', createdBy: true, updatedBy: true }); + it('createdBy=true/updatedBy=true', async () => { + db.table({ + name: 'posts', + createdBy: true, + updatedBy: true, + }); + await db.sync(); const Post = db.getModel('posts'); - const post = await Post.create(); expect(post.created_by_id).toBeDefined(); expect(post.updated_by_id).toBeDefined(); }); - // TODO(bug): 重复添加字段不能与 fields 表同步,应做到同步 it('add model and then add createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - const collection = await Collection.import({ + db.table({ name: 'posts', - createdBy: true, - updatedBy: true, fields: [ { - interface: 'createdBy', - title: '创建人1', type: 'createdBy', name: 'createdBy1', target: 'users', foreignKey: 'created_by_id', }, { - interface: 'updatedBy', - title: '更新人1', type: 'updatedBy', name: 'updatedBy1', target: 'users', foreignKey: 'updated_by_id', }, { - interface: 'createdBy', - title: '创建人2', type: 'createdBy', name: 'createdBy2', target: 'users', foreignKey: 'created_by_id', }, { - interface: 'updatedBy', - title: '更新人2', type: 'updatedBy', name: 'updatedBy2', target: 'users', foreignKey: 'updated_by_id', }, - ] + ], }); - const table = db.getTable('posts'); - // console.log(table.getFields()); + + await db.sync(); const User = db.getModel('users'); const Post = db.getModel('posts'); // 用户1 操作 const user1 = await User.create(); - const postWithUser = await Post.create({}, { context: { state: { currentUser: user1 } } }); - - const post = await Post.findOne(Post.parseApiJson({ - filter: { - id: postWithUser.id, - }, - fields: ['createdBy1', 'updatedBy1', 'createdBy2', 'updatedBy2'], - })); + const postWithUser = await Post.create( + {}, + { context: { state: { currentUser: user1 } } }, + ); + + const post = await Post.findOne( + Post.parseApiJson({ + filter: { + id: postWithUser.id, + }, + fields: ['createdBy1', 'updatedBy1', 'createdBy2', 'updatedBy2'], + }), + ); expect(post.createdBy1.id).toBe(user1.id); expect(post.updatedBy1.id).toBe(user1.id); @@ -137,54 +127,31 @@ describe('user fields', () => { // 换个用户 const user2 = await User.create(); - await postWithUser.update({ title: 'title1' }, { context: { state: { currentUser: user2 } } }); + await postWithUser.update( + { title: 'title1' }, + { context: { state: { currentUser: user2 } } }, + ); - const post2 = await Post.findOne(Post.parseApiJson({ - filter: { - id: postWithUser.id, - }, - fields: ['createdBy1', 'updatedBy1', 'createdBy2', 'updatedBy2'], - })); + const post2 = await Post.findOne( + Post.parseApiJson({ + filter: { + id: postWithUser.id, + }, + fields: ['createdBy1', 'updatedBy1', 'createdBy2', 'updatedBy2'], + }), + ); expect(post2.createdBy1.id).toBe(user1.id); expect(post2.createdBy2.id).toBe(user1.id); expect(post2.updatedBy1.id).toBe(user2.id); expect(post2.updatedBy2.id).toBe(user2.id); - - - // const Collection = db.getModel('collections'); - // const collection = await Collection.create({ - // name: 'posts' - // }); - // const createdByField = await collection.createField({ type: 'createdBy', name: 'author', target: 'users' }); - // const updatedByField = await collection.createField({ type: 'updatedBy', name: 'editor', target: 'users' }); - - // const postTable = db.getTable('posts'); - // const Post = db.getModel('posts'); - - // // create data should contain added fields - // const post = await Post.create(); - // expect(post[postTable.getField(createdByField.get('name')).options.foreignKey]).toBeDefined(); - // expect(post[postTable.getField(updatedByField.get('name')).options.foreignKey]).toBeDefined(); - - // // add same type field twice should get same field - // const createdByField2 = await collection.createField({ type: 'createdBy', target: 'users' }); - // expect(createdByField2.get('name')).toBe(createdByField.get('name')); - - // // add same type field twice with a new name should get same field name as before - // const updatedByField2 = await collection.createField({ type: 'updatedBy', name: 'proofreader', target: 'users' }); - // expect(updatedByField2.get('name')).toBe(updatedByField.get('name')); - - // // delete field data should not really remove the column in table - // await createdByField2.destroy(); - // expect(postTable.getField('author')).toBeDefined(); }); }); describe('createdBy field', () => { it('create data with createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts', createdBy: true, updatedBy: true }); + db.table({ name: 'posts', createdBy: true, updatedBy: true }); + await db.sync(); const User = db.getModel('users'); const currentUser = await User.create(); const user2 = await User.create(); @@ -193,29 +160,40 @@ describe('user fields', () => { const postWithoutUser = await Post.create(); expect(postWithoutUser.created_by_id).toBe(null); expect(postWithoutUser.updated_by_id).toBe(null); - - const postWithUser = await Post.create({}, { context: { state: { currentUser } } }); + // @ts-ignore + const postWithUser = await Post.create( + {}, + { context: { state: { currentUser } } }, + ); expect(postWithUser.created_by_id).toBe(currentUser.id); expect(postWithUser.updated_by_id).toBe(currentUser.id); // 更新数据 createdBy 数据不变 - await postWithUser.update({ title: 'title1' }, { context: { state: { currentUser: user2 } } }); + // @ts-ignore + await postWithUser.update( + { title: 'title1' }, + { context: { state: { currentUser: user2 } } }, + ); expect(postWithUser.created_by_id).toBe(currentUser.id); expect(postWithUser.updated_by_id).toBe(user2.id); }); it('create data with value of createdBy/updatedBy field', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ name: 'posts', createdBy: true, updatedBy: true }); + db.table({ name: 'posts', createdBy: true, updatedBy: true }); + await db.sync(); const User = db.getModel('users'); const user1 = await User.create(); const user2 = await User.create(); const Post = db.getModel('posts'); - const post = await Post.create({ - created_by_id: user1.id, - updated_by_id: user1.id, - }, { context: { state: { currentUser: user2 } } }); + const post = await Post.create( + { + created_by_id: user1.id, + updated_by_id: user1.id, + // @ts-ignore + }, + { context: { state: { currentUser: user2 } } }, + ); expect(post.created_by_id).toBe(user1.id); expect(post.updated_by_id).toBe(user1.id); }); @@ -223,55 +201,65 @@ describe('user fields', () => { describe('updatedBy field', () => { it('update data ', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ + db.table({ name: 'posts', + createdBy: false, updatedBy: true, fields: [ { type: 'string', - name: 'title' - } - ] + name: 'title', + }, + ], }); + await db.sync(); const User = db.getModel('users'); const currentUser = await User.create(); const Post = db.getModel('posts'); const post = await Post.create(); expect(post.updated_by_id).toBe(null); - - await post.update({ title: 'title' }, { context: { state: { currentUser } } }) + // @ts-ignore + await post.update( + { title: 'title' }, + { context: { state: { currentUser } } }, + ); expect(post.updated_by_id).toBe(currentUser.id); }); it('update data by different user', async () => { - const Collection = db.getModel('collections'); - await Collection.create({ + db.table({ name: 'posts', updatedBy: true, fields: [ { type: 'string', - name: 'title' - } - ] + name: 'title', + }, + ], }); + await db.sync(); const User = db.getModel('users'); const user1 = await User.create(); const user2 = await User.create(); const Post = db.getModel('posts'); let context = { state: { currentUser: user2 } }; - const post = await Post.create({ - updated_by_id: user1.id, - }, { context }); + const post = await Post.create( + { + updated_by_id: user1.id, + }, + { context }, + ); expect(post.updated_by_id).toBe(user1.id); await post.update({ title: 'title' }, { context }); expect(post.updated_by_id).toBe(user2.id); - await post.update({ title: 'title', updated_by_id: user1.id }, { context }); + await post.update( + { title: 'title', updated_by_id: user1.id }, + { context }, + ); expect(post.updated_by_id).toBe(user1.id); // 不同用户更新数据 @@ -285,34 +273,38 @@ describe('user fields', () => { }); it('bulkUpdate', async () => { - const Collection = db.getModel('collections'); - const postCollection = await Collection.create({ name: 'posts', createdBy: false, updatedBy: true }); - await postCollection.updateAssociations({ + db.table({ + name: 'posts', + createdBy: false, + updatedBy: true, fields: [ { type: 'string', - name: 'title' - } - ] + name: 'title', + }, + ], }); + await db.sync(); const User = db.getModel('users'); const user1 = await User.create(); const user2 = await User.create(); const Post = db.getModel('posts'); let context = { state: { currentUser: user2 } }; - await Post.bulkCreate([ - { title: 'title1' }, - { title: 'title2' }, - ]); + await Post.bulkCreate([{ title: 'title1' }, { title: 'title2' }]); - await Post.update({ title: 'title3' }, { - where: { title: 'title1' }, - context - }); + await Post.update( + { title: 'title3' }, + { + where: { title: 'title1' }, + context, + }, + ); const posts = await Post.findAll({ order: [['id', 'ASC']] }); - expect(posts.map(({ title, updated_by_id }) => ({ title, updated_by_id }))).toEqual([ + expect( + posts.map(({ title, updated_by_id }) => ({ title, updated_by_id })), + ).toEqual([ { title: 'title3', updated_by_id: 2 }, { title: 'title2', updated_by_id: null }, ]); diff --git a/packages/plugin-users/src/__tests__/index.ts b/packages/plugin-users/src/__tests__/index.ts deleted file mode 100644 index 11a178d0ab76884f7f11517e585054730b3ee586..0000000000000000000000000000000000000000 --- a/packages/plugin-users/src/__tests__/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import path from 'path'; -import qs from 'qs'; -import supertest from 'supertest'; -import bodyParser from 'koa-bodyparser'; -import { Dialect } from 'sequelize'; -import Database from '@nocobase/database'; -import { actions, middlewares } from '@nocobase/actions'; -import { Application, middleware } from '../../../server/src'; -import plugin from '../server'; - -function getTestKey() { - const { id } = require.main; - const key = id - .replace(`${process.env.PWD}/packages`, '') - .replace(/src\/__tests__/g, '') - .replace('.test.ts', '') - .replace(/[^\w]/g, '_') - .replace(/_+/g, '_'); - return key -} - -const config = { - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: Number.parseInt(process.env.DB_PORT, 10), - dialect: process.env.DB_DIALECT as Dialect, - define: { - hooks: { - beforeCreate(model, options) { - - }, - }, - }, - logging: process.env.DB_LOG_SQL === 'on', - sync: { - force: true, - alter: { - drop: true, - }, - }, -}; - -export async function getApp() { - const app = new Application({ - database: { - ...config, - hooks: { - beforeDefine(columns, model) { - model.tableName = `${getTestKey()}_${model.tableName || model.name.plural}`; - } - }, - }, - resourcer: { - prefix: '/api', - }, - }); - app.resourcer.use(middlewares.associated); - app.resourcer.registerActionHandlers({ ...actions.associate, ...actions.common }); - app.registerPlugin('collections', [path.resolve(__dirname, '../../../plugin-collections')]); - app.registerPlugin('users', [plugin]); - await app.loadPlugins(); - await app.database.sync(); - app.use(async (ctx, next) => { - ctx.db = app.database; - await next(); - }); - app.use(bodyParser()); - app.use(middleware({ - resourcer: app.resourcer, - database: app.database, - })); - return app; -} - -interface ActionParams { - resourceKey?: string | number; - // resourceName?: string; - // associatedName?: string; - associatedKey?: string | number; - fields?: any; - filter?: any; - values?: any; - [key: string]: any; -} - -interface Handler { - get: (params?: ActionParams) => Promise; - list: (params?: ActionParams) => Promise; - create: (params?: ActionParams) => Promise; - update: (params?: ActionParams) => Promise; - destroy: (params?: ActionParams) => Promise; - [name: string]: (params?: ActionParams) => Promise; -} - -export interface Agent { - resource: (name: string) => Handler; -} - -export function getAgent(app: Application): Agent { - const agent = supertest.agent(app.callback()); - return { - resource(name: string): any { - return new Proxy({}, { - get(target, method, receiver) { - return (params: ActionParams = {}) => { - const { associatedKey, resourceKey, values = {}, ...restParams } = params; - let url = `/api/${name}`; - if (associatedKey) { - url = `/api/${name.split('.').join(`/${associatedKey}/`)}`; - } - url += `:${method as string}`; - if (resourceKey) { - url += `/${resourceKey}`; - } - if (['list', 'get'].indexOf(method as string) !== -1) { - return agent.get(`${url}?${qs.stringify(restParams)}`); - } else { - return agent.post(`${url}?${qs.stringify(restParams)}`).send(values); - } - } - } - }); - } - }; -} - -export function getDatabase() { - return new Database({ - ...config, - hooks: { - beforeDefine(columns, model) { - model.tableName = `${getTestKey()}_${model.tableName || model.name.plural}`; - } - } - }); -}; diff --git a/packages/plugin-users/src/actions/users.ts b/packages/plugin-users/src/actions/users.ts index 9665c76f7531bb170c42ddcfd0cb5fff406aeb90..3b1219f44a56135c562411fbf367bbe4116a9fb9 100644 --- a/packages/plugin-users/src/actions/users.ts +++ b/packages/plugin-users/src/actions/users.ts @@ -1,11 +1,10 @@ -import { actions } from '@nocobase/actions'; +import { Context, Next } from '@nocobase/actions'; import { PASSWORD } from '@nocobase/database'; import cryptoRandomString from 'crypto-random-string'; -export async function check(ctx: actions.Context, next: actions.Next) { +export async function check(ctx: Context, next: Next) { if (ctx.state.currentUser) { const user = ctx.state.currentUser.toJSON(); - delete user.password; ctx.body = user; await next(); } else { @@ -13,14 +12,14 @@ export async function check(ctx: actions.Context, next: actions.Next) { } } -export async function login(ctx: actions.Context, next: actions.Next) { +export async function login(ctx: Context, next: Next) { const { uniqueField = 'email', values } = ctx.action.params; - // console.log(values); + console.log('login.values', values); if (!values[uniqueField]) { ctx.throw(401, '请填写邮箱账号'); } const User = ctx.db.getModel('users'); - const user = await User.findOne({ + const user = await User.scope('withPassword').findOne({ where: { [uniqueField]: values[uniqueField], }, @@ -36,29 +35,25 @@ export async function login(ctx: actions.Context, next: actions.Next) { user.token = cryptoRandomString({ length: 20 }); await user.save(); } - ctx.body = { - data: user, - }; + ctx.body = user.toJSON(); + delete ctx.body.password; await next(); } -export async function logout(ctx: actions.Context, next: actions.Next) { +export async function logout(ctx: Context, next: Next) { ctx.body = {}; await next(); } -export async function register(ctx: actions.Context, next: actions.Next) { +export async function register(ctx: Context, next: Next) { const User = ctx.db.getModel('users'); const { values } = ctx.action.params; try { const user = await User.create(values); - ctx.body = { - data: user, - }; + ctx.body = user; } catch (error) { if (error.errors) { - console.log(error.errors.map(data => data.message)); - ctx.throw(401, error.errors.map(data => data.message).join(', ')); + ctx.throw(401, error.errors.map((data) => data.message).join(', ')); } else { ctx.throw(401, '注册失败'); } @@ -66,8 +61,10 @@ export async function register(ctx: actions.Context, next: actions.Next) { await next(); } -export async function lostpassword(ctx: actions.Context, next: actions.Next) { - const { values: { email } } = ctx.action.params; +export async function lostpassword(ctx: Context, next: Next) { + const { + values: { email }, + } = ctx.action.params; if (!email) { ctx.throw(401, '请填写邮箱账号'); } @@ -86,8 +83,10 @@ export async function lostpassword(ctx: actions.Context, next: actions.Next) { await next(); } -export async function resetpassword(ctx: actions.Context, next: actions.Next) { - const { values: { email, password, reset_token } } = ctx.action.params; +export async function resetpassword(ctx: Context, next: Next) { + const { + values: { email, password, reset_token }, + } = ctx.action.params; const User = ctx.db.getModel('users'); const user = await User.findOne({ where: { @@ -106,7 +105,7 @@ export async function resetpassword(ctx: actions.Context, next: actions.Next) { await next(); } -export async function getUserByResetToken(ctx: actions.Context, next: actions.Next) { +export async function getUserByResetToken(ctx: Context, next: Next) { const { token } = ctx.action.params; const User = ctx.db.getModel('users'); const user = await User.findOne({ @@ -120,3 +119,13 @@ export async function getUserByResetToken(ctx: actions.Context, next: actions.Ne ctx.body = user; await next(); } + +export async function updateProfile(ctx: Context, next: Next) { + const { values } = ctx.action.params; + if (!ctx.state.currentUser) { + ctx.throw(401, 'Unauthorized'); + } + await ctx.state.currentUser.update(values); + ctx.body = ctx.state.currentUser; + await next(); +} diff --git a/packages/plugin-users/src/collections/users.ts b/packages/plugin-users/src/collections/users.ts index 03419fe36b48cafa1b789bc235d8d4e815ffa350..452a6e0dd17ab4d697817b3767d357b36368ce90 100644 --- a/packages/plugin-users/src/collections/users.ts +++ b/packages/plugin-users/src/collections/users.ts @@ -3,169 +3,72 @@ import { TableOptions } from '@nocobase/database'; export default { name: 'users', title: '用户', + sortable: 'sort', // developerMode: true, // internal: true, createdBy: false, updatedBy: false, + privilege: 'undelete', + scopes: { + withPassword: { + attributes: { include: ['password'] }, + }, + }, + defaultScope: { + attributes: { exclude: ['password'] }, + }, fields: [ { interface: 'string', type: 'string', - name: 'username', - title: '用户名', - unique: true, - required: true, - createOnly: true, - component: { + name: 'nickname', + uiSchema: { type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, + title: '昵称', + 'x-component': 'Input', }, }, { interface: 'email', type: 'string', name: 'email', - title: '邮箱', unique: true, - required: true, - createOnly: true, - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'string', - type: 'string', - name: 'nickname', - title: '昵称', - required: true, - component: { + privilege: 'undelete', + uiSchema: { type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, - }, - }, - { - interface: 'phone', - type: 'string', - name: 'phone', - unique: true, - title: '手机号', - component: { - type: 'string', - showInTable: true, - showInDetail: true, - showInForm: true, + title: '邮箱', + 'x-component': 'Input', + require: true, }, }, { interface: 'password', type: 'password', name: 'password', - title: '密码', - hidden: true, - component: { - type: 'password', - showInForm: true, + privilege: 'undelete', + uiSchema: { + type: 'string', + title: '密码', + 'x-component': 'Password', }, }, { - interface: 'string', + interface: 'password', type: 'string', name: 'token', - title: 'Token', unique: true, hidden: true, - filterable: false, - developerMode: true, + privilege: 'undelete', + state: 0, }, { - interface: 'string', + interface: 'password', type: 'string', name: 'reset_token', - title: 'Reset Token', unique: true, hidden: true, - filterable: false, - developerMode: true, - }, - ], - actions: [ - { - type: 'list', - name: 'list', - title: '查看', - }, - { - type: 'destroy', - name: 'destroy', - title: '删除', - }, - { - type: 'create', - name: 'create', - title: '新增', - viewName: 'form', - }, - { - type: 'update', - name: 'update', - title: '编辑', - viewName: 'form', - }, - ], - views_v2: [ - { - developerMode: true, - type: 'table', - name: 'table', - title: '全部数据', - labelField: 'nickname', - actions: [ - { - name: 'create', - type: 'create', - title: '新增', - viewName: 'form', - }, - { - name: 'destroy', - type: 'destroy', - title: '删除', - }, - ], - fields: ['email', 'nickname', 'phone', 'roles'], - detailsOpenMode: 'drawer', // window - details: ['form'], - sort: ['id'], - }, - { - developerMode: true, - type: 'descriptions', - name: 'descriptions', - title: '详情', - fields: ['email', 'nickname', 'phone', 'roles'], - actions: [ - { - name: 'update', - type: 'update', - title: '编辑', - viewName: 'form', - }, - ], - }, - { - developerMode: true, - type: 'form', - name: 'form', - title: '表单', - fields: ['email', 'nickname', 'phone', 'password', 'roles'], + privilege: 'undelete', + state: 0, }, ], } as TableOptions; diff --git a/packages/plugin-users/src/fields/CreatedBy.ts b/packages/plugin-users/src/fields/CreatedBy.ts index f2cf93bceee001f37a499fee75e6f1c303b91b14..571c28b2e4ee53af89b53c87f5457912d7098f21 100644 --- a/packages/plugin-users/src/fields/CreatedBy.ts +++ b/packages/plugin-users/src/fields/CreatedBy.ts @@ -2,23 +2,29 @@ import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database'; import { setUserValue } from './utils'; export interface CreatedByOptions extends Omit { - type: 'createdBy' | 'createdby' + type: 'createdBy' | 'createdby'; } export default class CreatedBy extends BELONGSTO { - static beforeBulkCreateHook(this: CreatedBy, models, { context }) { - models.forEach(model => { + models.forEach((model) => { setUserValue.call(this, model, { context }); }); } constructor({ type, ...options }: CreatedByOptions, context: FieldContext) { super({ ...options, type: 'belongsTo' } as BelongsToOptions, context); - const Model = context.sourceTable.getModel(); + // const Model = context.sourceTable.getModel(); // TODO(feature): 可考虑策略模式,以在需要时对外提供接口 - Model.addHook('beforeCreate', setUserValue.bind(this)); - Model.addHook('beforeBulkCreate', CreatedBy.beforeBulkCreateHook.bind(this)); + // Model.addHook('beforeCreate', setUserValue.bind(this)); + // Model.addHook('beforeBulkCreate', CreatedBy.beforeBulkCreateHook.bind(this)); + const { sourceTable, database } = context; + const name = sourceTable.getName(); + database.on(`${name}.beforeCreate`, setUserValue.bind(this)); + database.on( + `${name}.beforeBulkCreate`, + CreatedBy.beforeBulkCreateHook.bind(this), + ); } public getDataType(): Function { diff --git a/packages/plugin-users/src/fields/UpdatedBy.ts b/packages/plugin-users/src/fields/UpdatedBy.ts index 62e38c76f43c0bc8c221ce45df6b1e8e7f4f047c..e09d62ed066bf92898066687fb3cb7d804fbc201 100644 --- a/packages/plugin-users/src/fields/UpdatedBy.ts +++ b/packages/plugin-users/src/fields/UpdatedBy.ts @@ -2,18 +2,20 @@ import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database'; import { setUserValue } from './utils'; export interface UpdatedByOptions extends Omit { - type: 'updatedBy' | 'updatedby' + type: 'updatedBy' | 'updatedby'; } export default class UpdatedBy extends BELONGSTO { - static beforeBulkCreateHook(this: UpdatedBy, models, { context }) { - models.forEach(model => { + models.forEach((model) => { setUserValue.call(this, model, { context }); }); } - static beforeBulkUpdateHook(this: UpdatedBy, { attributes, fields, context }) { + static beforeBulkUpdateHook( + this: UpdatedBy, + { attributes, fields, context }, + ) { if (!context) { return; } @@ -22,18 +24,31 @@ export default class UpdatedBy extends BELONGSTO { return; } fields.push(this.options.foreignKey); - attributes[this.options.foreignKey] = currentUser.get(this.options.targetKey); + attributes[this.options.foreignKey] = currentUser.get( + this.options.targetKey, + ); } constructor({ type, ...options }: UpdatedByOptions, context: FieldContext) { super({ ...options, type: 'belongsTo' } as BelongsToOptions, context); - const Model = context.sourceTable.getModel(); - // TODO(feature): 可考虑策略模式,以在需要时对外提供接口 - Model.addHook('beforeCreate', setUserValue.bind(this)); - Model.addHook('beforeBulkCreate', UpdatedBy.beforeBulkCreateHook.bind(this)); - - Model.addHook('beforeUpdate', setUserValue.bind(this)); - Model.addHook('beforeBulkUpdate', UpdatedBy.beforeBulkUpdateHook.bind(this)); + // const Model = context.sourceTable.getModel(); + // // TODO(feature): 可考虑策略模式,以在需要时对外提供接口 + // Model.addHook('beforeCreate', setUserValue.bind(this)); + // Model.addHook('beforeBulkCreate', UpdatedBy.beforeBulkCreateHook.bind(this)); + // Model.addHook('beforeUpdate', setUserValue.bind(this)); + // Model.addHook('beforeBulkUpdate', UpdatedBy.beforeBulkUpdateHook.bind(this)); + const { sourceTable, database } = context; + const name = sourceTable.getName(); + database.on(`${name}.beforeCreate`, setUserValue.bind(this)); + database.on( + `${name}.beforeBulkCreate`, + UpdatedBy.beforeBulkCreateHook.bind(this), + ); + database.on(`${name}.beforeUpdate`, setUserValue.bind(this)); + database.on( + `${name}.beforeBulkUpdate`, + UpdatedBy.beforeBulkUpdateHook.bind(this), + ); } public getDataType(): Function { diff --git a/packages/plugin-users/src/fields/utils.ts b/packages/plugin-users/src/fields/utils.ts index 8d04c7cbc016ec24deb79aa364c60f971b911be4..d7271bdcd3228b99c56c3e9f1a276c9723f0739b 100644 --- a/packages/plugin-users/src/fields/utils.ts +++ b/packages/plugin-users/src/fields/utils.ts @@ -1,4 +1,4 @@ -import { CreatedBy, UpdatedBy } from "."; +import { CreatedBy, UpdatedBy } from '.'; export function setUserValue(this: CreatedBy | UpdatedBy, model, { context }) { const { foreignKey } = this.options; @@ -8,7 +8,7 @@ export function setUserValue(this: CreatedBy | UpdatedBy, model, { context }) { return; } const changed = model.changed(); - if (Array.isArray(changed) && changed.find(key => key === foreignKey)) { + if (Array.isArray(changed) && changed.find((key) => key === foreignKey)) { return; } } diff --git a/packages/plugin-users/src/hooks/collection-after-create.ts b/packages/plugin-users/src/hooks/collection-after-create.ts deleted file mode 100644 index 11f6e3a2d76e5a704d0b6c39effdddc3f204baba..0000000000000000000000000000000000000000 --- a/packages/plugin-users/src/hooks/collection-after-create.ts +++ /dev/null @@ -1,50 +0,0 @@ -export function makeOptions(type: string, options: any) { - if (!options) { - return; - } - let name = type; - let target = 'users'; - switch (typeof options) { - case 'string': - name = options; - break; - // 今后支持多账号体系时可以扩展配置 - case 'object': - name = options.name || name; - target = options.target || target; - break; - } - return { - type, - name, - target - }; -} - -export default async function (table) { - const { createdBy, updatedBy } = table.getOptions(); - const fieldsToMake = { createdBy, updatedBy }; - Object.keys(fieldsToMake) - .filter(type => Boolean(fieldsToMake[type])) - .map(type => table.addField(makeOptions(type, fieldsToMake[type]))); -} - -// export default async function(model, options) { -// const { database } = model; -// const tableName = model.get('name') as string; -// const table = database.getTable(tableName); -// const { createdBy, updatedBy } = table.getOptions(); -// const fieldsToMake = { createdBy, updatedBy }; -// const addedFields = Object.keys(fieldsToMake) -// .filter(type => Boolean(fieldsToMake[type])) -// .map(type => table.addField(makeOptions(type, fieldsToMake[type]))); - -// if (addedFields.length) { -// await table.sync({ -// force: false, -// alter: { -// drop: false, -// } -// }); -// } -// } diff --git a/packages/plugin-users/src/hooks/fields-before-create.ts b/packages/plugin-users/src/hooks/fields-before-create.ts deleted file mode 100644 index 9a82a9de20b1a93f21150869a04ade95e8bd7dc9..0000000000000000000000000000000000000000 --- a/packages/plugin-users/src/hooks/fields-before-create.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Model, getDataTypeKey, getField } from '@nocobase/database'; - -export default async function (model: Model, options) { - // const { database } = model; - // const { type, target, collection_name } = model.get(); - // const table = database.getTable(collection_name); - // const Type = getField(getDataTypeKey(type)); - // let Exist; - // for (const Field of table.getFields().values()) { - // if (Field instanceof Type && Field.options.target === target) { - // Exist = Field; - // break; - // } - // } - // if (Exist) { - // model.set('name', Exist.options.name); - // } -} diff --git a/packages/plugin-users/src/hooks/index.ts b/packages/plugin-users/src/hooks/index.ts deleted file mode 100644 index 273f30d704767b8f6b04a546872d37d2aa397d1e..0000000000000000000000000000000000000000 --- a/packages/plugin-users/src/hooks/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Database from '@nocobase/database'; -import collectionsAfterCreate from './collection-after-create'; -import fieldsBeforeCreate from './fields-before-create'; - -export default function () { - const database: Database = this.database; - // TODO(feature): 应该通过新的插件机制暴露接口,而不是直接访问其他插件的底层代码 - database.getModel('collections').addHook('afterCreate', collectionsAfterCreate); - - // 由于创建字段不是同时完成的,可能要在不同的 hook 里处理才行 - database.getModel('fields').addHook('beforeCreate', fieldsBeforeCreate); -} diff --git a/packages/plugin-users/src/server.ts b/packages/plugin-users/src/server.ts index 9030873f33d5b0803e33eef30516ccd561257947..2e209981a6a1780453025241bd88f9bf3fc7d8f5 100644 --- a/packages/plugin-users/src/server.ts +++ b/packages/plugin-users/src/server.ts @@ -1,44 +1,53 @@ import path from 'path'; - -import Database, { registerFields } from '@nocobase/database'; -import Resourcer from '@nocobase/resourcer'; - +import { registerFields, Table } from '@nocobase/database'; import * as fields from './fields'; -// import hooks from './hooks'; import * as usersActions from './actions/users'; -import { makeOptions } from './hooks/collection-after-create'; import * as middlewares from './middlewares'; - -export default async function (options = {}) { - const database: Database = this.database; - const resourcer: Resourcer = this.resourcer; - - registerFields(fields); - - database.addHook('afterTableInit', (table) => { - let { createdBy, updatedBy, internal } = table.getOptions(); - // 非内置表,默认创建 createdBy 和 updatedBy - if (!internal) { - if (typeof createdBy === 'undefined') { - createdBy = true; +import { PluginOptions } from '@nocobase/server'; + +export default { + name: 'users', + async load() { + const database = this.app.db; + const resourcer = this.app.resourcer; + + registerFields(fields); + + this.app.on('db.init', async () => { + const User = database.getModel('users'); + await User.create({ + nickname: '超级管理员', + email: process.env.ADMIN_EMAIL || 'admin@nocobase.com', + password: process.env.ADMIN_PASSWORD || 'admin', + }); + }); + + database.on('afterTableInit', (table: Table) => { + let { createdBy, updatedBy } = table.getOptions(); + if (createdBy !== false) { + table.addField({ + type: 'createdBy', + name: typeof createdBy === 'string' ? createdBy : 'createdBy', + target: 'users', + }); } - if (typeof updatedBy === 'undefined') { - updatedBy = true; + if (updatedBy !== false) { + table.addField({ + type: 'updatedBy', + name: typeof updatedBy === 'string' ? updatedBy : 'updatedBy', + target: 'users', + }); } - } - const fieldsToMake = { createdBy, updatedBy }; - Object.keys(fieldsToMake) - .filter(type => Boolean(fieldsToMake[type])) - .map(type => table.addField(makeOptions(type, fieldsToMake[type]))); - }); + }); - database.import({ - directory: path.resolve(__dirname, 'collections'), - }); + database.import({ + directory: path.resolve(__dirname, 'collections'), + }); - for (const [key, action] of Object.entries(usersActions)) { - resourcer.registerActionHandler(`users:${key}`, action); - } + for (const [key, action] of Object.entries(usersActions)) { + resourcer.registerActionHandler(`users:${key}`, action); + } - resourcer.use(middlewares.parseToken(options)); -} + resourcer.use(middlewares.parseToken({})); + }, +} as PluginOptions; diff --git a/packages/resourcer/package.json b/packages/resourcer/package.json index 82777084cf3bce2f47a0f59adc736e75d7c89e79..8865aff8b1fcbcc7dbbc66772e243790359a93a9 100644 --- a/packages/resourcer/package.json +++ b/packages/resourcer/package.json @@ -1,6 +1,6 @@ { "name": "@nocobase/resourcer", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "description": "", "main": "./lib/index.js", "types": "./lib/index.d.ts", @@ -9,7 +9,7 @@ "dependencies": { "deepmerge": "^4.2.2", "koa-compose": "^4.1.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "path-to-regexp": "^6.1.0", "qs": "^6.9.4" }, @@ -18,5 +18,5 @@ "url": "git+https://github.com/nocobase/nocobase.git", "directory": "packages/resourcer" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/resourcer/src/__tests__/koa.test.ts b/packages/resourcer/src/__tests__/koa.test.ts index 7567ab64820b25dcbe272d2dc43ab99f00da4241..9f9d7a75c9c1cae73adbdee2a2e6aeafee2eda02 100644 --- a/packages/resourcer/src/__tests__/koa.test.ts +++ b/packages/resourcer/src/__tests__/koa.test.ts @@ -152,32 +152,6 @@ describe('koa middleware', () => { expect(response.body.arr).toEqual([3, 4]); }); - it('shound work', async () => { - const app = new Koa(); - const resourcer = new Resourcer(); - const agent = supertest.agent(app.callback()); - - resourcer.define({ - name: 'tables#fields', - actions: { - async list(ctx, next) { - ctx.body = ctx.body || {}; - ctx.body.arr = ctx.body.arr || []; - ctx.body.arr.push(3); - await next(); - ctx.body.arr.push(4); - }, - } - }); - - app.use(resourcer.middleware({ - nameRule: ({ resourceName, associatedName }) => associatedName ? `${associatedName}#${resourceName}` : resourceName, - })); - - const response = await agent.get('/tables/demos/fields'); - expect(response.body.arr).toEqual([3, 4]); - }); - describe('action options', () => { let resourcer: Resourcer; let app: Koa; diff --git a/packages/resourcer/src/resourcer.ts b/packages/resourcer/src/resourcer.ts index d875a94e239d6d49debecb2bcf197edcc76f7da5..936446e3b17ee9aee0921ed3a155860a1ebe49d4 100644 --- a/packages/resourcer/src/resourcer.ts +++ b/packages/resourcer/src/resourcer.ts @@ -10,7 +10,6 @@ import _ from 'lodash'; export interface ResourcerContext { resourcer?: Resourcer; action?: Action; - params?: ParsedParams; [key: string]: any; } @@ -29,11 +28,51 @@ export interface KoaMiddlewareOptions { nameRule?: (params: ParsedParams) => string; /** - * 上下文中的 key - ctx[paramsKey] + * 自定义 action name + * + * 默认为 * - * 可以单独配置 paramsKey,默认为 params + * - list 查看列表 + * - create 新增数据 + * - get 查看数据详情 + * - update 更新数据 + * - delete 删除数据 */ - paramsKey?: string; + accessors?: { + + /** + * 查看列表 + */ + list?: string; + + /** + * 新增数据 + */ + create?: string; + + /** + * 查看数据详情 + */ + get?: string; + + /** + * 更新数据 + */ + update?: string; + + /** + * 删除数据 + */ + delete?: string; + }; +} + +export interface ResourcerOptions { + + /** + * 前缀 + */ + prefix?: string; /** * 自定义 action name @@ -127,10 +166,14 @@ export class Resourcer { protected middlewareHandlers = new Map(); - protected paramsKey = 'params'; - protected middlewares = []; + public readonly options: ResourcerOptions; + + constructor(options: ResourcerOptions = {}) { + this.options = options; + } + /** * 载入指定目录下的 resource 配置(配置的文件驱动) * @@ -174,6 +217,14 @@ export class Resourcer { return this.resources.has(name); } + registerAction(name: ActionName, handler: HandlerType) { + this.registerActionHandler(name, handler); + } + + registerActions(handlers: Handlers) { + this.registerActionHandlers(handlers); + } + /** * 注册全局的 action handlers * @@ -212,10 +263,6 @@ export class Resourcer { return this.getResource(name).getAction(action); } - getParamsKey() { - return this.paramsKey; - } - getMiddlewares() { return this.middlewares; } @@ -228,48 +275,40 @@ export class Resourcer { } } - middleware(options: KoaMiddlewareOptions = {}) { - const { prefix, accessors, paramsKey = 'params', nameRule = getNameByParams } = options; - return async (ctx: ResourcerContext, next: () => Promise) => { + restApiMiddleware(options: KoaMiddlewareOptions = {}) { + const { prefix, accessors } = options; + const restApiMiddleware = async (ctx: ResourcerContext, next: () => Promise) => { ctx.resourcer = this; let params = parseRequest({ path: ctx.request.path, method: ctx.request.method, }, { - prefix, - accessors, + prefix: this.options.prefix || prefix, + accessors: this.options.accessors || accessors, }); if (!params) { return next(); } try { - const resource = this.getResource(nameRule(params)); + const resource = this.getResource(getNameByParams(params)); // 为关系资源时,暂时需要再执行一遍 parseRequest - if (resource.options.type !== 'single') { + if (resource.options.type && resource.options.type !== 'single') { params = parseRequest({ path: ctx.request.path, method: ctx.request.method, type: resource.options.type, }, { - prefix, - accessors, + prefix: this.options.prefix || prefix, + accessors: this.options.accessors || accessors, }); if (!params) { return next(); } } // action 需要 clone 之后再赋给 ctx - ctx.action = this.getAction(nameRule(params), params.actionName).clone(); + ctx.action = this.getAction(getNameByParams(params), params.actionName).clone(); ctx.action.setContext(ctx); const query = parseQuery(ctx.request.querystring); - // 兼容 ctx.params 的处理,之后的版本里会去掉 - ctx[paramsKey] = { - table: params.resourceName, - tableKey: params.resourceKey, - relatedTable: params.associatedName, - relatedKey: params.resourceKey, - action: params.actionName, - }; if (pathToRegexp('/resourcer/{:associatedName.}?:resourceName{\\::actionName}').test(ctx.request.path)) { await ctx.action.mergeParams({ ...query, @@ -287,7 +326,12 @@ export class Resourcer { } catch (error) { return next(); } - } + }; + return restApiMiddleware; + } + + middleware(options: KoaMiddlewareOptions = {}) { + return this.restApiMiddleware(options); } /** diff --git a/packages/server/package.json b/packages/server/package.json index e8202388d87b5845b83b9deb81fbce3ae5bd156f..450311f4956aad5b59768712c0321b499f91756e 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@nocobase/server", - "version": "0.4.0-alpha.7", + "version": "0.5.0-alpha.25", "main": "lib/index.js", "types": "./lib/index.d.ts", "license": "MIT", @@ -8,17 +8,14 @@ "dependencies": { "@koa/cors": "^3.1.0", "@koa/router": "^9.4.0", - "@nocobase/actions": "^0.4.0-alpha.7", - "@nocobase/database": "^0.4.0-alpha.7", - "@nocobase/resourcer": "^0.4.0-alpha.7", + "@nocobase/actions": "^0.5.0-alpha.25", + "@nocobase/database": "^0.5.0-alpha.25", + "@nocobase/resourcer": "^0.5.0-alpha.25", + "commander": "^8.1.0", "dotenv": "^8.2.0", "koa": "^2.13.0", "koa-bodyparser": "^4.3.0", - "koa-static": "^5.0.0", - "mockjs": "^1.1.0", - "mysql2": "^2.1.0", - "pg": "^8.3.3", - "pg-hstore": "^2.3.3" + "koa-static": "^5.0.0" }, - "gitHead": "f0b335ac30f29f25c95d7d137655fa64d8d67f1e" + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" } diff --git a/packages/server/src/__tests__/application.test.ts b/packages/server/src/__tests__/application.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..510d122533800ac818a72423fddf365156a83936 --- /dev/null +++ b/packages/server/src/__tests__/application.test.ts @@ -0,0 +1,120 @@ +import supertest from 'supertest'; +import { Application } from '../application'; +import { Plugin } from '../plugin'; + +class MyPlugin extends Plugin {} + +describe('application', () => { + let app: Application; + let agent; + + beforeEach(() => { + app = new Application({ + database: { + dialect: 'sqlite', + dialectModule: require('sqlite3'), + storage: ':memory:', + }, + resourcer: { + prefix: '/api', + }, + dataWrapping: false, + registerActions: false, + }); + app.resourcer.registerActionHandlers({ + list: async (ctx, next) => { + ctx.body = [1, 2]; + await next(); + }, + get: async (ctx, next) => { + ctx.body = [3, 4]; + await next(); + }, + 'foo2s.bar2s:list': async (ctx, next) => { + ctx.body = [5, 6]; + await next(); + }, + }); + agent = supertest.agent(app.callback()); + }); + + afterEach(async () => { + return app.db.close(); + }); + + it('resourcer.define', async () => { + app.resourcer.define({ + name: 'test', + }); + const response = await agent.get('/api/test'); + expect(response.body).toEqual([1, 2]); + }); + + it('resourcer.define', async () => { + app.resourcer.define({ + type: 'hasMany', + name: 'test.abc', + }); + const response = await agent.get('/api/test/1/abc'); + expect(response.body).toEqual([1, 2]); + }); + + it('db.table', async () => { + app.db.table({ + name: 'tests', + }); + const response = await agent.get('/api/tests'); + expect(response.body).toEqual([1, 2]); + }); + + it('db.association', async () => { + app.db.table({ + name: 'bars', + }); + app.db.table({ + name: 'foos', + fields: [ + { + type: 'hasMany', + name: 'bars', + }, + ], + }); + const response = await agent.get('/api/foos/1/bars'); + expect(response.body).toEqual([1, 2]); + }); + + it('db.middleware', async () => { + const index = app.middleware.findIndex((m) => m.name === 'table2resource'); + app.middleware.splice(index, 0, async (ctx, next) => { + app.db.table({ + name: 'tests', + }); + await next(); + }); + const response = await agent.get('/api/tests'); + expect(response.body).toEqual([1, 2]); + }); + + it('db.middleware', async () => { + const index = app.middleware.findIndex((m) => m.name === 'table2resource'); + app.middleware.splice(index, 0, async (ctx, next) => { + app.db.table({ + name: 'bars', + }); + app.db.table({ + name: 'foos', + fields: [ + { + type: 'hasMany', + name: 'bars', + }, + ], + }); + await next(); + }); + console.log(app.middleware); + const response = await agent.get('/api/foos/1/bars'); + expect(response.body).toEqual([1, 2]); + }); +}); diff --git a/packages/server/src/__tests__/dataWrapping.test.ts b/packages/server/src/__tests__/dataWrapping.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..30457bad00c73fe1bd1019fc812187f328972236 --- /dev/null +++ b/packages/server/src/__tests__/dataWrapping.test.ts @@ -0,0 +1,57 @@ +import supertest from 'supertest'; +import { Application } from '../application'; + +describe('application', () => { + let app: Application; + let agent; + + beforeEach(() => { + app = new Application({ + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + }, + resourcer: { + prefix: '/api', + }, + dataWrapping: true, + }); + app.resourcer.registerActionHandlers({ + list: async (ctx, next) => { + ctx.body = [1, 2]; + await next(); + }, + get: async (ctx, next) => { + ctx.body = [3, 4]; + await next(); + }, + 'foo2s.bar2s:list': async (ctx, next) => { + ctx.body = [5, 6]; + await next(); + }, + }); + agent = supertest.agent(app.callback()); + }); + + afterEach(async () => { + return app.db.close(); + }); + + it('resourcer.define', async () => { + app.resourcer.define({ + name: 'test', + }); + const response = await agent.get('/api/test'); + expect(response.body).toEqual({ + data: [1, 2], + }); + }); +}); diff --git a/packages/server/src/__tests__/middleware.test.ts b/packages/server/src/__tests__/middleware.test.ts deleted file mode 100644 index 8947cbf568b268472d6a0ca482937e12c7d60484..0000000000000000000000000000000000000000 --- a/packages/server/src/__tests__/middleware.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Koa from 'koa'; -import supertest from 'supertest'; -import http from 'http'; -import Resourcer from '@nocobase/resourcer'; -import Database from '@nocobase/database'; -import middleware from '../middleware'; - -describe('middleware', () => { - let app: Koa; - let resourcer: Resourcer; - let database: Database; - let agent; - - beforeAll(() => { - app = new Koa(); - resourcer = new Resourcer(); - resourcer.registerActionHandlers({ - list: async (ctx, next) => { - ctx.body = [1, 2]; - await next(); - }, - get: async (ctx, next) => { - ctx.body = [3, 4]; - await next(); - }, - 'foo2s.bar2s:list': async (ctx, next) => { - ctx.body = [5, 6]; - await next(); - }, - }); - database = new Database({ - username: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - host: process.env.DB_HOST, - port: process.env.DB_PORT as any, - dialect: process.env.DB_DIALECT as any, - dialectOptions: { - charset: 'utf8mb4', - collate: 'utf8mb4_unicode_ci', - }, - }); - agent = supertest.agent(app.callback()); - app.use(middleware({ - prefix: '/api', - database, - resourcer, - })); - }); - it('shound work', async () => { - database.table({ - name: 'tests', - }); - const response = await agent.get('/api/tests'); - expect(response.body).toEqual([1, 2]); - }); - it('shound work', async () => { - database.table({ - name: 'foos', - fields: [ - { - type: 'hasmany', - name: 'bars', - } - ] - }); - database.table({ - name: 'bars', - fields: [ - { - type: 'belongsTo', - name: 'foo', - }, - ], - }); - let response = await agent.get('/api/foos/1/bars'); - expect(response.body).toEqual([1, 2]); - response = await agent.get('/api/bars/1/foo'); - expect(response.body).toEqual([3, 4]); - }); - it('shound work', async () => { - database.table({ - name: 'foo2s', - fields: [ - { - type: 'belongsToMany', - name: 'bar2s', - } - ] - }); - database.table({ - name: 'bar2s', - fields: [ - { - type: 'belongsToMany', - name: 'foo2s', - }, - ], - }); - let response = await agent.get('/api/foo2s/1/bar2s'); - expect(response.body).toEqual([5, 6]); - response = await agent.get('/api/bar2s/1/foo2s'); - expect(response.body).toEqual([1, 2]); - }); -}); diff --git a/packages/server/src/__tests__/plugin.test.ts b/packages/server/src/__tests__/plugin.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..94f7526888d2b01daddcd7ecba22470c752d1dd9 --- /dev/null +++ b/packages/server/src/__tests__/plugin.test.ts @@ -0,0 +1,161 @@ +import supertest from 'supertest'; +import { Application } from '../application'; +import { Plugin } from '../plugin'; +import path from 'path'; +import Plugin3 from './plugins/plugin3'; + +describe('plugin', () => { + let app: Application; + + beforeEach(() => { + app = new Application({ + database: { + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT as any, + dialect: process.env.DB_DIALECT as any, + dialectOptions: { + charset: 'utf8mb4', + collate: 'utf8mb4_unicode_ci', + }, + }, + resourcer: { + prefix: '/api', + }, + dataWrapping: false, + }); + }); + + afterEach(async () => { + return app.db.close(); + }); + + describe('define', () => { + it('plugin name', async () => { + const plugin = app.plugin(function abc() {}); + expect(plugin).toBeInstanceOf(Plugin); + expect(plugin.getName()).toBe('abc'); + }); + + it('plugin name', async () => { + const plugin = app.plugin({ + name: 'plugin-name2', + async load() {}, + }); + expect(plugin).toBeInstanceOf(Plugin); + expect(plugin.getName()).toBe('plugin-name2'); + }); + + it('plugin name', async () => { + const plugin = app.plugin({ + name: 'plugin-name3', + load: function () {}, + }); + expect(plugin).toBeInstanceOf(Plugin); + expect(plugin.getName()).toBe('plugin-name3'); + }); + + it('plugin name', async () => { + class MyPlugin extends Plugin {} + const plugin = app.plugin(MyPlugin); + expect(plugin).toBeInstanceOf(MyPlugin); + expect(plugin.getName()).toBe('MyPlugin'); + }); + + it('plugin name', async () => { + class MyPlugin extends Plugin {} + const plugin = app.plugin({ + plugin: MyPlugin, + }); + expect(plugin).toBeInstanceOf(MyPlugin); + expect(plugin.getName()).toBe('MyPlugin'); + }); + + it('plugin name', async () => { + const plugin = app.plugin(path.resolve(__dirname, './plugins/plugin1')); + expect(plugin).toBeInstanceOf(Plugin); + expect(plugin.getName()).toBe('abc'); + }); + + it('plugin name', async () => { + const plugin = app.plugin(path.resolve(__dirname, './plugins/plugin3')); + expect(plugin).toBeInstanceOf(Plugin3); + expect(plugin.getName()).toBe('Plugin3'); + }); + }); + + describe('load', () => { + it('plugin load', async () => { + app.plugin(function abc(this: Plugin) { + this.app.collection({ + name: 'tests', + }); + }); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin({ + load() { + app.collection({ + name: 'tests', + }); + } + }); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin({ + load: () => { + app.collection({ + name: 'tests', + }); + } + }); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin(class MyPlugin extends Plugin { + async load() { + this.app.collection({ + name: 'tests', + }); + } + }); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin(path.resolve(__dirname, './plugins/plugin1')); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin(path.resolve(__dirname, './plugins/plugin2')); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + + it('plugin load', async () => { + app.plugin(path.resolve(__dirname, './plugins/plugin3')); + await app.load(); + const Test = app.db.getModel('tests'); + expect(Test).toBeDefined(); + }); + }); +}); diff --git a/packages/server/src/__tests__/plugins/plugin1.ts b/packages/server/src/__tests__/plugins/plugin1.ts new file mode 100644 index 0000000000000000000000000000000000000000..cea3e2030651782a21159bc98f9d47f308266237 --- /dev/null +++ b/packages/server/src/__tests__/plugins/plugin1.ts @@ -0,0 +1,7 @@ +import { Plugin } from '../../plugin'; + +export default function abc(this: Plugin) { + this.app.db.table({ + name: 'tests', + }); +} diff --git a/packages/server/src/__tests__/plugins/plugin2.ts b/packages/server/src/__tests__/plugins/plugin2.ts new file mode 100644 index 0000000000000000000000000000000000000000..07b9d2bcd30e5efe468ad2400d49f4a3d117f21c --- /dev/null +++ b/packages/server/src/__tests__/plugins/plugin2.ts @@ -0,0 +1,9 @@ +import { IPlugin } from '../../plugin'; + +export default { + load() { + this.app.db.table({ + name: 'tests', + }); + } +} as IPlugin; diff --git a/packages/server/src/__tests__/plugins/plugin3.ts b/packages/server/src/__tests__/plugins/plugin3.ts new file mode 100644 index 0000000000000000000000000000000000000000..b11288b0c8899cbb4981d70bd154b457c84abcd0 --- /dev/null +++ b/packages/server/src/__tests__/plugins/plugin3.ts @@ -0,0 +1,9 @@ +import { Plugin } from '../../plugin'; + +export default class Plugin3 extends Plugin { + async load() { + this.app.db.table({ + name: 'tests', + }); + } +} diff --git a/packages/server/src/application.ts b/packages/server/src/application.ts index 32f5dd68730785a21c92c5306a2d76706c9f526b..66772ac986318f7180213e19f94357da5ac947fb 100644 --- a/packages/server/src/application.ts +++ b/packages/server/src/application.ts @@ -1,66 +1,217 @@ import Koa from 'koa'; -import Database, { DatabaseOptions } from '@nocobase/database'; -import Resourcer from '@nocobase/resourcer'; +import { Command, CommandOptions } from 'commander'; +import Database, { DatabaseOptions, TableOptions } from '@nocobase/database'; +import Resourcer, { ResourceOptions } from '@nocobase/resourcer'; +import { PluginType, Plugin, PluginOptions } from './plugin'; +import { registerActions } from '@nocobase/actions'; +import { + createCli, + createDatabase, + createResourcer, + registerMiddlewares, +} from './helper'; + +export interface ResourcerOptions { + prefix?: string; +} export interface ApplicationOptions { - database: DatabaseOptions; - resourcer?: any; + database?: DatabaseOptions; + resourcer?: ResourcerOptions; + bodyParser?: any; + cors?: any; + dataWrapping?: boolean; + registerActions?: boolean; +} + +interface DefaultState { + currentUser?: any; + [key: string]: any; +} + +interface DefaultContext { + db: Database; + resourcer: Resourcer; + [key: string]: any; } -export class Application extends Koa { - // static const EVENT_PLUGINS_LOADED = Symbol('pluginsLoaded'); +interface MiddlewareOptions { + name?: string; + resourceName?: string; + resourceNames?: string[]; + insertBefore?: string; + insertAfter?: string; +} - public readonly database: Database; +interface ActionsOptions { + resourceName?: string; + resourceNames?: string[]; +} + +export class Application< + StateT = DefaultState, + ContextT = DefaultContext +> extends Koa { + public readonly db: Database; public readonly resourcer: Resourcer; - protected plugins = new Map(); + public readonly cli: Command; + + protected plugins = new Map(); constructor(options: ApplicationOptions) { super(); - this.database = new Database(options.database); - this.resourcer = new Resourcer(); - // this.runHook('afterInit'); + + this.db = createDatabase(options); + this.resourcer = createResourcer(options); + this.cli = createCli(this, options); + + registerMiddlewares(this, options); + if (options.registerActions !== false) { + registerActions(this); + } } - registerPlugin(key: string | object, plugin?: any) { - if (typeof key === 'object') { - Object.keys(key).forEach((k) => { - this.registerPlugin(k, key[k]); - }); - } else { - const config = {}; - if (Array.isArray(plugin)) { - const [entry, options = {}] = plugin; - Object.assign(config, { entry, options }); - } else { - Object.assign(config, { entry: plugin, options: {} }); + use( + middleware: Koa.Middleware, + options?: MiddlewareOptions, + ) { + // @ts-ignore + return super.use(middleware); + } + + collection(options: TableOptions) { + return this.db.table(options); + } + + resource(options: ResourceOptions) { + return this.resourcer.define(options); + } + + actions(handlers: any, options?: ActionsOptions) { + return this.resourcer.registerActions(handlers); + } + + command(nameAndArgs: string, opts?: CommandOptions) { + return this.cli.command(nameAndArgs, opts); + } + + findCommand(name: string): Command { + return (this.cli as any)._findCommand(name); + } + + plugin(options?: PluginType | PluginOptions, ext?: PluginOptions): Plugin { + if (typeof options === 'string') { + return this.plugin(require(options).default, ext); + } + let instance: Plugin; + if (typeof options === 'function') { + try { + // @ts-ignore + instance = new options({ + name: options.name, + ...ext, + app: this, + }); + if (!(instance instanceof Plugin)) { + throw new Error('plugin must be instanceof Plugin'); + } + } catch (err) { + // console.log(err); + instance = new Plugin({ + name: options.name, + ...ext, + // @ts-ignore + load: options, + app: this, + }); } - this.plugins.set(key, config); + } else if (typeof options === 'object') { + const plugin = options.plugin || Plugin; + instance = new plugin({ + name: options.plugin ? plugin.name : undefined, + ...options, + ...ext, + app: this, + }); } + const name = instance.getName(); + if (this.plugins.has(name)) { + throw new Error(`plugin name [${name}] is repeated`); + } + this.plugins.set(name, instance); + return instance; } - getPluginInstance(key: string) { - const plugin = this.plugins.get(key); - return plugin && plugin.instance; + async load() { + await this.emitAsync('plugins.beforeLoad'); + for (const [name, plugin] of this.plugins) { + await this.emitAsync(`plugins.${name}.beforeLoad`); + await plugin.load(); + await this.emitAsync(`plugins.${name}.afterLoad`); + } + await this.emitAsync('plugins.afterLoad'); } - async loadPlugins() { - const allPlugins = this.plugins.values(); - for (const plugin of allPlugins) { - plugin.instance = await this.loadPlugin(plugin); + async emitAsync(event: string | symbol, ...args: any[]): Promise { + // @ts-ignore + const events = this._events; + let callbacks = events[event]; + if (!callbacks) { + return false; } - } + // helper function to reuse as much code as possible + const run = (cb) => { + switch (args.length) { + // fast cases + case 0: + cb = cb.call(this); + break; + case 1: + cb = cb.call(this, args[0]); + break; + case 2: + cb = cb.call(this, args[0], args[1]); + break; + case 3: + cb = cb.call(this, args[0], args[1], args[2]); + break; + // slower + default: + cb = cb.apply(this, args); + } + + if (cb && (cb instanceof Promise || typeof cb.then === 'function')) { + return cb; + } + + return Promise.resolve(true); + }; - protected async loadPlugin({ entry, options = {} }: { entry: string | Function, options: any }) { - let main: any; - if (typeof entry === 'function') { - main = entry; - } else if (typeof entry === 'string') { - const pathname = `${entry}/${__filename.endsWith('.ts') ? 'src' : 'lib'}/server`; - main = require(pathname).default; + if (typeof callbacks === 'function') { + await run(callbacks); + } else if (typeof callbacks === 'object') { + callbacks = callbacks.slice().filter(Boolean); + await callbacks.reduce((prev, next) => { + return prev.then((res) => { + return run(next).then((result) => + Promise.resolve(res.concat(result)), + ); + }); + }, Promise.resolve([])); } - return main && await main.call(this, options); + + return true; + } + + async parse(argv = process.argv) { + await this.load(); + return this.cli.parseAsync(argv); + } + + async destroy() { + await this.db.close(); } } diff --git a/packages/server/src/helper.ts b/packages/server/src/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..c1bb149786e9c3966bd5be9d83a6ef10977109f9 --- /dev/null +++ b/packages/server/src/helper.ts @@ -0,0 +1,100 @@ +import { DefaultContext, DefaultState } from 'koa'; +import bodyParser from 'koa-bodyparser'; +import cors from '@koa/cors'; +import Database from '@nocobase/database'; +import Resourcer from '@nocobase/resourcer'; +import { Command } from 'commander'; +import Application, { ApplicationOptions } from './application'; +import { dataWrapping } from './middlewares/data-wrapping'; +import { table2resource } from './middlewares/table2resource'; + +export function createDatabase(options: ApplicationOptions) { + if (options.database instanceof Database) { + return options.database; + } else { + return new Database(options.database); + } +} + +export function createResourcer(options: ApplicationOptions) { + return new Resourcer({ ...options.resourcer }); +} + +export function createCli(app, options: ApplicationOptions) { + const cli = new Command(); + + cli + .command('db:sync') + .option('-f, --force') + .action(async (...args) => { + console.log('db sync...'); + const cli = args.pop(); + const force = cli.opts()?.force; + await app.db.sync( + force + ? { + force: true, + alter: { + drop: true, + }, + } + : {}, + ); + await app.destroy(); + }); + + cli + .command('init') + .option('-f, --force') + .action(async (...args) => { + await app.db.sync({ + force: true, + }); + await app.emitAsync('db.init', ...args); + await app.destroy(); + }); + cli + .command('start') + .option('-p, --port [port]') + .action(async (...args) => { + const cli = args.pop(); + const opts = cli.opts(); + await app.emitAsync('beforeStart'); + app.listen(opts.port || 3000); + console.log(`http://localhost:${opts.port || 3000}/`); + }); + return cli; +} + +export function registerMiddlewares( + app: Application, + options: ApplicationOptions, +) { + if (options.bodyParser !== false) { + app.use( + bodyParser({ + ...options.bodyParser, + }), + ); + } + + app.use( + cors({ + exposeHeaders: ['content-disposition'], + ...options.cors, + }), + ); + + app.use(async (ctx, next) => { + ctx.db = app.db; + ctx.resourcer = app.resourcer; + await next(); + }); + + if (options.dataWrapping !== false) { + app.use(dataWrapping()); + } + + app.use(table2resource()); + app.use(app.resourcer.restApiMiddleware()); +} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 74b6dc4605f8a25180dc8150269bee2b47d98728..e19d8019d2e672217884b4f00b8fcd2cba103930 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,44 +1,4 @@ -import { actions, middlewares as m } from '@nocobase/actions'; -import Application from './application'; -import bodyParser from 'koa-bodyparser'; -import cors from '@koa/cors'; -import { dbResourceRouter } from './middlewares'; - export * from './application'; -export * from './middleware'; export * as middlewares from './middlewares'; - -export default { - /** - * 这部分还比较杂,细节待改进 - * - * @param options - */ - create(options: any): Application { - console.log(options); - - const app = new Application(options); - - app.use(bodyParser()); - app.use(cors()); - - app.resourcer.registerActionHandlers({ ...actions.common, ...actions.associate }); - - app.use(async (ctx, next) => { - ctx.db = app.database; - ctx.database = app.database; - await next(); - }); - - app.resourcer.use(m.associated); - app.use(m.dataWrapping); - - app.use(dbResourceRouter({ - database: app.database, - resourcer: app.resourcer, - ...(options.resourcer||{}), - })); - - return app; - } -} +export * from './plugin'; +export { Application as default } from './application'; diff --git a/packages/server/src/middleware.ts b/packages/server/src/middleware.ts deleted file mode 100644 index 038722fa4c4427d387d6ca9be6ba3ac1c9ea22e4..0000000000000000000000000000000000000000 --- a/packages/server/src/middleware.ts +++ /dev/null @@ -1,135 +0,0 @@ -import compose from 'koa-compose'; -import { pathToRegexp } from 'path-to-regexp'; -import Resourcer, { getNameByParams, KoaMiddlewareOptions, parseRequest, parseQuery, ResourcerContext, ResourceType } from '@nocobase/resourcer'; -import Database, { BELONGSTO, BELONGSTOMANY, HASMANY, HASONE } from '@nocobase/database'; - -interface MiddlewareOptions extends KoaMiddlewareOptions { - resourcer?: Resourcer; - database?: Database; -} -/** - * database + resourcer 结合的中间件(暂时不知道起什么名好) - * - * @param options - */ -export function middleware(options: MiddlewareOptions = {}) { - const { - prefix, - database, - resourcer, - accessors, - paramsKey = 'params', - nameRule = getNameByParams, - } = options; - return async (ctx: ResourcerContext, next: () => Promise) => { - ctx.resourcer = resourcer; - let params = parseRequest({ - path: ctx.request.path, - method: ctx.request.method, - }, { - prefix, - accessors, - }); - if (!params) { - return next(); - } - try { - const resourceName = nameRule(params); - // 如果资源名称未被定义 - if (!resourcer.isDefined(resourceName)) { - const [tableName, fieldName] = resourceName.split('.'); - const Collection = database.getModel('collections'); - // 检查资源对应的表名是否已经定义 - if (!database.isDefined(tableName) && Collection) { - // 未定义则尝试通过 collection 表来加载 - await Collection.load({ - where: { - name: tableName, - }, - }); - } - // 如果经过加载后是已经定义的表 - if (database.isDefined(tableName)) { - const table = database.getTable(tableName); - const field = table.getField(fieldName) as BELONGSTO | HASMANY | BELONGSTOMANY | HASONE; - if (!fieldName || field) { - let resourceType: ResourceType = 'single'; - let actions = {}; - if (field) { - if (field instanceof HASONE) { - resourceType = 'hasOne'; - } else if (field instanceof HASMANY) { - resourceType = 'hasMany'; - } else if (field instanceof BELONGSTO) { - resourceType = 'belongsTo'; - } else if (field instanceof BELONGSTOMANY) { - resourceType = 'belongsToMany'; - } - if (field.options.actions) { - actions = field.options.actions; - } - } else { - const items = table.getOptions('actions') || []; - for (const item of (items as any[])) { - actions[item.name] = item; - } - } - resourcer.define({ - type: resourceType, - name: resourceName, - actions, - }); - } - } - } - const resource = resourcer.getResource(resourceName); - // 为关系资源时,暂时需要再执行一遍 parseRequest - if (resource.options.type !== 'single') { - params = parseRequest({ - path: ctx.request.path, - method: ctx.request.method, - type: resource.options.type, - }, { - prefix, - accessors, - }); - if (!params) { - return next(); - } - } - // console.log(resource); - // action 需要 clone 之后再赋给 ctx - ctx.action = resourcer.getAction(resourceName, params.actionName).clone(); - ctx.action.setContext(ctx); - // 自带 query 处理的不太给力,需要用 qs 转一下 - const query = parseQuery(ctx.request.querystring); - // 兼容 ctx.params 的处理,之后的版本里会去掉 - ctx[paramsKey] = { - table: params.resourceName, - tableKey: params.resourceKey, - relatedTable: params.associatedName, - relatedKey: params.resourceKey, - action: params.actionName, - }; - if (pathToRegexp('/resourcer/{:associatedName.}?:resourceName{\\::actionName}').test(ctx.request.path)) { - await ctx.action.mergeParams({ - ...query, - ...params, - ...ctx.request.body, - }); - } else { - await ctx.action.mergeParams({ - ...query, - ...params, - values: ctx.request.body, - }); - } - return compose(ctx.action.getHandlers())(ctx, next); - } catch (error) { - console.log(error); - return next(); - } - } -} - -export default middleware; diff --git a/packages/server/src/middlewares/action-params.ts b/packages/server/src/middlewares/action-params.ts deleted file mode 100644 index 2d780af9c640fc3f7797a1f99cf0a2b6a3d46d3b..0000000000000000000000000000000000000000 --- a/packages/server/src/middlewares/action-params.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { actions } from '@nocobase/actions'; - -export function actionParams(options: any = {}) { - return async (ctx: actions.Context, next: actions.Next) => { - const { actionName, resourceField, resourceName, fields = {} } = ctx.action.params; - const table = ctx.db.getTable(resourceField ? resourceField.options.target : resourceName); - // ctx.state.developerMode = {[Op.not]: null}; - ctx.state.developerMode = false; - if (table && table.hasField('developerMode') && ctx.state.developerMode === false) { - ctx.action.mergeParams({ filter: { "developerMode.$isFalsy": true } }, { filter: 'and' }); - } - if (table && ['get', 'list'].includes(actionName)) { - const except = []; - const appends = []; - for (const [name, field] of table.getFields()) { - if (field.options.hidden) { - except.push(field.options.name); - } - // if (field.options.appends) { - // appends.push(field.options.name); - // } - } - ctx.action.mergeParams({ fields: { - except, - appends - } }, { fields: 'append' }); - // console.log('ctx.action.params.fields', ctx.action.params.fields, except, appends); - } - await next(); - } -} diff --git a/packages/server/src/middlewares/app-dist-serve.ts b/packages/server/src/middlewares/app-dist-serve.ts deleted file mode 100644 index da8db08ffbd4daaaed0bfcfe44cc2252286b8d59..0000000000000000000000000000000000000000 --- a/packages/server/src/middlewares/app-dist-serve.ts +++ /dev/null @@ -1,25 +0,0 @@ -import path from 'path'; -import send from 'koa-send'; -import serve from 'koa-static'; -import actions from '@nocobase/actions'; - -export interface AppDistServeOptions { - root?: string; - useStaticServer?: boolean; -} - -export function appDistServe(options: AppDistServeOptions = {}) { - return async (ctx: actions.Context, next: actions.Next) => { - if (!options.root || !options.useStaticServer) { - return next(); - } - let root = options.root; - if (!root.startsWith('/')) { - root = path.resolve(process.cwd(), root); - } - await serve(root)(ctx, next); - if (ctx.status == 404) { - return send(ctx, 'index.html', { root }); - } - } -} diff --git a/packages/server/src/middlewares/data-wrapping.ts b/packages/server/src/middlewares/data-wrapping.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ccb82d9ceaa9f8248040fcb4704675da4efd52b --- /dev/null +++ b/packages/server/src/middlewares/data-wrapping.ts @@ -0,0 +1,32 @@ +import { Context, Next } from '@nocobase/actions'; + +export function dataWrapping() { + return async function dataWrapping(ctx: Context, next: Next) { + await next(); + if (ctx.withoutDataWrapping) { + return; + } + if (!ctx?.action?.params) { + return; + } + if (ctx.body instanceof Buffer) { + return; + } + if (!ctx.body) { + ctx.body = {}; + } + const { rows, ...meta } = ctx.body; + if (rows) { + ctx.body = { + data: rows, + meta, + }; + } else { + ctx.body = { + data: ctx.body, + }; + } + } +} + +export default dataWrapping; diff --git a/packages/server/src/middlewares/db-resource-router.ts b/packages/server/src/middlewares/db-resource-router.ts deleted file mode 100644 index 1256998f4e60dbad273e50a9b774b2a837d05abe..0000000000000000000000000000000000000000 --- a/packages/server/src/middlewares/db-resource-router.ts +++ /dev/null @@ -1,133 +0,0 @@ -import compose from 'koa-compose'; -import { pathToRegexp } from 'path-to-regexp'; -import Resourcer, { getNameByParams, KoaMiddlewareOptions, parseRequest, parseQuery, ResourcerContext, ResourceType } from '@nocobase/resourcer'; -import Database, { BELONGSTO, BELONGSTOMANY, HASMANY, HASONE } from '@nocobase/database'; - -interface MiddlewareOptions extends KoaMiddlewareOptions { - resourcer?: Resourcer; - database?: Database; -} -/** - * database + resourcer 结合的中间件(暂时不知道起什么名好) - * - * @param options - */ -export function dbResourceRouter(options: MiddlewareOptions = {}) { - const { - prefix, - database, - resourcer, - accessors, - paramsKey = 'params', - nameRule = getNameByParams, - } = options; - return async (ctx: ResourcerContext, next: () => Promise) => { - ctx.resourcer = resourcer; - let params = parseRequest({ - path: ctx.request.path, - method: ctx.request.method, - }, { - prefix, - accessors, - }); - if (!params) { - return next(); - } - try { - const resourceName = nameRule(params); - // 如果资源名称未被定义 - if (!resourcer.isDefined(resourceName)) { - const [tableName, fieldName] = resourceName.split('.'); - const Collection = database.getModel('collections'); - // 检查资源对应的表名是否已经定义 - if (!database.isDefined(tableName) && Collection) { - // 未定义则尝试通过 collection 表来加载 - await Collection.load({ - where: { - name: tableName, - }, - }); - } - // 如果经过加载后是已经定义的表 - if (database.isDefined(tableName)) { - const table = database.getTable(tableName); - const field = table.getField(fieldName) as BELONGSTO | HASMANY | BELONGSTOMANY | HASONE; - if (!fieldName || field) { - let resourceType: ResourceType = 'single'; - let actions = {}; - if (field) { - if (field instanceof HASONE) { - resourceType = 'hasOne'; - } else if (field instanceof HASMANY) { - resourceType = 'hasMany'; - } else if (field instanceof BELONGSTO) { - resourceType = 'belongsTo'; - } else if (field instanceof BELONGSTOMANY) { - resourceType = 'belongsToMany'; - } - if (field.options.actions) { - actions = field.options.actions; - } - } else { - const items = table.getOptions('actions') || []; - for (const item of (items as any[])) { - actions[item.name] = item; - } - } - resourcer.define({ - type: resourceType, - name: resourceName, - actions, - }); - } - } - } - const resource = resourcer.getResource(resourceName); - // 为关系资源时,暂时需要再执行一遍 parseRequest - if (resource.options.type !== 'single') { - params = parseRequest({ - path: ctx.request.path, - method: ctx.request.method, - type: resource.options.type, - }, { - prefix, - accessors, - }); - if (!params) { - return next(); - } - } - // console.log(resource); - // action 需要 clone 之后再赋给 ctx - ctx.action = resourcer.getAction(resourceName, params.actionName).clone(); - ctx.action.setContext(ctx); - // 自带 query 处理的不太给力,需要用 qs 转一下 - const query = parseQuery(ctx.request.querystring); - // 兼容 ctx.params 的处理,之后的版本里会去掉 - ctx[paramsKey] = { - table: params.resourceName, - tableKey: params.resourceKey, - relatedTable: params.associatedName, - relatedKey: params.resourceKey, - action: params.actionName, - }; - if (pathToRegexp('/resourcer/{:associatedName.}?:resourceName{\\::actionName}').test(ctx.request.path)) { - await ctx.action.mergeParams({ - ...query, - ...params, - ...ctx.request.body, - }); - } else { - await ctx.action.mergeParams({ - ...query, - ...params, - values: ctx.request.body, - }); - } - return compose(ctx.action.getHandlers())(ctx, next); - } catch (error) { - console.log(error); - return next(); - } - } -} diff --git a/packages/server/src/middlewares/demo-blacklisted-actions.ts b/packages/server/src/middlewares/demo-blacklisted-actions.ts deleted file mode 100644 index 253b21bfc559204335bedfcf78c3575886cc102c..0000000000000000000000000000000000000000 --- a/packages/server/src/middlewares/demo-blacklisted-actions.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { actions } from '@nocobase/actions'; - -export interface DemoBlackListedActionsOptions { - emails?: string[]; - blacklist?: string[]; -} - -const defaultBlacklist = ['create', 'update', 'destroy', 'sort', 'upload']; - -export function demoBlacklistedActions(options: DemoBlackListedActionsOptions = {}) { - const { emails, blacklist = defaultBlacklist } = options; - return async (ctx: actions.Context, next: actions.Next) => { - const currentUser = ctx.state.currentUser; - if (currentUser && emails.includes(currentUser.email)) { - return next(); - } - const { actionName } = ctx.action.params; - if (blacklist.includes(actionName)) { - ctx.body = { - data: {}, - meta: {}, - }; - return; - } - await next(); - } -} diff --git a/packages/server/src/middlewares/index.ts b/packages/server/src/middlewares/index.ts index 34578155ee73283d2079e2e24ffdfd474292ecad..2b99c68a22170acfbc7f3f976401d3161c55b23d 100644 --- a/packages/server/src/middlewares/index.ts +++ b/packages/server/src/middlewares/index.ts @@ -1,4 +1,2 @@ -export * from './action-params'; -export * from './app-dist-serve'; -export * from './db-resource-router'; -export * from './demo-blacklisted-actions'; +export * from './table2resource'; +export * from './data-wrapping'; diff --git a/packages/server/src/middlewares/table2resource.ts b/packages/server/src/middlewares/table2resource.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe696629dd28205c9ebdcd122b3f579aa23fb44c --- /dev/null +++ b/packages/server/src/middlewares/table2resource.ts @@ -0,0 +1,74 @@ +import { + getNameByParams, + parseRequest, + ResourcerContext, + ResourceType, +} from '@nocobase/resourcer'; +import { BELONGSTO, BELONGSTOMANY, HASMANY, HASONE } from '@nocobase/database'; + +export function table2resource() { + return async function table2resource( + ctx: ResourcerContext, + next: () => Promise, + ) { + const resourcer = ctx.resourcer; + const database = ctx.db; + let params = parseRequest( + { + path: ctx.request.path, + method: ctx.request.method, + }, + { + prefix: resourcer.options.prefix, + accessors: resourcer.options.accessors, + }, + ); + if (!params) { + return next(); + } + const resourceName = getNameByParams(params); + // 如果资源名称未被定义 + if (resourcer.isDefined(resourceName)) { + return next(); + } + const [tableName, fieldName] = resourceName.split('.'); + // 如果经过加载后是已经定义的表 + if (!database.isDefined(tableName)) { + return next(); + } + const table = database.getTable(tableName); + const field = table.getField(fieldName) as + | BELONGSTO + | HASMANY + | BELONGSTOMANY + | HASONE; + if (!fieldName || field) { + let resourceType: ResourceType = 'single'; + let actions = {}; + if (field) { + if (field instanceof HASONE) { + resourceType = 'hasOne'; + } else if (field instanceof HASMANY) { + resourceType = 'hasMany'; + } else if (field instanceof BELONGSTO) { + resourceType = 'belongsTo'; + } else if (field instanceof BELONGSTOMANY) { + resourceType = 'belongsToMany'; + } + if (field.options.actions) { + actions = field.options.actions || {}; + } + } else { + actions = table.getOptions('actions') || {}; + } + resourcer.define({ + type: resourceType, + name: resourceName, + actions, + }); + } + return next(); + }; +} + +export default table2resource; diff --git a/packages/server/src/plugin.ts b/packages/server/src/plugin.ts new file mode 100644 index 0000000000000000000000000000000000000000..97c411ca5fefd5fd6948a131920868783aaba992 --- /dev/null +++ b/packages/server/src/plugin.ts @@ -0,0 +1,60 @@ +import { uid } from '@nocobase/database'; +import { Application } from './application'; +import _ from 'lodash'; + +export interface IPlugin { + install?: (this: Plugin) => void; + load?: (this: Plugin) => void; +} + +export interface PluginOptions { + name?: string; + activate?: boolean; + displayName?: string; + description?: string; + version?: string; + install?: (this: Plugin) => void; + load?: (this: Plugin) => void; + plugin?: typeof Plugin; + [key: string]: any; +} + +export type PluginFn = (this: Plugin) => void; + +export type PluginType = string | PluginFn | typeof Plugin; + +export class Plugin implements IPlugin { + options: PluginOptions = {}; + app: Application; + callbacks: IPlugin = {}; + + constructor(options?: PluginOptions & { app?: Application }) { + this.app = options?.app; + this.options = options; + this.callbacks = _.pick(options, ['load', 'activate']); + } + + getName() { + return this.options.name || uid(); + } + + async activate() { + this.options.activate = true; + } + + async install() { + await this.call('install'); + } + + async call(name: string) { + if (!this.callbacks[name]) { + return; + } + const callback = this.callbacks[name].bind(this); + await callback(); + } + + async load() { + await this.call('load'); + } +} diff --git a/packages/test/.gitignore b/packages/test/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1be219988380e71581d3d2cdb2d9d6e3638039da --- /dev/null +++ b/packages/test/.gitignore @@ -0,0 +1,4 @@ +node_modules +yarn-error.log +.env +src2 \ No newline at end of file diff --git a/packages/test/.npmignore b/packages/test/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/test/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/test/package.json b/packages/test/package.json new file mode 100644 index 0000000000000000000000000000000000000000..507bcf04875339fd3457579279c5db8d82a555ea --- /dev/null +++ b/packages/test/package.json @@ -0,0 +1,18 @@ +{ + "name": "@nocobase/test", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "types": "./lib/index.d.ts", + "license": "MIT", + "scripts": {}, + "dependencies": { + "@nocobase/server": "^0.5.0-alpha.25", + "@types/supertest": "^2.0.11", + "mockjs": "^1.1.0", + "mysql2": "^2.1.0", + "pg": "^8.3.3", + "pg-hstore": "^2.3.3", + "supertest": "^6.1.6" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/test/src/__tests__/mockDatabase.test.ts b/packages/test/src/__tests__/mockDatabase.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..bbb60d1e131e789442141fa8d9cf3527285dd036 --- /dev/null +++ b/packages/test/src/__tests__/mockDatabase.test.ts @@ -0,0 +1,16 @@ +import { mockDatabase } from "../"; + +describe('mock databasea', () => { + it('mock databasea', async () => { + const db = mockDatabase(); + db.table({ + name: 'tests', + fields: [ + { type: 'string', name: 'name' }, + ], + }); + expect(db.getModel('tests').getTableName()).toBe('_test_mockDatabase_tests'); + await db.sync(); + await db.close(); + }); +}); diff --git a/packages/test/src/__tests__/mockServer.test.ts b/packages/test/src/__tests__/mockServer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..062060fcfc95ec9ca9b25c5804e507d83aab41fb --- /dev/null +++ b/packages/test/src/__tests__/mockServer.test.ts @@ -0,0 +1,34 @@ +import { mockServer, MockServer } from "../"; + +describe('mock server', () => { + let api: MockServer; + + beforeEach(() => { + api = mockServer({ + dataWrapping: false, + }); + api.resourcer.registerActionHandlers({ + list: async (ctx, next) => { + ctx.body = [1, 2]; + await next(); + }, + }); + api.resourcer.define({ + name: 'test', + }); + }); + + afterEach(async () => { + return api.destroy(); + }); + + it('agent', async () => { + const response = await api.agent().get('/test'); + expect(response.body).toEqual([1, 2]); + }); + + it('resource', async () => { + const response = await api.agent().resource('test').list(); + expect(response.body).toEqual([1, 2]); + }); +}); diff --git a/packages/test/src/index.ts b/packages/test/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..63badf75ae72ca2084ef873ac67c9ba1e52e3aff --- /dev/null +++ b/packages/test/src/index.ts @@ -0,0 +1,2 @@ +export * from './mockDatabase'; +export * from './mockServer'; diff --git a/packages/test/src/mockDatabase.ts b/packages/test/src/mockDatabase.ts new file mode 100644 index 0000000000000000000000000000000000000000..4854e2322a261a3ad018dbeb95ecc777c48a0160 --- /dev/null +++ b/packages/test/src/mockDatabase.ts @@ -0,0 +1,40 @@ +import merge from 'deepmerge'; +import Database, { DatabaseOptions } from '@nocobase/database'; + +export function generatePrefixByPath() { + const { id } = require.main; + const key = id + .replace(`${process.env.PWD}/packages`, '') + .replace(/src\/__tests__/g, '') + .replace('.test.ts', '') + .replace(/[^\w]/g, '_') + .replace(/_+/g, '_'); + return key +} + +export function getConfig(config = {}, options?: any): DatabaseOptions { + return merge({ + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + host: process.env.DB_HOST, + port: process.env.DB_PORT, + dialect: process.env.DB_DIALECT, + logging: process.env.DB_LOG_SQL === 'on', + sync: { + force: true, + alter: { + drop: true, + }, + }, + hooks: { + beforeDefine(model, options) { + options.tableName = `${generatePrefixByPath()}_${options.tableName || options.name.plural}`; + }, + }, + }, config || {}, options) as any; +}; + +export function mockDatabase(options?: DatabaseOptions): Database { + return new Database(getConfig(options)); +} diff --git a/packages/test/src/mockServer.ts b/packages/test/src/mockServer.ts new file mode 100644 index 0000000000000000000000000000000000000000..330d1cc7b775c3c47dbef282206bbf5444c52e2a --- /dev/null +++ b/packages/test/src/mockServer.ts @@ -0,0 +1,114 @@ +import qs from 'qs'; +import supertest, { SuperAgentTest } from 'supertest'; +import Application, { ApplicationOptions } from '@nocobase/server'; +import { getConfig } from './mockDatabase'; + +interface ActionParams { + fields?: string[] | { + only?: string[]; + except?: string[]; + appends?: string[]; + }; + filter?: any; + sort?: string[]; + page?: number; + perPage?: number; + values?: any; + resourceName?: string; + resourceKey?: string; + associatedName?: string; + associatedKey?: string; + [key: string]: any; +} + +interface SortActionParams { + resourceName?: string; + resourceKey?: any; + associatedName?: string; + associatedKey?: any; + sourceId?: any; + targetId?: any; + sortField?: string; + method?: string; + target?: any; + sticky?: boolean; + [key: string]: any; +} + +interface Resource { + get: (params?: ActionParams) => Promise; + list: (params?: ActionParams) => Promise; + create: (params?: ActionParams) => Promise; + update: (params?: ActionParams) => Promise; + destroy: (params?: ActionParams) => Promise; + sort: (params?: SortActionParams) => Promise; + [name: string]: (params?: ActionParams) => Promise; +} + +export class MockServer extends Application { + agent(): SuperAgentTest & { resource: (name: string) => Resource } { + const agent = supertest.agent(this.callback()); + const prefix = this.resourcer.options.prefix; + const proxy = new Proxy({}, { + get(target, method: string, receiver) { + if (method === 'resource') { + return (name: string) => { + const keys = name.split('.'); + const proxy = new Proxy({}, { + get(target, method: string, receiver) { + return (params: ActionParams = {}) => { + const { + associatedKey, + resourceKey, + values = {}, + file, + ...restParams + } = params; + let url = prefix; + if (keys.length > 1) { + url = `/${keys[0]}/${associatedKey}/${keys[1]}` + } else { + url = `/${name}`; + } + url += `:${method as string}`; + if (resourceKey) { + url += `/${resourceKey}`; + } + console.log('request url: ' + url); + switch (method) { + case 'upload': + return agent + .post(`${url}?${qs.stringify(restParams)}`) + .attach('file', file) + .field(values); + case 'list': + case 'get': + return agent.get(`${url}?${qs.stringify(restParams)}`); + default: + return agent + .post(`${url}?${qs.stringify(restParams)}`) + .send(values); + } + }; + }, + }); + return proxy; + } + } + return (...args: any[]) => { + return agent[method](...args); + }; + } + }); + return proxy as any; + } +} + +export function mockServer(options?: ApplicationOptions) { + return new MockServer({ + ...options, + database: getConfig(options?.database), + }); +} + +export default mockServer; diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1be219988380e71581d3d2cdb2d9d6e3638039da --- /dev/null +++ b/packages/utils/.gitignore @@ -0,0 +1,4 @@ +node_modules +yarn-error.log +.env +src2 \ No newline at end of file diff --git a/packages/utils/.npmignore b/packages/utils/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..461574b2f4ba1ef431bff4f368dbce6b348c7840 --- /dev/null +++ b/packages/utils/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +docs +__tests__ +tsconfig.json +src +.fatherrc.ts \ No newline at end of file diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000000000000000000000000000000000000..a35497ec45b2d1a7564383ed6a58c1835588ef1e --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,13 @@ +{ + "name": "@nocobase/utils", + "version": "0.5.0-alpha.25", + "main": "lib/index.js", + "types": "./lib/index.d.ts", + "license": "MIT", + "scripts": {}, + "dependencies": { + "deepmerge": "^4.2.2", + "flat-to-nested": "^1.1.1" + }, + "gitHead": "e7df1f93c4e23b9a666d99ee7372c02bdaec97c4" +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e58cbe491834ef6ecc76c749a029fb7249b96a9b --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,9 @@ +import deepmerge from 'deepmerge'; + +const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray + +export function merge(obj1: any, obj2: any) { + return deepmerge(obj1, obj2, { + arrayMerge: overwriteMerge, + }); +} diff --git a/public/CNAME b/public/CNAME deleted file mode 100644 index 1764f3c94e68dc928bc5f43e6c893851b8c23c89..0000000000000000000000000000000000000000 --- a/public/CNAME +++ /dev/null @@ -1 +0,0 @@ -docs.nocobase.com diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100755 index 0000000000000000000000000000000000000000..d64e1af8948ec66048b19792761eac732444831c --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", + "allowJs": true, + "module": "commonjs", + "target": "ES6" + } +} \ No newline at end of file diff --git a/tsconfig.jest.json b/tsconfig.jest.json new file mode 100755 index 0000000000000000000000000000000000000000..06724af579997bfc33ff361f0e21077116990c6a --- /dev/null +++ b/tsconfig.jest.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react", + "sourceMap": true, + "target": "ES6", + "paths": { + "@nocobase/*": [ + "./packages/*/src" + ] + } + }, + "exclude": [ + "./packages/*/esm", + "./packages/*/lib" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 index 0f9d501d41f23033caca4269b63588d5a0808868..0055699ef23f1551f4953c21ecdc5c97ec647375 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,23 +1,23 @@ { "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", "jsx": "react", - "lib": [ "es5", "es6" ], "module": "commonjs", - "target": "es6", - "allowJs": true, - "allowSyntheticDefaultImports": true, - "declaration": true, - "resolveJsonModule": true, - "esModuleInterop": true, + "target": "ES6", + "allowJs": false, + "noUnusedLocals": false, + "removeComments": true, + "preserveConstEnums": true, "sourceMap": true, - "removeComments": false, - "baseUrl": "./", + "declaration": true, + "experimentalDecorators": true, + "downlevelIteration": true, + "baseUrl": ".", "paths": { + "@nocobase/*": [ + "./packages/*/src" + ] } - }, - "exclude": [ - "dotenv.js", - "jest.config.js", - "node_modules" - ] + } } \ No newline at end of file diff --git a/uid.js b/uid.js new file mode 100644 index 0000000000000000000000000000000000000000..522d070704c90ff3c1045b719329b4fa9ad93e97 --- /dev/null +++ b/uid.js @@ -0,0 +1,13 @@ + +let IDX = 36, +HEX = '' +while (IDX--) HEX += IDX.toString(36) + +function uid(len = 11) { +let str = '', + num = len || 11 +while (num--) str += HEX[(Math.random() * 36) | 0] +return str +} + +console.log(uid()); diff --git a/yarn.lock b/yarn.lock index b9e5654f37ed6214407cb67d184ca41c866756a7..4d9da240c3fa50af1fc238604c139f06041a79eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,22 @@ # yarn lockfile v1 +"@ahooksjs/use-request@^2.0.0": + version "2.8.12" + resolved "https://registry.npmjs.org/@ahooksjs/use-request/-/use-request-2.8.12.tgz#5234d5d7823d7759e87bd86f6ddbe40368090903" + integrity sha512-jGHKyhXeUmGD2ztEeLGIdXBGTwcDgM07/wO5eqNM0eCIYkmwGNuRjWD8cMmSZPStTCozkLJ8/f3JL93D+zK9UA== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + +"@ahooksjs/use-request@^2.8.10": + version "2.8.10" + resolved "https://registry.npmjs.org/@ahooksjs/use-request/-/use-request-2.8.10.tgz#643ea1a3c025fc7d0ff6a41621f11c03eed9ac22" + integrity sha512-wF+Lz1KQecXF3nfblUfQWfVUq5UU0G6uQ6b4bbeZAkAOhhUsso3//p44r8+i4/+Q+2TCcjPiOpN/LdE4MiOw3g== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + "@ant-design/colors@^6.0.0": version "6.0.0" resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" @@ -14,7 +30,12 @@ resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== -"@ant-design/icons@^4.6.2": +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== + +"@ant-design/icons@^4.0.0", "@ant-design/icons@^4.6.2": version "4.6.2" resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-4.6.2.tgz#290f2e8cde505ab081fda63e511e82d3c48be982" integrity sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A== @@ -25,6 +46,17 @@ classnames "^2.2.6" rc-util "^5.9.4" +"@ant-design/icons@^4.1.0", "@ant-design/icons@^4.6.3": + version "4.7.0" + resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f" + integrity sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + "@ant-design/react-slick@~0.28.1": version "0.28.3" resolved "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.3.tgz#ad5cf1cf50363c1a3842874d69d0ce1f26696e71" @@ -36,6 +68,199 @@ lodash "^4.17.21" resize-observer-polyfill "^1.5.0" +"@antv/adjust@^0.2.1": + version "0.2.3" + resolved "https://registry.npmjs.org/@antv/adjust/-/adjust-0.2.3.tgz#c3884a680c3264cc125d7f2ab5398e8a1c0b9401" + integrity sha512-rihqcCdS7piQnK1nRlCvbIaj2QeaqghxINXiMpTJp+0c9cKlTUwL7/2r+gv9YN5R0P1WzSHTmK2Sn+bQCJDo0Q== + dependencies: + "@antv/util" "~2.0.0" + tslib "^1.10.0" + +"@antv/attr@^0.3.1": + version "0.3.2" + resolved "https://registry.npmjs.org/@antv/attr/-/attr-0.3.2.tgz#e5866b64870c62f3a9c25b8a61f654ba2bfda051" + integrity sha512-31PfcVKeQdPBmr/QD+IC0NB/FbdtVKOXBCNMepFc5/dEs7jphmgG1V4tfAJmcXIHubCTHOjpscTrDIvoKSGvMQ== + dependencies: + "@antv/color-util" "^2.0.1" + "@antv/util" "~2.0.0" + tslib "^1.10.0" + +"@antv/color-util@^2.0.1", "@antv/color-util@^2.0.2": + version "2.0.6" + resolved "https://registry.npmjs.org/@antv/color-util/-/color-util-2.0.6.tgz#5e129bb9ce3f2b9309b52102b3dc929430ccc016" + integrity sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ== + dependencies: + "@antv/util" "^2.0.9" + tslib "^2.0.3" + +"@antv/component@^0.8.7": + version "0.8.17" + resolved "https://registry.npmjs.org/@antv/component/-/component-0.8.17.tgz#d93e0ead9bbdccea0f558531eb4610ccfacbcbf7" + integrity sha512-Dcz7u9TqamJzNRUDZclEjiXRxTLUY6DVGpyENKMvsp0dsu85W6R1t0O4rROj0hNspdFfDWUS7qqH39jVWWAu3Q== + dependencies: + "@antv/dom-util" "~2.0.1" + "@antv/g-base" "0.5.6" + "@antv/matrix-util" "^3.1.0-beta.1" + "@antv/path-util" "~2.0.7" + "@antv/scale" "~0.3.1" + "@antv/util" "~2.0.0" + fecha "~4.2.0" + tslib "^2.0.3" + +"@antv/coord@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@antv/coord/-/coord-0.3.1.tgz#982e261d8a1e06a198eb518ea7acc20ed875a019" + integrity sha512-rFE94C8Xzbx4xmZnHh2AnlB3Qm1n5x0VT3OROy257IH6Rm4cuzv1+tZaUBATviwZd99S+rOY9telw/+6C9GbRw== + dependencies: + "@antv/matrix-util" "^3.1.0-beta.2" + "@antv/util" "~2.0.12" + tslib "^2.1.0" + +"@antv/dom-util@^2.0.2", "@antv/dom-util@~2.0.1": + version "2.0.3" + resolved "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.3.tgz#cbd158b1c88e0e8a4d865871a5969b1190554ff5" + integrity sha512-dUHsUT4U9X1T1/Y9bH3jRMe0MzvWJk2jSQm1vm3w9NX+Ra0ftq5VUBiGTNbthm3nFwG0fFFjip904rYjl50g4A== + dependencies: + tslib "^2.0.3" + +"@antv/event-emitter@^0.1.1", "@antv/event-emitter@^0.1.2", "@antv/event-emitter@~0.1.0": + version "0.1.2" + resolved "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.2.tgz#a17b7cb86e6d071880dc6bfb232756f88624ecbc" + integrity sha512-6C6NJOdoNVptCr5y9BVOhKkCgW7LFs/SpcRyAExUeSjAm0zJqcqNkSIRGsXYhj4PJI+CZICHzGwwiSnIsE68Ug== + +"@antv/g-base@0.5.6": + version "0.5.6" + resolved "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.6.tgz#d96da5fbf6c5f8b073072751e15e5eec70b393fc" + integrity sha512-szxqFQ/xdCnfaeSEEC2kVjXdKxJnvKKJNT0MvaOG3UXOfsjPDLgb3IKLr+bU3sLvTAQfPhsbtYh7mWb03+mGjA== + dependencies: + "@antv/event-emitter" "^0.1.1" + "@antv/g-math" "^0.1.6" + "@antv/matrix-util" "^3.1.0-beta.1" + "@antv/path-util" "~2.0.5" + "@antv/util" "~2.0.0" + "@types/d3-timer" "^2.0.0" + d3-ease "^1.0.5" + d3-interpolate "^1.3.2" + d3-timer "^1.0.9" + detect-browser "^5.1.0" + tslib "^2.0.3" + +"@antv/g-base@^0.5.3", "@antv/g-base@~0.5.6": + version "0.5.9" + resolved "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.9.tgz#58d0e11d85157ada1408fbdf24f4f468f40e59cd" + integrity sha512-IAzuCLRmz9cKCWUKR3cKWgLZ/6OQYpTCIOgxAP8Bc+HRw0mu8iC3OTz+tWKGv9L8unpvCvpQd1H+OTTjdg/TpQ== + dependencies: + "@antv/event-emitter" "^0.1.1" + "@antv/g-math" "^0.1.6" + "@antv/matrix-util" "^3.1.0-beta.1" + "@antv/path-util" "~2.0.5" + "@antv/util" "~2.0.0" + "@types/d3-timer" "^2.0.0" + d3-ease "^1.0.5" + d3-interpolate "^1.3.2" + d3-timer "^1.0.9" + detect-browser "^5.1.0" + tslib "^2.0.3" + +"@antv/g-canvas@~0.5.10": + version "0.5.12" + resolved "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.12.tgz#2fc40dced6994f074f22341e65d56f7bbd5275f7" + integrity sha512-iJ/muwwqCCNONVlPIzv/7OL5iLguaKRj2BxNMytUO3TWwamM+kHkiyYEOkS0dPn9h/hBsHYlLUluSVz2Fp6/bw== + dependencies: + "@antv/g-base" "^0.5.3" + "@antv/g-math" "^0.1.6" + "@antv/matrix-util" "^3.1.0-beta.1" + "@antv/path-util" "~2.0.5" + "@antv/util" "~2.0.0" + gl-matrix "^3.0.0" + tslib "^2.0.3" + +"@antv/g-math@^0.1.6": + version "0.1.7" + resolved "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.7.tgz#6ec2769269f7ccb67e58140d5739df74046cc04e" + integrity sha512-xGyXaloD1ynfp7gS4VuV+MjSptZIwHvLHr8ekXJSFAeWPYLu84yOW2wOZHDdp1bzDAIuRv6xDBW58YGHrWsFcA== + dependencies: + "@antv/util" "~2.0.0" + gl-matrix "^3.0.0" + +"@antv/g-svg@~0.5.6": + version "0.5.6" + resolved "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.6.tgz#70b2fa980c431b39ad3c5b4b53e36a1d60957d65" + integrity sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A== + dependencies: + "@antv/g-base" "^0.5.3" + "@antv/g-math" "^0.1.6" + "@antv/util" "~2.0.0" + detect-browser "^5.0.0" + tslib "^2.0.3" + +"@antv/g2@^4.1.19": + version "4.1.24" + resolved "https://registry.npmjs.org/@antv/g2/-/g2-4.1.24.tgz#4f3f63cd7752e02e524217ee60a2ea8f22748c6d" + integrity sha512-jB7D5M5i3YFn9OWLOmYW4ywIgZ4bWXeXgpPPznddtgWJ5F777qM8jF/53VLYkpXBBVLdzj8AsEkgIVH42Rs+ig== + dependencies: + "@antv/adjust" "^0.2.1" + "@antv/attr" "^0.3.1" + "@antv/color-util" "^2.0.2" + "@antv/component" "^0.8.7" + "@antv/coord" "^0.3.0" + "@antv/dom-util" "^2.0.2" + "@antv/event-emitter" "~0.1.0" + "@antv/g-base" "~0.5.6" + "@antv/g-canvas" "~0.5.10" + "@antv/g-svg" "~0.5.6" + "@antv/matrix-util" "^3.1.0-beta.1" + "@antv/path-util" "^2.0.3" + "@antv/scale" "^0.3.7" + "@antv/util" "~2.0.5" + tslib "^2.0.0" + +"@antv/g2plot@^2.3.27": + version "2.3.30" + resolved "https://registry.npmjs.org/@antv/g2plot/-/g2plot-2.3.30.tgz#d400990694a7b971d1298fbcc53cc0fedae685e1" + integrity sha512-mGj7QWVTP63wVWtlceTEVK4NwgYQEXsBCyHANOtnRRU2WKhJDhRlPiV2o83BYm7P1WlycklTzvRQ9PVOcyH2yw== + dependencies: + "@antv/event-emitter" "^0.1.2" + "@antv/g2" "^4.1.19" + d3-hierarchy "^2.0.0" + d3-regression "^1.3.5" + pdfast "^0.2.0" + size-sensor "^1.0.1" + tslib "^2.0.3" + +"@antv/matrix-util@^3.1.0-beta.1", "@antv/matrix-util@^3.1.0-beta.2": + version "3.1.0-beta.2" + resolved "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.2.tgz#b4afafb70dbdf52affca308d3546c8a090fd23ca" + integrity sha512-Efwp0ZHxVDK/8RUa/RRWN7HKFHJmjn7Oq5HaNBbCmsxd7JTla3Zsoq1AZrjWMDlq0lplo77urclwI+XIW8NEHw== + dependencies: + "@antv/util" "^2.0.9" + gl-matrix "^3.3.0" + tslib "^1.10.0" + +"@antv/path-util@^2.0.3", "@antv/path-util@~2.0.5", "@antv/path-util@~2.0.7": + version "2.0.9" + resolved "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.9.tgz#976e4a3cfb6219767a602d297b205c88d66d7b2c" + integrity sha512-kunEz4dNheQMVn4rVFsoBDx+n9Knfi3uRLvDk9SojZAqpninsjFhdoiYtbExwJGz1FYGtiV10Y6N1tp73kZFcg== + dependencies: + "@antv/util" "^2.0.9" + tslib "^2.0.3" + +"@antv/scale@^0.3.7", "@antv/scale@~0.3.1": + version "0.3.12" + resolved "https://registry.npmjs.org/@antv/scale/-/scale-0.3.12.tgz#47dbba3e30f230bd6d27ca31d4204106608650db" + integrity sha512-ov0cQy5VsYUVFTwKZ3/sXcIKJK1msXye6xie6h+1McwvgmM+rZdKvGCbfGIXVmV9JBc9zksa2ke4E0sI0TawjQ== + dependencies: + "@antv/util" "~2.0.3" + fecha "~4.2.0" + tslib "^2.0.0" + +"@antv/util@^2.0.9", "@antv/util@~2.0.0", "@antv/util@~2.0.12", "@antv/util@~2.0.3", "@antv/util@~2.0.5": + version "2.0.14" + resolved "https://registry.npmjs.org/@antv/util/-/util-2.0.14.tgz#1ac8c4f790beaf6572daecf62df6aa55fa0a31df" + integrity sha512-iwM4XKRzW7pbBnMnSGKqcNGo3FdDzMGbRojAiMQ2KC0bTwtLEphQ+hYWa1c+O9BuHtcMkVvTVDylHNESL5vE5g== + dependencies: + tslib "^2.0.3" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -43,17 +268,38 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@7.12.10": + version "7.12.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" "@babel/core@7.12.3": version "7.12.3" @@ -77,20 +323,40 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz#a6d40917df027487b54312202a06812c4f7792d0" - integrity sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.10" - "@babel/parser" "^7.13.15" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.14" +"@babel/core@7.4.5": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.1.2", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" + integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-module-transforms" "^7.15.0" + "@babel/helpers" "^7.14.8" + "@babel/parser" "^7.15.0" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -98,63 +364,73 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.13.9", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": - version "7.13.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.12.1", "@babel/generator@^7.15.0", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.7.2": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" + integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== +"@babel/generator@^7.12.10", "@babel/generator@^7.15.4": + version "7.15.8" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" + integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-explode-assignable-expression" "^7.14.5" + "@babel/types" "^7.14.5" -"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.13" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" - integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" + integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== dependencies: - "@babel/compat-data" "^7.13.12" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.13.0": - version "7.13.11" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0", "@babel/helper-create-class-features-plugin@^7.4.4": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7" + integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-split-export-declaration" "^7.14.5" -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -165,176 +441,228 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== - dependencies: - "@babel/types" "^7.13.0" - -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" - integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== - dependencies: - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-explode-assignable-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" + integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.5" -"@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.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/types" "^7.14.5" -"@babel/helper-simple-access@^7.12.1", "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-member-expression-to-functions@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" + integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.15.0" -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" + integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-simple-access" "^7.14.8" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@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.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.1.0", "@babel/helper-remap-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" + integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-wrap-function" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" + integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/helper-simple-access@^7.12.1", "@babel/helper-simple-access@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" + integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== + dependencies: + "@babel/types" "^7.14.8" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" + integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.14.8", "@babel/helpers@^7.4.4": + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357" + integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/helpers@^7.12.5": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.5": + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" + integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== -"@babel/helpers@^7.12.1", "@babel/helpers@^7.13.10": - version "7.13.10" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" - integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/parser@^7.12.10", "@babel/parser@^7.15.4": + version "7.15.8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" + integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.13.15", "@babel/parser@^7.4.3": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" - integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== +"@babel/plugin-proposal-async-generator-functions@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.14.9", "@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a" + integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@7.12.1": @@ -345,13 +673,30 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== +"@babel/plugin-proposal-class-properties@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" + integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" + integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@7.12.1": version "7.12.1" @@ -362,6 +707,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-decorators" "^7.12.1" +"@babel/plugin-proposal-decorators@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" + integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + "@babel/plugin-proposal-do-expressions@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.12.1.tgz#8d7f1bc532d8168147555c26e3db922cc0dfd2f8" @@ -370,12 +724,28 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-do-expressions" "^7.12.1" -"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-do-expressions@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.2.0.tgz#7abf56d27125f2b040c9cb0ab03119cf117128a9" + integrity sha512-2bWN48zQHf/W5T8XvemGQJSi8hzhIo7y4kv/RiA08UcMLQ73lkTknhlaFGf1HjCJzG8FGopgsq6pSe1C+10fPg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-do-expressions" "^7.2.0" + +"@babel/plugin-proposal-do-expressions@^7.0.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.14.5.tgz#a15e0b262a98f732d81581b1bb5f52cee1e7eb07" + integrity sha512-i40m/CLe5WBGYMZL/SC3xtjJ/B0i+XblaonSsinumgfNIqmBOf4LEcZJXijoQeQbQVl55PyM0siWSWWJ9lV7cA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-do-expressions" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-default-from@7.12.1": @@ -386,6 +756,22 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-default-from" "^7.12.1" +"@babel/plugin-proposal-export-default-from@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.2.0.tgz#737b0da44b9254b6152fe29bb99c64e5691f6f68" + integrity sha512-NVfNe7F6nsasG1FnvcFxh2FN0l04ZNe75qTOAVOILWPam0tw9a63RtT/Dab8dPjedZa4fTQaQ83yMMywF9OSug== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.2.0" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.14.5.tgz#8931a6560632c650f92a8e5948f6e73019d6d321" + integrity sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-default-from" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" @@ -394,28 +780,44 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.2.0.tgz#308fd4d04ff257fc3e4be090550840eeabad5dd9" + integrity sha512-DZUxbHYxQ5fUFIkMEnh75ogEdBLPfL+mQUqrO2hNY2LGm+tqFnxE924+mhAcCOh/8za8AaZsWHbq6bBoS3TAzA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-namespace-from" "^7.2.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-function-bind@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.2.0.tgz#94dc2cdc505cafc4e225c0014335a01648056bf7" + integrity sha512-qOFJ/eX1Is78sywwTxDcsntLOdb5ZlHVVqUz5xznq8ldAfOVIyZzp1JE2rzHnaksZIhrqMrwIpQL/qcEprnVbw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-function-bind" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.14.5", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@7.12.1": @@ -426,39 +828,63 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" + integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.5" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.14.5", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@7.12.1": @@ -470,32 +896,58 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-pipeline-operator@7.3.2": + version "7.3.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.3.2.tgz#cc6be43c8455422f2faca39b9355558f0bff5a3f" + integrity sha512-wuzx8U/KZLJYoqU6joiaKY0PixHuYZ3Vxys+wPahNAZEEm+EDb1eTc19DuJob3BdxYSD9PWPbwyoRbhkdoYErg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-pipeline-operator" "^7.3.0" -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.0", "@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== @@ -516,19 +968,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.12.1": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" - integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== +"@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.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-do-expressions@^7.12.1": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.12.13.tgz#ccc56d7badecf21a4c47a9f63ef0eeb9582f0306" - integrity sha512-xm52bNA0O8QPH4rBXXJ/VLaQ6UGocUS3/fbgZO5z+KDUU7y8iFy8cnIwuRS/NNGjs18sOquzJfH0EasQv+F1oQ== +"@babel/plugin-syntax-decorators@^7.12.1", "@babel/plugin-syntax-decorators@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-do-expressions@^7.12.1", "@babel/plugin-syntax-do-expressions@^7.14.5", "@babel/plugin-syntax-do-expressions@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.14.5.tgz#d32be33bb0ea7c16cf2265f097864c363690954a" + integrity sha512-IpVyxRlfFCU2emBiq2OxUX10PD6FoGZ30yWwGt1qdkIPUDhAodG5Il1LStODgATndKRhQgqT21ksqA5fd39AwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import@7.8.3", "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -537,20 +1003,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.12.1": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz#3c807d37efaf0a806f1deb556ccb3b2f562ae9c2" - integrity sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ== +"@babel/plugin-syntax-export-default-from@^7.12.1", "@babel/plugin-syntax-export-default-from@^7.14.5", "@babel/plugin-syntax-export-default-from@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.14.5.tgz#cdfa9d43d2b2c89b6f1af3e83518e8c8b9ed0dbc" + integrity sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-export-namespace-from@^7.8.3": +"@babel/plugin-syntax-export-namespace-from@^7.2.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-function-bind@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.14.5.tgz#eb7544014fe349f48acbebc5084eeadde2efe57e" + integrity sha512-gstAIrKtlPwrQaRz4uK+kT7zI2p5MQqX41SeO+kZKH1XGO1jL0nLZBWznRigPpkem6LfIoG2EduQZmPBcUwEmg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -558,19 +1031,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0", "@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.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -579,7 +1052,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@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== @@ -593,157 +1066,178 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@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.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^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.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.2.0", "@babel/plugin-syntax-optional-chaining@^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-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== +"@babel/plugin-syntax-pipeline-operator@^7.3.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.15.0.tgz#47ee9780aa4e10d3a848089a65c0a0b513caa5e9" + integrity sha512-APuEsBJFWgLasnPi3XS4o7AW24Z8hsX1odmCl9it1fpIA38E2+rSWk6zy1MpFQYKGyphlh84dJB4MtDwI0XN5w== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== +"@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.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== +"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5", "@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.14.5", "@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.14.5", "@babel/plugin-transform-block-scoping@^7.4.4": + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.9", "@babel/plugin-transform-classes@^7.4.4": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f" + integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.14.5", "@babel/plugin-transform-computed-properties@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" - integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== +"@babel/plugin-transform-destructuring@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.4.4": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.14.5", "@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.14.5", "@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.14.5", "@babel/plugin-transform-for-of@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" + integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.14.5", "@babel/plugin-transform-function-name@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.14.5", "@babel/plugin-transform-literals@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.14.5", "@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.14.5", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@7.12.1": @@ -756,138 +1250,138 @@ "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.7.2": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.15.0", "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.7.2": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281" + integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.8" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.14.5", "@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" + integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.14.5", "@babel/plugin-transform-modules-umd@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.14.5", "@babel/plugin-transform-new-target@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.14.5", "@babel/plugin-transform-object-super@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.14.5", "@babel/plugin-transform-parameters@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" + integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.14.5", "@babel/plugin-transform-property-literals@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-constant-elements@^7.7.4": - version "7.13.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz#0208b1d942bf939cd4f7aa5b255d42602aa4a920" - integrity sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ== + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz#41790d856f7c5cec82d2bcf5d0e5064d682522ed" + integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.12.17": - version "7.12.17" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" - integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== +"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.17" + "@babel/plugin-transform-react-jsx" "^7.14.5" -"@babel/plugin-transform-react-jsx-self@^7.12.1": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" - integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== +"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.12.1": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz#33041e665453391eb6ee54a2ecf3ba1d46bd30f4" + integrity sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-source@^7.12.1": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" - integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== +"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.12.1": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz#79f728e60e6dbd31a2b860b0bf6c9765918acf1d" + integrity sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.13.12": - version "7.13.12" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" - integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.13.12" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== +"@babel/plugin-transform-react-pure-annotations@^7.12.1", "@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.4.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.14.5", "@babel/plugin-transform-reserved-words@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-runtime@7.12.1": version "7.12.1" @@ -899,65 +1393,75 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== +"@babel/plugin-transform-runtime@7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08" + integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5", "@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.14.6", "@babel/plugin-transform-spread@^7.2.0": + version "7.14.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== +"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.14.5", "@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5", "@babel/plugin-transform-template-literals@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.12.1": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.14.5", "@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== +"@babel/plugin-transform-typescript@^7.12.1", "@babel/plugin-transform-typescript@^7.15.0", "@babel/plugin-transform-typescript@^7.3.2": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz#553f230b9d5385018716586fc48db10dd228eb7e" + integrity sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== +"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.14.5", "@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/preset-env@7.12.1": version "7.12.1" @@ -1031,31 +1535,88 @@ core-js-compat "^3.6.2" semver "^5.5.0" -"@babel/preset-env@^7.9.5": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" - integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== +"@babel/preset-env@7.4.5": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-env@^7.1.0", "@babel/preset-env@^7.9.5": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz#e2165bf16594c9c05e52517a194bf6187d6fe464" + integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.9" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -1065,45 +1626,46 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@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.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.9" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.0" + "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.14" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" + "@babel/types" "^7.15.0" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" semver "^6.3.0" "@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": @@ -1117,6 +1679,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-react@7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/preset-react@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" @@ -1130,17 +1703,17 @@ "@babel/plugin-transform-react-jsx-source" "^7.12.1" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" -"@babel/preset-react@^7.9.4": - version "7.13.13" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz#fa6895a96c50763fe693f9148568458d5a839761" - integrity sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA== +"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.9.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.13.12" - "@babel/plugin-transform-react-jsx-development" "^7.12.17" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" "@babel/preset-typescript@7.12.1": version "7.12.1" @@ -1150,6 +1723,23 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript" "^7.12.1" +"@babel/preset-typescript@7.3.3": + version "7.3.3" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" + integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.3.2" + +"@babel/preset-typescript@^7.1.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" + "@babel/register@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/register/-/register-7.12.1.tgz#cdb087bdfc4f7241c03231f22e15d211acf21438" @@ -1168,43 +1758,89 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": - version "7.13.10" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" - integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== +"@babel/runtime@7.4.5": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3", "@babel/template@^7.4.0": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.2": - version "7.13.15" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7" - integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.15" - "@babel/types" "^7.13.14" +"@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" + integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.14.5", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.4.4": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/template@^7.12.7", "@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" + integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.0" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.15.0" + "@babel/types" "^7.15.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.6", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.2": - version "7.13.14" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" - integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== +"@babel/traverse@^7.12.10", "@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.14.9", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.2": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@babel/types@^7.12.10", "@babel/types@^7.15.4", "@babel/types@^7.15.6": + version "7.15.6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1235,15 +1871,46 @@ resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== -"@eslint/eslintrc@^0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" - integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== +"@dnd-kit/accessibility@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.0.0.tgz#b56e3750414fd907b7d6972b3116aa8f96d07fde" + integrity sha512-QwaQ1IJHQHMMuAGOOYHQSx7h7vMZPfO97aDts8t5N/MY7n2QTDSnW+kF7uRQ1tVBkr6vJ+BqHWG5dlgGvwVjow== + dependencies: + tslib "^2.0.0" + +"@dnd-kit/core@4.0.0-next-2021720152655": + version "4.0.0-next-2021720152655" + resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-4.0.0-next-2021720152655.tgz#580175fc182c68b3829f81669ce233c558f25c3c" + integrity sha512-dxZDvk4e7EPQy9LiZppyTm9nPLq8AG91iq72jbLG5+J7Nl94u0/jhcdpqmMFptj/ha8nq1lBl9f3T2gaju/KUg== + dependencies: + "@dnd-kit/accessibility" "^3.0.0" + "@dnd-kit/utilities" "^3.0.0-next-2021720152655" + tslib "^2.0.0" + +"@dnd-kit/sortable@5.0.0-next-2021720152655": + version "5.0.0-next-2021720152655" + resolved "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-5.0.0-next-2021720152655.tgz#bfd1afbaeb7c6b9a87c25dcae791487ceed87a49" + integrity sha512-eZFDoVRuPfyURyEBdlwYOK/yfSZFDyuTkoBdswzfeYYzGNYB6UGgZYnASzGa2sL8yk6QYoyfg2tuSu1yXsflDw== + dependencies: + "@dnd-kit/utilities" "^3.0.0-next-2021720152655" + tslib "^2.0.0" + +"@dnd-kit/utilities@^3.0.0-next-2021720152655": + version "3.0.0-next-2021720152655" + resolved "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.0.0-next-2021720152655.tgz#e2e4251984f24137f384f4b4087d5cdc56847a03" + integrity sha512-H9mhC46UoBSOyTARp7KQ6dJyRoMF4u2UsDfvv6hP150d13MkzGHIYEnQtYiyXYNc42EbdFo7aXHjKRz14py0mQ== + dependencies: + tslib "^2.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" @@ -1324,6 +1991,165 @@ unique-filename "^1.1.1" which "^1.3.1" +"@formatjs/intl-displaynames@^1.2.0": + version "1.2.10" + resolved "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-1.2.10.tgz#bb9625cca90b099978cd967c6a98aaf4e23fc878" + integrity sha512-GROA2RP6+7Ouu0WnHFF78O5XIU7pBfI19WM1qm93l6MFWibUk67nCfVCK3VAYJkLy8L8ZxjkYT11VIAfvSz8wg== + dependencies: + "@formatjs/intl-utils" "^2.3.0" + +"@formatjs/intl-listformat@^1.4.1": + version "1.4.8" + resolved "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-1.4.8.tgz#70b81005e7dcf74329cb5b314a940ce5fce36cd0" + integrity sha512-WNMQlEg0e50VZrGIkgD5n7+DAMGt3boKi1GJALfhFMymslJb5i+5WzWxyj/3a929Z6MAFsmzRIJjKuv+BxKAOQ== + dependencies: + "@formatjs/intl-utils" "^2.3.0" + +"@formatjs/intl-pluralrules@^1.5.0": + version "1.5.9" + resolved "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-1.5.9.tgz#c363c833c0ccde11eb508de4c09d3eaa232e819a" + integrity sha512-37E1ZG+Oqo3qrpUfumzNcFTV+V+NCExmTkkQ9Zw4FSlvJ4WhbbeYdieVapUVz9M0cLy8XrhCkfuM/Kn03iKReg== + dependencies: + "@formatjs/intl-utils" "^2.3.0" + +"@formatjs/intl-relativetimeformat@^4.5.7", "@formatjs/intl-relativetimeformat@^4.5.9": + version "4.5.16" + resolved "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-4.5.16.tgz#7449cef3213dd66d25924ca41f125f87b58df95a" + integrity sha512-IQ0haY97oHAH5OYUdykNiepdyEWj3SAT+Fp9ZpR85ov2JNiFx+12WWlxlVS8ehdyncC2ZMt/SwFIy2huK2+6/A== + dependencies: + "@formatjs/intl-utils" "^2.3.0" + +"@formatjs/intl-unified-numberformat@^3.2.0": + version "3.3.7" + resolved "https://registry.npmjs.org/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.7.tgz#9995a24568908188e716d81a1de5b702b2ee00e2" + integrity sha512-KnWgLRHzCAgT9eyt3OS34RHoyD7dPDYhRcuKn+/6Kv2knDF8Im43J6vlSW6Hm1w63fNq3ZIT1cFk7RuVO3Psag== + dependencies: + "@formatjs/intl-utils" "^2.3.0" + +"@formatjs/intl-utils@^2.2.0", "@formatjs/intl-utils@^2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@formatjs/intl-utils/-/intl-utils-2.3.0.tgz#2dc8c57044de0340eb53a7ba602e59abf80dc799" + integrity sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ== + +"@formily/antd@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/antd/-/antd-2.0.0-rc.3.tgz#714e3cca4dee78799ff3b51f9d9fca143ed52513" + integrity sha512-uHq+Z1YWzBQgk5zYRhUcRL6UUfLLveSwRptDxUjw/TRS760WIfzs52m/763TZqKpmMmDb83lFoailEoKwalVtg== + dependencies: + "@ant-design/icons" "^4.0.0" + "@formily/core" "2.0.0-rc.3" + "@formily/json-schema" "2.0.0-rc.3" + "@formily/react" "2.0.0-rc.3" + "@formily/reactive" "2.0.0-rc.3" + "@formily/reactive-react" "2.0.0-rc.3" + "@formily/shared" "2.0.0-rc.3" + "@juggle/resize-observer" "^3.3.1" + classnames "^2.2.6" + react-sortable-hoc "^1.11.0" + react-sticky-box "^0.9.3" + +"@formily/core@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/core/-/core-2.0.0-rc.3.tgz#aeb085c88f24527fec9b14efe162a77b0a9a4741" + integrity sha512-DZvrCbQqpg8A0V0asVFYWbmdiqmDLq52OZmImr/1Vh3fa6wLExenoMfd1Koz1NXHdtMsLDlqOLnneS8e8+xKgw== + dependencies: + "@formily/reactive" "2.0.0-rc.3" + "@formily/shared" "2.0.0-rc.3" + "@formily/validator" "2.0.0-rc.3" + +"@formily/json-schema@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/json-schema/-/json-schema-2.0.0-rc.3.tgz#86cb03910e135e198decd41c8e7ecd38923bf8d1" + integrity sha512-l9XtoX2Y8LOWzKoz26Q1E2mbGdPsQXikhCpKdoQ8/wQxEPDd4xzKXVq1+JTepW+N6Qk0I+mP1K26I5vhx9pqCw== + dependencies: + "@formily/core" "2.0.0-rc.3" + "@formily/reactive" "2.0.0-rc.3" + "@formily/shared" "2.0.0-rc.3" + +"@formily/path@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/path/-/path-2.0.0-rc.3.tgz#10023fe2776d9f2b22ddce1019b5d931f4a517a5" + integrity sha512-Q2QgJQH7VOJ/T3dx1GjnA1KCQfutatDcJ7yH7XIJY4XQILnoI5HnNM4b0kJfYH+0LppUsRJrZAhEMO4bH2PUUQ== + +"@formily/react@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/react/-/react-2.0.0-rc.3.tgz#7ba70b8045b096b4117e2664948b695747e5545c" + integrity sha512-nPiYAOymAtS6ZRN+/uT6c6M729x3c4keRF4johXpBL3gj9Qy3RtGAy41e9Ey/oGHfJjYXCjeLBxtedEyH/3YhA== + dependencies: + "@formily/core" "2.0.0-rc.3" + "@formily/json-schema" "2.0.0-rc.3" + "@formily/reactive" "2.0.0-rc.3" + "@formily/reactive-react" "2.0.0-rc.3" + "@formily/shared" "2.0.0-rc.3" + "@formily/validator" "2.0.0-rc.3" + hoist-non-react-statics "^3.3.2" + +"@formily/reactive-react@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/reactive-react/-/reactive-react-2.0.0-rc.3.tgz#ed2e16e85998867b57e6957aee758154d819d2f3" + integrity sha512-h1rkVFtlXnz4f9JE7550K37DJe/l1OHsiPpqIx4eEROSZedoAmsyp/vysDEU2L6CSYmvcLXrqAD4feWh6/r23g== + dependencies: + "@formily/reactive" "2.0.0-rc.3" + hoist-non-react-statics "^3.3.2" + +"@formily/reactive@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/reactive/-/reactive-2.0.0-rc.3.tgz#2c3a4f034c3e733c75e0e8a9041379be475e74fa" + integrity sha512-m9KOsYkf03efV2D4uGuWQlfSXn8LmuS1B2D56GCu351/CVkiYgaKCm9/3lTOy+Ff0eEg5awdpT5ATOnnQpGa7g== + +"@formily/shared@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/shared/-/shared-2.0.0-rc.3.tgz#8bd430c1d35561397a0686ebb043ae97a0626561" + integrity sha512-r0MbLytj//Db2nGNsOi2dyaX1x25EJpPZm1xNevZqGhBj+j+X9YcIl1FbpB6j1nEN6DA3z599AM0V0wu4hpDcA== + dependencies: + "@formily/path" "2.0.0-rc.3" + camel-case "^4.1.1" + lower-case "^2.0.1" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.1" + upper-case "^2.0.1" + +"@formily/validator@2.0.0-rc.3": + version "2.0.0-rc.3" + resolved "https://registry.npmjs.org/@formily/validator/-/validator-2.0.0-rc.3.tgz#74a6b093ede5275d93b6e38435c5a7874c34a509" + integrity sha512-pk7fN/P2U38C56YYx6JIcWssAlgxeYoU1rSLFKiV4bawJyoeypVkk6SNmRrruYsFkiZuALvQ2BPtaPpLm7YLIQ== + dependencies: + "@formily/shared" "2.0.0-rc.3" + +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.2" + resolved "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" + integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ== + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.6.0" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o= + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1340,6 +2166,15 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + "@jest/console@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" @@ -1352,6 +2187,40 @@ jest-util "^26.6.2" slash "^3.0.0" +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + "@jest/core@^26.6.3": version "26.6.3" resolved "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" @@ -1386,6 +2255,16 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + "@jest/environment@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" @@ -1396,6 +2275,15 @@ "@types/node" "*" jest-mock "^26.6.2" +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + "@jest/fake-timers@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" @@ -1417,6 +2305,33 @@ "@jest/types" "^26.6.2" expect "^26.6.2" +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + "@jest/reporters@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" @@ -1449,6 +2364,15 @@ optionalDependencies: node-notifier "^8.0.0" +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + "@jest/source-map@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" @@ -1458,6 +2382,15 @@ graceful-fs "^4.2.4" source-map "^0.6.0" +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@jest/test-result@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" @@ -1468,6 +2401,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + "@jest/test-sequencer@^26.6.3": version "26.6.3" resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" @@ -1479,6 +2422,28 @@ jest-runner "^26.6.3" jest-runtime "^26.6.3" +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + "@jest/transform@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" @@ -1500,6 +2465,15 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1511,7 +2485,35 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@koa/router@^9.3.1": +"@jest/types@^27.1.1": + version "27.1.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.1.1.tgz#77a3fc014f906c65752d12123a0134359707c0ad" + integrity sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@juggle/resize-observer@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0" + integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== + +"@koa/cors@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@koa/cors/-/cors-3.1.0.tgz#618bb073438cfdbd3ebd0e648a76e33b84f3a3b2" + integrity sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q== + dependencies: + vary "^1.1.2" + +"@koa/multer@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@koa/multer/-/multer-3.0.0.tgz#439777949f28097d7b329c0b4ce3048074c862f8" + integrity sha512-y+OQBmex5D1jIl723gAEUYcAWPEicIXppaAKw/zCMfpllQ08ZNweDPwoCLxEoatqd5pCu2XG6V8dl67JRq3RJw== + +"@koa/router@^9.4.0": version "9.4.0" resolved "https://registry.npmjs.org/@koa/router/-/router-9.4.0.tgz#734b64c0ae566eb5af752df71e4143edc4748e48" integrity sha512-dOOXgzqaDoHu5qqMEPLKEgLz5CeIA7q8+1W62mCvFVCOqeC71UoTGJ4u1xUSOpIl2J1x2pqrNULkFteUeZW3/A== @@ -2220,6 +3222,36 @@ stringify-entities "^3.0.1" stringify-object "^3.3.0" +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.5" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz#2a0b32fcb416fb3f2250fd24cb2a81421a4f5950" + integrity sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.1" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.4" + tar "^6.1.0" + +"@monaco-editor/loader@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.1.1.tgz#37db648c81a86946d0febd391de00df9c28a0a3d" + integrity sha512-mkT4r4xDjIyOG9o9M6rJDSzEIeonwF80sYErxEvAAL4LncFVdcbNli8Qv6NDqF6nyv6sunuKkDzo4iFjxPL+uQ== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.2.1": + version "4.2.2" + resolved "https://registry.npmjs.org/@monaco-editor/react/-/react-4.2.2.tgz#636e5b8eb9519ef62f475f9a4a50f62ee0c493a8" + integrity sha512-yDDct+f/mZ946tJEXudvmMC8zXDygkELNujpJGjqJ0gS3WePZmS/IwBBsuJ8JyKQQC3Dy/+Ivg1sSpW+UvCv9g== + dependencies: + "@monaco-editor/loader" "^1.1.1" + prop-types "^15.7.2" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2228,11 +3260,32 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#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.stat@^1.1.2": version "1.1.3" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@octokit/auth-token@^2.4.0": version "2.4.5" resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" @@ -2241,18 +3294,18 @@ "@octokit/types" "^6.0.3" "@octokit/endpoint@^6.0.1": - version "6.0.11" - resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" - integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== + version "6.0.12" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== dependencies: "@octokit/types" "^6.0.3" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-6.0.0.tgz#7da8d7d5a72d3282c1a3ff9f951c8133a707480d" - integrity sha512-CnDdK7ivHkBtJYzWzZm7gEkanA7gKH6a09Eguz7flHw//GacPJLmkHA3f3N++MJmlxD1Fl+mB7B32EEpSCwztQ== +"@octokit/openapi-types@^9.5.0": + version "9.7.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz#9897cdefd629cd88af67b8dbe2e5fb19c63426b2" + integrity sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -2267,9 +3320,9 @@ "@octokit/types" "^2.0.1" "@octokit/plugin-request-log@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" - integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + version "1.0.4" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@2.4.0": version "2.4.0" @@ -2288,23 +3341,23 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request-error@^2.0.0": - version "2.0.5" - resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" - integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== +"@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== dependencies: "@octokit/types" "^6.0.3" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.2.0": - version "5.4.15" - resolved "https://registry.npmjs.org/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" - integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== + version "5.6.1" + resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce" + integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ== dependencies: "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.0.0" - "@octokit/types" "^6.7.1" + "@octokit/request-error" "^2.1.0" + "@octokit/types" "^6.16.1" is-plain-object "^5.0.0" node-fetch "^2.6.1" universal-user-agent "^6.0.0" @@ -2338,12 +3391,12 @@ dependencies: "@types/node" ">= 8" -"@octokit/types@^6.0.3", "@octokit/types@^6.7.1": - version "6.13.0" - resolved "https://registry.npmjs.org/@octokit/types/-/types-6.13.0.tgz#779e5b7566c8dde68f2f6273861dd2f0409480d0" - integrity sha512-W2J9qlVIU11jMwKHUp5/rbVUeErqelCsO5vW5PKNb7wAXQVUz87Rc+imjlEvpvbH8yUb+KHmv8NEjVZdsdpyxA== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1": + version "6.25.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz#c8e37e69dbe7ce55ed98ee63f75054e7e808bf1a" + integrity sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q== dependencies: - "@octokit/openapi-types" "^6.0.0" + "@octokit/openapi-types" "^9.5.0" "@opencensus/core@0.0.9": version "0.0.9" @@ -2375,23 +3428,24 @@ "@opencensus/core" "^0.0.8" uuid "^3.2.1" -"@pm2/agent@~1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@pm2/agent/-/agent-1.0.8.tgz#cd15d84dbfc95427e6fccce72bc165b79f1d8579" - integrity sha512-r8mud8BhBz+a2yjlgtk+PBXUR5EQ9UKSJCs232OxfCmuBr1MZw0Mo+Kfog6WJ8OmVk99r1so9yTUK4IyrgGcMQ== +"@pm2/agent@~2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.1.tgz#0edffc54cd8ee2b12f90136264e7880f3f78c79d" + integrity sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw== dependencies: async "~3.2.0" chalk "~3.0.0" dayjs "~1.8.24" debug "~4.3.1" eventemitter2 "~5.0.1" + fast-json-patch "^3.0.0-1" fclone "~1.0.11" nssocket "0.6.0" pm2-axon "~4.0.1" pm2-axon-rpc "~0.7.0" - proxy-agent "~4.0.1" + proxy-agent "~5.0.0" semver "~7.2.0" - ws "~7.2.0" + ws "~7.4.0" "@pm2/io@~5.0.0": version "5.0.0" @@ -2427,6 +3481,23 @@ dependencies: debug "^4.3.1" +"@popperjs/core@^2.5.3": + version "2.9.3" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz#8b68da1ebd7fc603999cf6ebee34a4899a14b88e" + integrity sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ== + +"@qixian.cs/path-to-regexp@^6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@qixian.cs/path-to-regexp/-/path-to-regexp-6.1.0.tgz#6b84ad01596332aba95fa29d2e70104698cd5c45" + integrity sha512-2jIiLiVZB1jnY7IIRQKtoV8Gnr7XIhk4mC88ONGunZE3hYt5IHUG4BE/6+JiTBjjEWQLBeWnZB8hGpppkufiVw== + +"@restart/hooks@^0.3.25": + version "0.3.27" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505" + integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw== + dependencies: + dequal "^2.0.2" + "@rollup/plugin-babel@5.2.1": version "5.2.1" resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz#20fc8f8864dc0eaa1c5578408459606808f72924" @@ -2643,10 +3714,10 @@ dependencies: "@types/node" "*" -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.14" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": + version "7.1.15" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" + integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2655,51 +3726,46 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.3" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.1" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" - integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== + version "7.14.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" -"@types/bcrypt@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.1.tgz#9c767594e31aa1c4ce78d23aa4351984403ca28f" - integrity sha512-SwBrq5wb6jXP0o3O3jStdPWbKpimTImfdFD/OZE3uW+jhGpds/l5wMX9lfYOTDOa5Bod2QmOgo9ln+tMp2XP/w== - "@types/body-parser@*": - version "1.19.0" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + version "1.19.1" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/connect@*": - version "3.4.34" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" - integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/content-disposition@*": - version "0.5.3" - resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" - integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + version "0.5.4" + resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" + integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== "@types/cookiejar@*": version "2.1.2" @@ -2707,24 +3773,24 @@ integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== "@types/cookies@*": - version "0.7.6" - resolved "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504" - integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w== + version "0.7.7" + resolved "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== dependencies: "@types/connect" "*" "@types/express" "*" "@types/keygrip" "*" "@types/node" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/d3-timer@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.1.tgz#ffb6620d290624f3726aa362c0c8a4b44c8d7200" + integrity sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA== "@types/estree@*": - version "0.0.47" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" - integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== + version "0.0.50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/estree@0.0.39": version "0.0.39" @@ -2732,28 +3798,33 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@^4.17.18": - version "4.17.19" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" - integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== + version "4.17.24" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*": - version "4.17.11" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" - integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== + 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/file-saver@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.3.tgz#b734c4f5a04d20615eaed3dc106e2ab321082009" + integrity sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ== + "@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + version "7.1.4" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== dependencies: "@types/minimatch" "*" "@types/node" "*" @@ -2765,27 +3836,52 @@ dependencies: "@types/node" "*" +"@types/gulp-plumber@^0.0.32": + version "0.0.32" + resolved "https://registry.npmjs.org/@types/gulp-plumber/-/gulp-plumber-0.0.32.tgz#81467e0af4592a86239220ba743718c81846fc6a" + integrity sha512-upPVrIjFivRIHS80b6ApIYafvyToiH/AoCR1r2b2ObKrbRY8C2bF+vFwQ72lSu6jLnLIKHkmAW5CWPXczUz3Wg== + dependencies: + "@types/node" "*" + "@types/hast@^2.0.0": - version "2.3.1" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" - integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + version "2.3.2" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.2.tgz#236201acca9e2695e42f713d7dd4f151dc2982e4" + integrity sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow== dependencies: "@types/unist" "*" "@types/history@*": - version "4.7.8" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" - integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== + version "4.7.9" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== + +"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" "@types/http-assert@*": - version "1.5.1" - resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" - integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + version "1.5.2" + resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.2.tgz#a7fb59a7ca366e141789a084555a633801b9af3b" + integrity sha512-Ddzuzv/bB2prZnJKlS1sEYhaeT50wfJjhcTTTQLjEsEZJlk3XB4Xohieyq+P4VXIzg7lrQ1Spd/PfRnBpQsdqA== "@types/http-errors@*": - version "1.8.0" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" - integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + version "1.8.1" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" + integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== + +"@types/invariant@^2.2.31": + version "2.2.35" + resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== + +"@types/isomorphic-fetch@^0.0.35": + version "0.0.35" + resolved "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz#c1c0d402daac324582b6186b91f8905340ea3361" + integrity sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" @@ -2799,43 +3895,44 @@ dependencies: "@types/istanbul-lib-coverage" "*" +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.4": - version "26.0.22" - resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" - integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== +"@types/jest@^27.0.1": + version "27.0.1" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.0.1.tgz#fafcc997da0135865311bb1215ba16dba6bdf4ca" + integrity sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw== dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" + jest-diff "^27.0.0" + pretty-format "^27.0.0" -"@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/js-cookie@^2.2.6": + version "2.2.7" + resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" + integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/keygrip@*": version "1.0.2" resolved "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== -"@types/koa-bodyparser@^4.3.0": - version "4.3.0" - resolved "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#54ecd662c45f3a4fa9de849528de5fc8ab269ba5" - integrity sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA== - dependencies: - "@types/koa" "*" - "@types/koa-compose@*": version "3.2.5" resolved "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" @@ -2843,17 +3940,17 @@ dependencies: "@types/koa" "*" -"@types/koa-mount@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/koa-mount/-/koa-mount-4.0.0.tgz#aa0505763c0d20bf4a16cdec0d9ccd2f4f2d2a86" - integrity sha512-56iBULArwY3uKLl28eRFchZ2v0diEoJzJbDaHH/ehgruF/s2/KMHyWsKcIhvDJ3tGdKu9oZNQvxaMg++1IKFdA== +"@types/koa-mount@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@types/koa-mount/-/koa-mount-4.0.1.tgz#2994be86eaa3d9dc97365e6ebfa227cee3c5f157" + integrity sha512-HNeg80CVS9Dfq8dGYqCZZCAUm7g6jPCNJ1ydqVLEJxLrjmeburpvq+lOZkE4rxBZ6O38dr3tj9IA3IfbdoI05w== dependencies: "@types/koa" "*" -"@types/koa@*", "@types/koa@^2.11.6": - version "2.13.1" - resolved "https://registry.npmjs.org/@types/koa/-/koa-2.13.1.tgz#e29877a6b5ad3744ab1024f6ec75b8cbf6ec45db" - integrity sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q== +"@types/koa@*", "@types/koa@^2.13.1": + version "2.13.4" + resolved "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" + integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== dependencies: "@types/accepts" "*" "@types/content-disposition" "*" @@ -2864,17 +3961,10 @@ "@types/koa-compose" "*" "@types/node" "*" -"@types/koa__router@^8.0.2": - version "8.0.4" - resolved "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.4.tgz#0b754a5e5be3262fc649afc7e93800f30cfc5fe0" - integrity sha512-SXpZy6ICU/bsTZbNhg7QMNUQuNE7ka94zeLPHXhej2QZ09u2tz5S3WlBRB85HLSUosUZFbIRgfrFtu+PSIAUVA== - dependencies: - "@types/koa" "*" - -"@types/lodash@^4.14.158": - version "4.14.168" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" - integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== +"@types/lodash@^4.14.169": + version "4.14.172" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a" + integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== "@types/mathjax@^0.0.36": version "0.0.36" @@ -2882,9 +3972,9 @@ integrity sha512-TqDJc2GWuTqd/m+G/FbNkN+/TF2OCCHvcawmhIrUaZkdVquMdNZmNiNUkupNg9qctorXXkVLVSogZv1DhmgLmg== "@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + version "3.0.7" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz#cba63d0cc11eb1605cea5c0ad76e02684394166b" + integrity sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg== dependencies: "@types/unist" "*" @@ -2894,24 +3984,58 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/minimatch@*": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" - integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + version "3.0.5" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" - integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/mockjs@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@types/mockjs/-/mockjs-1.0.4.tgz#e706951d5e33b4f0a4bb73b1f8b124e26f081de0" + integrity sha512-gK20xPqJhzMIitechVbvfnAk+oBIxVRnWrihJpRYHMI6UHCB/cvWgJa+dy6trRwQLE3AbtAJnXpm7pn6blG8sA== + +"@types/multer@^1.4.5": + version "1.4.7" + resolved "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" + integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + dependencies: + "@types/express" "*" -"@types/node@*", "@types/node@>= 8", "@types/node@^14.0.23", "@types/node@^14.14.28": - version "14.14.39" - resolved "https://registry.npmjs.org/@types/node/-/node-14.14.39.tgz#9ef394d4eb52953d2890e4839393c309aa25d2d1" - integrity sha512-Qipn7rfTxGEDqZiezH+wxqWYR8vcXq5LRpZrETD19Gs4o8LbklbmqotSUsMU+s5G3PJwMRDfNEYoxrcBwIxOuw== +"@types/node-schedule@^1.3.1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-1.3.2.tgz#cc7e32c6795cbadc8de03d0e1f86311727375423" + integrity sha512-Y0CqdAr+lCpArT8CJJjJq4U2v8Bb5e7ru2nV/NhDdaptCMCRdOL3Y7tAhen39HluQMaIKWvPbDuiFBUQpg7Srw== + dependencies: + "@types/node" "*" + +"@types/node-xlsx@^0.15.1": + version "0.15.2" + resolved "https://registry.npmjs.org/@types/node-xlsx/-/node-xlsx-0.15.2.tgz#1371c4af8fe2b6626253f8b85719adfe88355b20" + integrity sha512-rG1SmpWvSkse23rL/5bgej5yQ2y+WoWMrKE3iE4upuHWQwzdLCYEkrwr1pMZDx642R/tJCDGGUig7U/cT24Ecg== + +"@types/node@*", "@types/node@>= 8": + version "16.6.1" + resolved "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz#aee62c7b966f55fc66c7b6dfa1d58db2a616da61" + integrity sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw== + +"@types/node@^12.6.8": + version "12.20.19" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz#538e61fc220f77ae4a4663c3d8c3cb391365c209" + integrity sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw== + +"@types/node@^14.14.28": + version "14.17.9" + resolved "https://registry.npmjs.org/@types/node/-/node-14.17.9.tgz#b97c057e6138adb7b720df2bd0264b03c9f504fd" + integrity sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + 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" @@ -2924,45 +4048,63 @@ integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== "@types/prettier@^2.0.0": - version "2.2.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== + version "2.3.2" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" + integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + version "1.5.5" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/qs@*": - version "6.9.6" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" - integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + 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.3" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + 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-big-calendar@^0.33.1": + version "0.33.1" + resolved "https://registry.npmjs.org/@types/react-big-calendar/-/react-big-calendar-0.33.1.tgz#48463e5b7d27a82dbf5808dea529c03708514b31" + integrity sha512-xX5BaxS+7K62+gtEeg0DqaBInNXDSk2LgkHhbgtqjo/CqwEqB8cwuhIE34XnL33z+pzbn/h7i+0W5fJq0kShdQ== + dependencies: + "@types/prop-types" "*" + "@types/react" "*" + +"@types/react-dom@^16.9.8", "@types/react-dom@^17.0.0", "@types/react-dom@^17.0.3": + version "17.0.9" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + dependencies: + "@types/react" "*" -"@types/react-dom@^16.9.8": - version "16.9.12" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.12.tgz#55cd6b17e73922edb9545e5355a0016c1734e6f4" - integrity sha512-i7NPZZpPte3jtVOoW+eLB7G/jsX5OM6GqQnH+lC0nq0rqwlK0x8WcMEvYDgFWqWhWMlTltTimzdMax6wYfZssA== +"@types/react-helmet@^6.1.0": + version "6.1.3" + resolved "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.3.tgz#1a58b26a79e464c59d3f9cdd5b7ece485335937b" + integrity sha512-U4onVxaZxAp78KpXsfmyCIhLjsvJJ3goG3CYFOo+xW0cPYAz9oe5cBAUSAcN7l35OTbrFvu9TuE0YkcZMKGr4A== dependencies: - "@types/react" "^16" + "@types/react" "*" -"@types/react-dom@^17.0.3": - version "17.0.3" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.3.tgz#7fdf37b8af9d6d40127137865bb3fff8871d7ee1" - integrity sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w== +"@types/react-redux@^7.1.0", "@types/react-redux@^7.1.16": + version "7.1.19" + resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.19.tgz#477bd0a9b01bae6d6bf809418cdfa7d3c16d4c62" + integrity sha512-L37dSCT0aoJnCgpR8Iuginlbxoh7qhWOXiaDqEsxVMrER1CmVhFD+63NxgJeT4pkmEM28oX0NH4S4f+sXHTZjA== dependencies: + "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" -"@types/react-router-config@5.0.2", "@types/react-router-config@^5.0.2": +"@types/react-router-config@5.0.2": version "5.0.2" resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.2.tgz#4d3b52e71ed363a1976a12321e67b09a99ad6d10" integrity sha512-WOSetDV3YPxbkVJAdv/bqExJjmcdCi/vpCJh3NfQOy1X15vHMSiMioXIcGekXDJJYhqGUMDo9e337mh508foAA== @@ -2971,6 +4113,15 @@ "@types/react" "*" "@types/react-router" "*" +"@types/react-router-config@^5.0.2": + version "5.0.3" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.3.tgz#72a53561bcb5e13b82c576527b818fa2579591c7" + integrity sha512-38vpjXic0+E2sIBEKUe+RrCmbc8RqcQhNV8OmU3KUcwgy/yzTeo67MhllP+0zjZWNr7Lhw+RnUkL0hzkf63nUQ== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + "@types/react-router-dom@5.1.7": version "5.1.7" resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz#a126d9ea76079ffbbdb0d9225073eb5797ab7271" @@ -2980,10 +4131,19 @@ "@types/react" "*" "@types/react-router" "*" +"@types/react-router-dom@^5.1.2": + version "5.3.1" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.1.tgz#76700ccce6529413ec723024b71f01fc77a4a980" + integrity sha512-UvyRy73318QI83haXlaMwmklHHzV9hjl3u71MmM6wYNu0hOVk9NLTa0vGukf8zXUqnwz4O06ig876YSPpeK28A== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + "@types/react-router@*": - version "5.1.13" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz#051c0d229bd48ad90558a1db500708127cc512f7" - integrity sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg== + version "5.1.16" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" + integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== dependencies: "@types/history" "*" "@types/react" "*" @@ -2996,19 +4156,10 @@ "@types/history" "*" "@types/react" "*" -"@types/react@*", "@types/react@^17.0.3": - version "17.0.3" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" - integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^16", "@types/react@^16.9.43": - version "16.14.5" - resolved "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz#2c39b5cadefaf4829818f9219e5e093325979f4d" - integrity sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^16.9.43", "@types/react@^17.0.0": + version "17.0.18" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.18.tgz#4109cbbd901be9582e5e39e3d77acd7b66bb7fbe" + integrity sha512-YTLgu7oS5zvSqq49X5Iue5oAbVGhgPc5Au29SJC4VeE17V6gASoOxVkUDy9pXFMRFxCWCD9fLeweNFizo3UzOg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3022,39 +4173,54 @@ "@types/node" "*" "@types/sax@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.1.tgz#e0248be936ece791a82db1a57f3fb5f7c87e8172" - integrity sha512-dqYdvN7Sbw8QT/0Ci5rhjE4/iCMJEM0Y9rHpCu+gGXD9Lwbz28t6HI2yegsB6BoV1sShRMU6lAmAcgRjmFy7LA== + version "1.2.3" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz#b630ac1403ebd7812e0bf9a10de9bf5077afb348" + integrity sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA== dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.1" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + 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-static@*": - version "1.13.9" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e" - integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== + 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/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + "@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== "@types/superagent@*": - version "4.1.10" - resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz#5e2cc721edf58f64fe9b819f326ee74803adee86" - integrity sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g== + version "4.1.12" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.12.tgz#fad68c6712936892ad24cf94f2f7a07cc749fd0f" + integrity sha512-1GQvD6sySQPD6p9EopDFI3f5OogdICl1sU/2ij3Esobz/RtL9fWZZDPmsuv7eiy5ya+XNiPAxUcI3HIUTJa+3A== dependencies: "@types/cookiejar" "*" "@types/node" "*" -"@types/supertest@^2.0.10": +"@types/supertest@^2.0.11": version "2.0.11" resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d" integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== @@ -3062,145 +4228,217 @@ "@types/superagent" "*" "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + 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/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "20.2.1" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.14" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^3.6.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" - integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: - "@typescript-eslint/experimental-utils" "3.10.1" - debug "^4.1.1" + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.9.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz#808d206e2278e809292b5de752a91105da85860b" + integrity sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw== + dependencies: + "@typescript-eslint/experimental-utils" "4.29.1" + "@typescript-eslint/scope-manager" "4.29.1" + debug "^4.3.1" functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.29.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz#0af2b17b0296b60c6b207f11062119fa9c5a8994" + integrity sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.29.1" + "@typescript-eslint/types" "4.29.1" + "@typescript-eslint/typescript-estree" "4.29.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== +"@typescript-eslint/parser@^4.8.2": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz#17dfbb45c9032ffa0fe15881d20fbc2a4bdeb02d" + integrity sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@typescript-eslint/scope-manager" "4.29.1" + "@typescript-eslint/types" "4.29.1" + "@typescript-eslint/typescript-estree" "4.29.1" + debug "^4.3.1" -"@typescript-eslint/parser@^3.6.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== +"@typescript-eslint/scope-manager@4.29.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz#f25da25bc6512812efa2ce5ebd36619d68e61358" + integrity sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "4.29.1" + "@typescript-eslint/visitor-keys" "4.29.1" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== +"@typescript-eslint/types@4.29.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz#94cce6cf7cc83451df03339cda99d326be2feaf5" + integrity sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA== -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== +"@typescript-eslint/typescript-estree@4.29.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz#7b32a25ff8e51f2671ccc6b26cdbee3b1e6c5e7f" + integrity sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw== dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" + "@typescript-eslint/types" "4.29.1" + "@typescript-eslint/visitor-keys" "4.29.1" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/visitor-keys@4.29.1": + version "4.29.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz#0615be8b55721f5e854f3ee99f1a714f2d093e5d" + integrity sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "4.29.1" + eslint-visitor-keys "^2.0.0" + +"@umijs/ast@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/ast/-/ast-3.5.17.tgz#868401050684d1b581c734370a4bab439a1e25d8" + integrity sha512-jVxXXiWUBk+M51nV3mlNynb8yBM9MloTX4LQC4KerBXMG6HLP8aWPJLzH+qXQUWR8Wf2NqeNIMfqQT1XHvyZ0A== + dependencies: + "@umijs/utils" "3.5.17" + +"@umijs/babel-plugin-auto-css-modules@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-auto-css-modules/-/babel-plugin-auto-css-modules-3.5.17.tgz#26f52d54ce2361a8ffa19b54551699ec691ab95c" + integrity sha512-ZEnPUnIxtMvEZCetCVcC5s+Y4ZhNNrP4Bs3YWzu7DJMPEMtBtEFqXxkrWKqEpkhLeAmP7hnFeK+WE84M0wt1hw== + dependencies: + "@umijs/utils" "3.5.17" + +"@umijs/babel-plugin-auto-css-modules@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-auto-css-modules/-/babel-plugin-auto-css-modules-3.5.20.tgz#5f423cebe0deab2c108949d71c4694c0788348b9" + integrity sha512-mN/ueXm7KHCmrfK8nluPqx3JGNftNj/wWPUKpcDiheagVNz+PJ++aIFI9ikfqK8ukHVVBisWltEJwOrDM8QUdQ== + dependencies: + "@umijs/utils" "3.5.20" -"@umijs/ast@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/ast/-/ast-3.4.8.tgz#90c3748181b870263f6c51c05866ae79d187fa5e" - integrity sha512-3JAAdrZXcE78rODzhoK9yABlJK59DGscx3c0iNwbvdK0ylyYgmb7+Qm9dbEQn4kYeKX5ximV4CD5X8IljzicIA== +"@umijs/babel-plugin-import-to-await-require@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-import-to-await-require/-/babel-plugin-import-to-await-require-3.5.17.tgz#5bf819c46996380300bb07bb92c7996c99fb741e" + integrity sha512-wquowE9if0DMm2d7U0mxkZgEVry7d9d9cMteeRmbVoNTgXCPlSqVDkP9fFzblgR+ZlsjmqJnD4omAqAWslVO6A== dependencies: - "@umijs/utils" "3.4.8" + "@umijs/utils" "3.5.17" -"@umijs/babel-plugin-auto-css-modules@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/babel-plugin-auto-css-modules/-/babel-plugin-auto-css-modules-3.4.8.tgz#941f97f15ebb09ffc48aa53cbe57bd55e443529b" - integrity sha512-TQkIQHPPVEJR2OdEiCv+OQDKLV6bYNOkvvlmTuqQ5eDvruOrvJ4Rb5dmwrwXphUhwxkS3S92vgBYMDFVVCT27A== +"@umijs/babel-plugin-import-to-await-require@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-import-to-await-require/-/babel-plugin-import-to-await-require-3.5.20.tgz#1947f0533703d8dfd7442a383020621e7e871667" + integrity sha512-cZma+jLAQ0FeHpezTYJLELSyKMMtrYNIjFeTLxDT6Pw5Z1Ei3cJHf8ERYV4kDBzu/rvuUFx1AC5UPGwYmqsVxw== + dependencies: + "@umijs/utils" "3.5.20" -"@umijs/babel-plugin-import-to-await-require@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/babel-plugin-import-to-await-require/-/babel-plugin-import-to-await-require-3.4.8.tgz#3dc7678b508c204ff753bc24b26118bd795d2feb" - integrity sha512-sLxNW7MKdXOcKsdSF1RLyk9+cpt59zvdVN2uSRyChXf/KpwoHcSEgNi5E77I/ehLDnZumKzl1HDL9ifSWXDhkw== +"@umijs/babel-plugin-lock-core-js-3@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-lock-core-js-3/-/babel-plugin-lock-core-js-3-3.5.17.tgz#488c40045347675fd621c17c10ef774940129c0a" + integrity sha512-kOlKk3zQWAnnP/R5gXzpPWimgavQ4OwMeDJPuUacve46eXqWjC2ZNWXhfcoXN9FKcjDWovJdEW/mpjmT+BeCdg== dependencies: - "@umijs/utils" "3.4.8" + "@umijs/utils" "3.5.17" + core-js "3.6.5" -"@umijs/babel-plugin-lock-core-js-3@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/babel-plugin-lock-core-js-3/-/babel-plugin-lock-core-js-3-3.4.8.tgz#ca2ff9b39961f8c8ffee16ca1f327855cf49e7aa" - integrity sha512-XsurU0oKwlTa34PAOPfJouKVZklHU7TBt/AJOj9JB+7ulGZnqTl+OL7Tlxw5sUs4USJTS4PBhnyng9i46nI2DQ== +"@umijs/babel-plugin-lock-core-js-3@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-lock-core-js-3/-/babel-plugin-lock-core-js-3-3.5.20.tgz#a0bd894b953a0820f6883aa863170ceae3fbc8a7" + integrity sha512-bbyg0QLSeNXVrnFZIx2TgOalDUMBPVIHtR6G7aeBmSsiUSFRwsCNprjc/NPEBwOFG10J4XmJFETzcgig3hKLoA== dependencies: - "@umijs/utils" "3.4.8" + "@umijs/utils" "3.5.20" core-js "3.6.5" -"@umijs/babel-plugin-no-anonymous-default-export@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/babel-plugin-no-anonymous-default-export/-/babel-plugin-no-anonymous-default-export-3.4.8.tgz#de5500557d7e3efde607cbf503b09871a41981b9" - integrity sha512-ZqfedGneKcxAcZLCsC4W4lDjcZoy2qJVDqsjQBFUj+Txwq2BTwRFBWnsxCdKnBw3dQ4jYuAiG57idhpsCy4v2w== +"@umijs/babel-plugin-no-anonymous-default-export@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-no-anonymous-default-export/-/babel-plugin-no-anonymous-default-export-3.5.17.tgz#32b03b34f7741753856ef5be3eb693884fee724e" + integrity sha512-xHAyg/mYq806Xl832qEHKdA0qdSzwIUDN0pypbrh1bYgueoxodkjtOz0Erh1up33WV1/6xbGl9lXBVlmsfK+Vw== + dependencies: + "@umijs/utils" "3.5.17" + +"@umijs/babel-plugin-no-anonymous-default-export@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/babel-plugin-no-anonymous-default-export/-/babel-plugin-no-anonymous-default-export-3.5.20.tgz#f1eb524fa433d0fa19590715fec70dd79b51b25d" + integrity sha512-ufM+mcDrRJMTWWqP/C73NLqeW7CrgxrXlSKnmJ+CCNTT1GPex5+5Ou2IM6HLqXukm+7W+xdDepMEWrYGmdGQRg== + dependencies: + "@umijs/utils" "3.5.20" + +"@umijs/babel-preset-umi@3.5.17", "@umijs/babel-preset-umi@3.x": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/babel-preset-umi/-/babel-preset-umi-3.5.17.tgz#0ae3b896d3426d53f766c3e65f73e566de521745" + integrity sha512-TYEqmafIKiTSfDTw6xSXnFGai9FdqHq2zAzMSrYNC8fcmdqecXVg82VAzsujrHpwDpioBeB6YlECnsDmZZre7A== dependencies: - "@umijs/utils" "3.4.8" + "@babel/runtime" "7.12.5" + "@umijs/babel-plugin-auto-css-modules" "3.5.17" + "@umijs/babel-plugin-import-to-await-require" "3.5.17" + "@umijs/babel-plugin-lock-core-js-3" "3.5.17" + "@umijs/babel-plugin-no-anonymous-default-export" "3.5.17" + "@umijs/deps" "3.5.17" -"@umijs/babel-preset-umi@3.4.8", "@umijs/babel-preset-umi@3.x": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/babel-preset-umi/-/babel-preset-umi-3.4.8.tgz#45f9ae1de109145f17206e7ea96a0075da8849e0" - integrity sha512-ZIWOOplileF8nfTMb1PlZW9w22HcYW0kYX9DdyPFTglV2jAXHkipEUSLlMRhJCLhdNMlmQaiRg50jfoTF33ZmQ== +"@umijs/babel-preset-umi@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/babel-preset-umi/-/babel-preset-umi-3.5.20.tgz#722c41b64b5656e46be36a569da0a1e95c50e10e" + integrity sha512-EBvLi2aVkIiKAGmdDXkyx/pW4OJXqxvnSz54Za9r+kVZMbG5kT50ieqMk9yciNa+1JzHGiY+XZl0f0YF9pStAg== dependencies: "@babel/runtime" "7.12.5" - "@umijs/babel-plugin-auto-css-modules" "3.4.8" - "@umijs/babel-plugin-import-to-await-require" "3.4.8" - "@umijs/babel-plugin-lock-core-js-3" "3.4.8" - "@umijs/babel-plugin-no-anonymous-default-export" "3.4.8" - -"@umijs/bundler-utils@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/bundler-utils/-/bundler-utils-3.4.8.tgz#5f3746e84c2cb9061606e672fc8d3cd2fd55178a" - integrity sha512-R1iIOO3PeGiPaFF5yZ9E9KMn6vXH41b80saWjcAS2nTzb2edo4+HGZSdTYK8SbLHzQQzcaoGy9AUTi2bMDtAtw== - dependencies: - "@umijs/babel-preset-umi" "3.4.8" - "@umijs/types" "3.4.8" - "@umijs/utils" "3.4.8" - -"@umijs/bundler-webpack@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/bundler-webpack/-/bundler-webpack-3.4.8.tgz#8cc50d948d5b346e0f4cb8fe74329b4fa09acc7a" - integrity sha512-u5/or/rD1/yl2N7pFTbDfoOlYKOKpq67Pyy6hjxOJ6zvo+T3Ntc2iBGDtJ27KBSfhNyYULEaTkHSg7Q7yLM0Eg== - dependencies: - "@umijs/bundler-utils" "3.4.8" - "@umijs/deps" "0.8.1" - "@umijs/types" "3.4.8" - "@umijs/utils" "3.4.8" + "@umijs/babel-plugin-auto-css-modules" "3.5.20" + "@umijs/babel-plugin-import-to-await-require" "3.5.20" + "@umijs/babel-plugin-lock-core-js-3" "3.5.20" + "@umijs/babel-plugin-no-anonymous-default-export" "3.5.20" + "@umijs/deps" "3.5.20" + +"@umijs/bundler-utils@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/bundler-utils/-/bundler-utils-3.5.17.tgz#3d893cf5be78f0e2b1d9ea038d7131160ecc062f" + integrity sha512-+E6lc8ofD5skXWlvp/N689m4QVIUNveBt/vekqgFUB+DIaJCcLz3Qbme/L/sFNWr5hW8Fxt6ygSr9FCS/tQ5EQ== + dependencies: + "@umijs/babel-preset-umi" "3.5.17" + "@umijs/types" "3.5.17" + "@umijs/utils" "3.5.17" + +"@umijs/bundler-webpack@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/bundler-webpack/-/bundler-webpack-3.5.17.tgz#7260f54c1260e6a6a2e392d3106e6e48526a97d9" + integrity sha512-4RoKUHiC4WSb8T32lVzrP7gMc+qpoEazNbsA7yVEzCd+gHTVLgo/7olhCT8MlXceARy6ngWOs3LFvQa6k+Bo7Q== + dependencies: + "@umijs/bundler-utils" "3.5.17" + "@umijs/deps" "3.5.17" + "@umijs/types" "3.5.17" + "@umijs/utils" "3.5.17" jest-worker "26.6.2" node-libs-browser "2.2.1" normalize-url "1.9.1" @@ -3212,67 +4450,166 @@ terser "5.6.0" webpack-chain "6.5.1" -"@umijs/core@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/core/-/core-3.4.8.tgz#72f6a45f6a9dbf9d988698246fb9a07d739ef529" - integrity sha512-UQY1VrAUQBGYjXMFsFou0TBBWrhlhPXYcgAM/2RSD10RZhTynoTiwAmkwDGU2R0gTtsf4GJO+3sDO4Qng2PbQw== +"@umijs/core@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/core/-/core-3.5.17.tgz#711fb93478f80172922b1842df6b0416f1f1f6aa" + integrity sha512-/rMHskbv5nBGH2/Olva0OQ4zSf7SajQhAYTQGaeVQ7RElXledjoUMr0ug9pIdktGyqGLJe/H6MlaKbwn+l0LLA== dependencies: - "@umijs/ast" "3.4.8" - "@umijs/babel-preset-umi" "3.4.8" - "@umijs/deps" "0.8.1" - "@umijs/utils" "3.4.8" + "@umijs/ast" "3.5.17" + "@umijs/babel-preset-umi" "3.5.17" + "@umijs/deps" "3.5.17" + "@umijs/utils" "3.5.17" -"@umijs/deps@0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@umijs/deps/-/deps-0.8.1.tgz#b20f9b3b2cf67ba85306e2c1f6c720c687c5ce95" - integrity sha512-BfvWUblKdBzSyTWiX4Z4SmCu7yno5ypJquSx05ruPnZ9ZTxZIs4g+9Z3ow4yIvCBK/fFbRcBs4Os4fIPW3kmhg== +"@umijs/deps@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/deps/-/deps-3.5.17.tgz#028296a424f1b7a6027a31f3224386c6f9b7d94c" + integrity sha512-NfVX6ppd0wCBJhhz9US68UU0hrUgBj6n7zlFhaSejx1La6cZ0pGNx7WklDsSKHfaSLrYiFteLonR0pTbglwhpw== + dependencies: + "@bloomberg/record-tuple-polyfill" "0.0.3" + chokidar "3.5.1" + clipboardy "2.3.0" + esbuild "0.12.15" + jest-worker "24.9.0" + prettier "2.2.1" + +"@umijs/deps@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/deps/-/deps-3.5.20.tgz#002ad616fbe5c8b238f80fc9289d0aceb9b89c3c" + integrity sha512-75iqB0+ITFtxlLb945W2b6lVEgLWRFXaSQZD+wH6c4/WDiagOdYMWX9aiPs2JSzoM/yCtKpMaLeGbmVXsb7y4g== dependencies: "@bloomberg/record-tuple-polyfill" "0.0.3" chokidar "3.5.1" clipboardy "2.3.0" + esbuild "0.12.15" jest-worker "24.9.0" prettier "2.2.1" -"@umijs/plugin-analytics@^0.2.2": +"@umijs/plugin-access@2.4.2": + version "2.4.2" + resolved "https://registry.npmjs.org/@umijs/plugin-access/-/plugin-access-2.4.2.tgz#0bc4b63d9dc0a2a04a303a352556721c891a8b30" + integrity sha512-cP00Uh2kDEAgvQ/PwiR9d09js5x0k1PDvHqXN6B/kFt/Tz3u2C4yPy71d2C7KLWDIm1HTsWcoQtIqvJZwLmLJQ== + +"@umijs/plugin-analytics@0.2.2", "@umijs/plugin-analytics@^0.2.2": version "0.2.2" resolved "https://registry.npmjs.org/@umijs/plugin-analytics/-/plugin-analytics-0.2.2.tgz#575fd231d4327ea13413217aa1b5fc6bdd89465e" integrity sha512-dVDzUfgIdEwdCC6a5IsMYpIPI+bEZjBEqIhAvw9dic6Vk77w9RxQxyRfW11dDmdXLAwWphp22NntQNt1ejZPtg== -"@umijs/plugin-antd@^0.9.1": - version "0.9.1" - resolved "https://registry.npmjs.org/@umijs/plugin-antd/-/plugin-antd-0.9.1.tgz#a5a146a80879565b59cc2dd33d7b158685cf2bb2" - integrity sha512-MG+RifLIovPRvf5qPUfTIRqkiq1QBaKCE/pP3mM72DwAkDh6ZXn8oql/8tqFR3k1+m3XUbDEiOCH+Zx+eNiFew== +"@umijs/plugin-antd@0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@umijs/plugin-antd/-/plugin-antd-0.11.0.tgz#f2f952bd433607847f1b73cd42a0780bb7e2f04d" + integrity sha512-zpBSVMlU2z7PpYeDLhorgG1sXWyzus0t+g75wZVJqLIXKdQDjJZRTbKPwLnCYdmgh/MUYAEJmT39IHfnF1MQ5A== dependencies: antd "^4.1.3" antd-mobile "^2.3.1" -"@umijs/preset-built-in@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/preset-built-in/-/preset-built-in-3.4.8.tgz#76e297094f34cbeedbd7148f0fbd661104ee1a3d" - integrity sha512-/Fzmh9FwNA0PMKwFN20VhhHkOUqzfeX0imNaigGjqC72AF36sLkGLk9IbT5dqdEsC0OJSs+1rpk7n8fWoqf95A== +"@umijs/plugin-crossorigin@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@umijs/plugin-crossorigin/-/plugin-crossorigin-1.2.1.tgz#c210375392dc020ad201b9b0ab5a49234e24e6d3" + integrity sha512-4oXNFBLOCH1FHTgFi7EDmlcjjYMthOQlrTT+mSbNeMzvl0P/WKldSJsYAUXUTg+I7vlbb5bNby4dpHKK37JcbQ== + +"@umijs/plugin-dva@0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@umijs/plugin-dva/-/plugin-dva-0.13.0.tgz#aa8cf9982cfb5b8d5fcb59c3915cca866dc37dab" + integrity sha512-cpGq8vzN8AmyWxexWLQ+WGqfT0WMCiryvU5EcNGbx1/Ub9aICUfPBpB46cxJrxjDCjUzuVslRNb2pdgI0xXUXg== + dependencies: + babel-plugin-dva-hmr "^0.4.2" + dva "^2.6.0-beta.20" + dva-immer "^0.5.2" + dva-loading "^3.0.20" + +"@umijs/plugin-helmet@1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@umijs/plugin-helmet/-/plugin-helmet-1.1.3.tgz#d66e257fa90d6c20f56b6d744a746d3f3e40a880" + integrity sha512-X4GRFlvOb8DxMDm1vExfpWOvxl6bp0oZz114DyhwnMSriJ8RcHAigTjtVJHYxJpKv7P6KayN3n13J4w/XZGWMg== + dependencies: + "@types/react-helmet" "^6.1.0" + react-helmet "^6.1.0" + +"@umijs/plugin-initial-state@2.4.0": + version "2.4.0" + resolved "https://registry.npmjs.org/@umijs/plugin-initial-state/-/plugin-initial-state-2.4.0.tgz#a6759082f2bdd0aeb278ae95b2e4b562a061aed6" + integrity sha512-UHH5fTL9skm4771R3xvWCrjd5xiQ7OdJ83G0P1YZLhuNbh0cAFVT8SPTU8dA9o8TTAZ66IEq7axhWl1cGxVsXw== + +"@umijs/plugin-layout@0.17.2": + version "0.17.2" + resolved "https://registry.npmjs.org/@umijs/plugin-layout/-/plugin-layout-0.17.2.tgz#e41a52600ff1f6dba778270e9d2a5a6cab02bd12" + integrity sha512-HtUl23P8+A2xtDQ9sRALSvIydeItrTG5ByO+geVzs602ME+eX9JpW2im7pe7eM39eXAP1IvkGP75pntHSJuFYw== + dependencies: + "@umijs/route-utils" "^1.0.7" + antd "^4.1.2" + lodash "^4.17.15" + path-to-regexp "1.x" + +"@umijs/plugin-locale@0.14.2": + version "0.14.2" + resolved "https://registry.npmjs.org/@umijs/plugin-locale/-/plugin-locale-0.14.2.tgz#f0db90fd521e346dc5765dee46b1416d0c560b32" + integrity sha512-/RdXQYNofN41/lU61YBcDo2vsxcIPWOFGVOGqC8aZ78FqCRdcNkqbHc5YQGd5Zy8m2GWudv7qTEdL7i5j1xYWQ== + dependencies: + "@ant-design/icons" "^4.1.0" + "@formatjs/intl-pluralrules" "^1.5.0" + "@formatjs/intl-relativetimeformat" "^4.5.7" + intl "1.2.5" + moment "^2.29.1" + react-intl "3.12.1" + warning "^4.0.3" + +"@umijs/plugin-model@2.6.1": + version "2.6.1" + resolved "https://registry.npmjs.org/@umijs/plugin-model/-/plugin-model-2.6.1.tgz#494be2449989baa08b0b382c09122ffa0e2374af" + integrity sha512-gu4HroKaGnqk848Iew0ojGY7vPAVmrVH7jhtAZHoHKQdpPZv6a20sukasmMmEBXXNflLrESeU+3JayeZUNuHeA== + dependencies: + fast-deep-equal "3.1.1" + +"@umijs/plugin-request@2.8.0": + version "2.8.0" + resolved "https://registry.npmjs.org/@umijs/plugin-request/-/plugin-request-2.8.0.tgz#f2ac21a1e39e6a2f94b42f1b348a4b480b355139" + integrity sha512-bwJg0rFbMZcizO+fHbSNz6X/U6suR84ciLIo9zLtRMuradx/yanMnz+ckh2dlZvTlGYrckkJwWgoSFxWlU8yyA== + dependencies: + "@ahooksjs/use-request" "^2.0.0" + umi-request "^1.2.14" + +"@umijs/plugin-test@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@umijs/plugin-test/-/plugin-test-1.0.2.tgz#df67c7b6e31bf4df4e2857d04a103046e557143d" + integrity sha512-EIV86Xmw/Cn8vRLXha+ct0PfY6gRRKov5lanvt1B2L5t6xAqnTd03AxmB7i1Go9vDcFxDBheuDf/nyGiT/xTFw== + dependencies: + "@umijs/test" "~3.5.14" + +"@umijs/preset-built-in@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/preset-built-in/-/preset-built-in-3.5.17.tgz#a8bcbe24805b1ee2556542666105d280ef4035c3" + integrity sha512-gdrAGcL3/TDKS9Egr8bwXXu6niWrFIO7n+OKC7ZR/3eAXVFbFVL0X0d/LJLUdcua+yInLcKczK5T3tQsBzmCkw== dependencies: "@types/react-router-config" "5.0.2" - "@umijs/babel-preset-umi" "3.4.8" - "@umijs/bundler-webpack" "3.4.8" - "@umijs/deps" "0.8.1" - "@umijs/renderer-mpa" "3.4.8" - "@umijs/renderer-react" "3.4.8" - "@umijs/runtime" "3.4.8" - "@umijs/server" "3.4.8" - "@umijs/types" "3.4.8" - "@umijs/utils" "3.4.8" + "@umijs/babel-preset-umi" "3.5.17" + "@umijs/bundler-webpack" "3.5.17" + "@umijs/deps" "3.5.17" + "@umijs/renderer-mpa" "3.5.17" + "@umijs/renderer-react" "3.5.17" + "@umijs/runtime" "3.5.17" + "@umijs/server" "3.5.17" + "@umijs/types" "3.5.17" + "@umijs/utils" "3.5.17" + ansi-html "^0.0.7" + core-js "3.6.5" + core-js-pure "^3.8.1" + error-stack-parser "^2.0.6" + es-module-lexer "0.7.1" es5-imcompatible-versions "^0.1.62" history-with-query "4.10.4" - react-refresh "0.9.0" + html-entities "^2.1.0" + mime "1.3.6" + react-refresh "0.10.0" react-router "5.2.0" react-router-config "5.1.1" react-router-dom "5.2.0" regenerator-runtime "0.13.5" + schema-utils "^3.0.0" -"@umijs/preset-dumi@1.1.13": - version "1.1.13" - resolved "https://registry.npmjs.org/@umijs/preset-dumi/-/preset-dumi-1.1.13.tgz#c21d33144b351c65558a90d6c054d12c0a16d184" - integrity sha512-WjSH5MIWDNo4Apg2NOm+0kCbmqrIWCJWGb7WheSb95ETYHBPiYgLIYHUyPrVCTlZKkG2x6NdxneShC/qlF4nKg== +"@umijs/preset-dumi@1.1.25": + version "1.1.25" + resolved "https://registry.npmjs.org/@umijs/preset-dumi/-/preset-dumi-1.1.25.tgz#82526450e096a9f500d6945a12b774ca2ee10eb7" + integrity sha512-WbQSPVWutgvwmU9GCVVaZ/Z8+Plbosxv+hzIY+gI63oQ8JOZdXTLVroTQqy2YyKzT7oVBXWpIllVxKU5YIsqeA== dependencies: "@babel/core" "^7.7.2" "@babel/generator" "^7.7.2" @@ -3288,7 +4625,7 @@ copy-text-to-clipboard "^2.2.0" deepmerge "^4.2.2" dumi-assets-types "1.0.0" - dumi-theme-default "1.0.13" + dumi-theme-default "1.1.8" enhanced-resolve "^4.1.1" github-slugger "^1.3.0" hast-util-has-property "^1.0.4" @@ -3297,9 +4634,10 @@ hast-util-to-html "^7.1.1" hast-util-to-string "^1.0.2" hosted-git-info "^3.0.2" + ignore "^5.1.8" js-yaml "^3.13.1" lz-string "^1.4.4" - react-docgen-typescript "^1.20.5" + react-docgen-typescript-dumi-tmp "^1.22.1-0" rehype-autolink-headings "^4.0.0" rehype-mathjax "^3.1.0" rehype-remove-comments "^4.0.2" @@ -3317,30 +4655,58 @@ unist-util-visit "^2.0.1" unist-util-visit-parents "^3.0.1" -"@umijs/renderer-mpa@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/renderer-mpa/-/renderer-mpa-3.4.8.tgz#e00f77f976c0406dd0b213d8b75841fbc154d8c0" - integrity sha512-E7GrzFPtXXoAoR0R4Xqt3ztFL+VIfv+a4ammFdouxxWkONnmZ+ede+V2TEzEK3+89Eu2eryWqmx5rIKu1aWaUg== +"@umijs/preset-react@^1.8.24": + version "1.8.24" + resolved "https://registry.npmjs.org/@umijs/preset-react/-/preset-react-1.8.24.tgz#42eb5b1f2a061981972954aa8446d4d1e830ca14" + integrity sha512-xi0HfbgQC9TAYHXRTEiKQMiYczXg64W8ccsmkHc0SIkbCBYUfxxy3rAGABp98RlGZ2PrmQqcoHmkITBOOF0T3w== + dependencies: + "@umijs/plugin-access" "2.4.2" + "@umijs/plugin-analytics" "0.2.2" + "@umijs/plugin-antd" "0.11.0" + "@umijs/plugin-crossorigin" "1.2.1" + "@umijs/plugin-dva" "0.13.0" + "@umijs/plugin-helmet" "1.1.3" + "@umijs/plugin-initial-state" "2.4.0" + "@umijs/plugin-layout" "0.17.2" + "@umijs/plugin-locale" "0.14.2" + "@umijs/plugin-model" "2.6.1" + "@umijs/plugin-request" "2.8.0" + "@umijs/plugin-test" "1.0.2" + +"@umijs/renderer-mpa@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/renderer-mpa/-/renderer-mpa-3.5.17.tgz#5f9ca959f71cb511448d0d5fcb52fd381283e2ae" + integrity sha512-wrL38YZn0meIT6BapJFlPBm5r5nGPW3z74v2fVnLI7kzTolzpU5SzLEbF4bDSDVgnpZ0bvJNCK2PSbOcWOQpog== dependencies: "@types/react" "^16.9.43" "@types/react-dom" "^16.9.8" - "@umijs/runtime" "3.4.8" + "@umijs/runtime" "3.5.17" -"@umijs/renderer-react@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/renderer-react/-/renderer-react-3.4.8.tgz#848365fb3010dc53ae89d17cfcef9e7f2374b8ba" - integrity sha512-kMnxOHGCWmpLG464uYCvRshH7R5XvdkjA/1kKGM9y3xUDxK3dm7pV8I+LXZFrTGykH2fI/EShhFaRRDLjwWNUw== +"@umijs/renderer-react@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/renderer-react/-/renderer-react-3.5.17.tgz#2330a63c6566db4359ec2ea2a3ad66a829500bd9" + integrity sha512-IoHPF8bIQwkRqNcOrpdymreOAJJgAbxdUzk6wjUi5sqt+CDvzG6vcneD1MublDlGnMyYSR+FlL2Kj7lKMTDv0A== dependencies: "@types/react" "^16.9.43" "@types/react-dom" "^16.9.8" "@types/react-router-config" "^5.0.2" - "@umijs/runtime" "3.4.8" + "@umijs/runtime" "3.5.17" react-router-config "5.1.1" -"@umijs/runtime@3.4.8", "@umijs/runtime@^3.2.14": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/runtime/-/runtime-3.4.8.tgz#e0de30a6924e8a4fd24db2c532df6222f4318f82" - integrity sha512-MhPL8Rx2HS9ruBrJr1lFjQ5hm2mweQ0cNUZNs5jMZnm8s3v4SpCOlGJFVA3J4OyW1IsD8mAgsSfT7RvD6eh1Kg== +"@umijs/route-utils@^1.0.7": + version "1.0.37" + resolved "https://registry.npmjs.org/@umijs/route-utils/-/route-utils-1.0.37.tgz#1ceb516980d4754ce2d5959878fe72259091a990" + integrity sha512-RQYMYd0w3mKWlCvhUqYN2/dcCD8LxQWsr46DXpaLtqe2Y/8662qXA3E6moaFpyfokKJK6UHt2VxNGhkKPNJIgQ== + dependencies: + "@qixian.cs/path-to-regexp" "^6.1.0" + fast-deep-equal "^3.1.3" + lodash.isequal "^4.5.0" + memoize-one "^5.1.1" + +"@umijs/runtime@3.5.17", "@umijs/runtime@^3.2.14": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/runtime/-/runtime-3.5.17.tgz#90be6f257029a525f34472eaf68162dc140d75f9" + integrity sha512-IYTSa40GEuFqRNJ0o9q9jC5UdW0tY+XU/MVRY5gGmr0AmQf+4VDpBq33Ql+KyruiNaCCKmNC2I15Kd6+lw3XGA== dependencies: "@types/react-router" "5.1.12" "@types/react-router-dom" "5.1.7" @@ -3349,32 +4715,58 @@ react-router-dom "5.2.0" use-subscription "1.5.1" -"@umijs/server@3.4.8": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/server/-/server-3.4.8.tgz#3a43083c0320861d847a0a13b6612336626888a9" - integrity sha512-I/NrWamzxgoxm4DTkKC64HYnOQnZqxSsDaBXUHm/aJSv9mKfLU2wUQpG7LC8Za6tlGL9zq5Kq/oiNpuUdxss6Q== +"@umijs/server@3.5.17": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/server/-/server-3.5.17.tgz#ea5633627da72c25f40051cfef3a93850f3ecfdb" + integrity sha512-8uI7Q/EP3cCeI0mP8dzzPe5d0LMZ0mmxhbCr+Ql9u+2gD2/YrCxzsP3l5iHoF5f+3G9AF+ziCAmj4l2dJPTNTQ== + dependencies: + "@umijs/deps" "3.5.17" + "@umijs/utils" "3.5.17" + +"@umijs/test@~3.5.14": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/test/-/test-3.5.20.tgz#124ee8dd614b56b7774afa3f5dd8df5167de3d8a" + integrity sha512-nxDdKDJYPMgYCEugvbyXbFjwNF/RL+TOLsBUmWzmciiz6PWVghJXrkSkDu2Ii5XO88G7l4xPo4cmReCWBw5I3A== dependencies: - "@umijs/deps" "0.8.1" - "@umijs/utils" "3.4.8" + "@babel/core" "7.12.10" + "@umijs/babel-preset-umi" "3.5.20" + "@umijs/utils" "3.5.20" + babel-core "7.0.0-bridge.0" + babel-jest "^26.6.3" + core-js "3.8.2" + identity-obj-proxy "3.0.0" + jest "^26.6.3" + jest-cli "^26.6.3" + jest-environment-jsdom-fourteen "1.0.1" + regenerator-runtime "^0.13.7" + whatwg-fetch "^3.5.0" + +"@umijs/types@3.5.17", "@umijs/types@3.x": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/types/-/types-3.5.17.tgz#277c3f5371c71569ca12a309931664397beaf054" + integrity sha512-vMLU0/mosQb7zvYhBNXYgcKVlqcbky1e/iQSoDPhuSu2RRK6eR2IECSRyDkvPP8F1lI5UFOzjbt3ogpc0pT7xQ== + dependencies: + "@umijs/babel-preset-umi" "3.5.17" + "@umijs/core" "3.5.17" + "@umijs/deps" "3.5.17" + "@umijs/renderer-react" "3.5.17" + "@umijs/server" "3.5.17" + "@umijs/utils" "3.5.17" + webpack-chain "6.5.1" -"@umijs/types@3.4.8", "@umijs/types@3.x": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/types/-/types-3.4.8.tgz#102ceb5289578dde451d073ab63dc753f98420f8" - integrity sha512-YYbbCtay8GFEnXyEcBAgqIDfLYFnF7VVLVnKXNAO+Y3Tsh0NZIrMyiqpZIj5AMwl77C0BcC1xnI1T4b96LcXzw== +"@umijs/utils@3.5.17", "@umijs/utils@^3.2.28": + version "3.5.17" + resolved "https://registry.npmjs.org/@umijs/utils/-/utils-3.5.17.tgz#74cee75d62be2828545e25b40df20af7f8959d2c" + integrity sha512-YydSzvl7j4AWgW5lkHDoXxKjIVA940fmdi6IavXRXGkWat4cLZAQZ7ERCCrmW7wSznLwOvzicsQbLTLK8OeO0w== dependencies: - "@umijs/babel-preset-umi" "3.4.8" - "@umijs/core" "3.4.8" - "@umijs/deps" "0.8.1" - "@umijs/server" "3.4.8" - "@umijs/utils" "3.4.8" - webpack-chain "6.5.1" + "@umijs/deps" "3.5.17" -"@umijs/utils@3.4.8", "@umijs/utils@^3.2.28": - version "3.4.8" - resolved "https://registry.npmjs.org/@umijs/utils/-/utils-3.4.8.tgz#770604486a06e9099eba42d4e020176daf9f7480" - integrity sha512-ewVj7M+B3WCRv7yqBBmN/JiiA/copH0cU7uGwIrnfytX86wjyjgq54LJ1Yj9bpw9axbOB+qaU2x+arfU6LLLag== +"@umijs/utils@3.5.20": + version "3.5.20" + resolved "https://registry.npmjs.org/@umijs/utils/-/utils-3.5.20.tgz#45e89eeac734a3963205d55b0f533bd96492f3b9" + integrity sha512-Y0i27zZTCKoqdHHyTuebO/GOIY4gGLUwDFs1eoH+m4etPn+uRq0iax9KJOkelmax2K3YLsT4KbRwM1enlSsv3A== dependencies: - "@umijs/deps" "0.8.1" + "@umijs/deps" "3.5.20" "@zkochan/cmd-shim@^3.1.0": version "3.1.0" @@ -3393,7 +4785,7 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.3, abab@^2.0.5: +abab@^2.0.0, abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== @@ -3431,6 +4823,14 @@ accord@^0.29.0: uglify-js "^2.8.22" when "^3.7.8" +acorn-globals@^4.1.0, acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3440,24 +4840,39 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn@5.X, acorn@^5.0.3, acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5: + version "6.4.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.1.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" - integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== +acorn@^8.2.4: + version "8.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== add-dom-event-listener@^1.1.0: version "1.1.0" @@ -3466,6 +4881,19 @@ add-dom-event-listener@^1.1.0: dependencies: object-assign "4.x" +address@>=0.0.1, address@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -3473,7 +4901,7 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -agent-base@6, agent-base@^6.0.0: +agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -3494,20 +4922,43 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== +ahooks@^2.10.2: + version "2.10.9" + resolved "https://registry.npmjs.org/ahooks/-/ahooks-2.10.9.tgz#531fa1c11bfa1a2aa2697a051ac499147a3a7e0a" + integrity sha512-TS6IQ5dfnOj6N5JktB5P2NTtPYA+IAsOP6AvfYMuD/HcgaNGI/5H5DXDQ1F6ev4/gx9kSrUEE3P9g8W75zftXQ== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" + "@ahooksjs/use-request" "^2.8.10" + "@types/js-cookie" "^2.2.6" + dayjs "^1.9.1" + intersection-observer "^0.7.0" + js-cookie "^2.2.1" + lodash.debounce "^4.0.8" + lodash.isequal "^4.5.0" + lodash.throttle "^4.1.1" + resize-observer-polyfill "^1.5.1" + screenfull "^5.0.0" + +airbnb-prop-types@^2.16.0: + version "2.16.0" + resolved "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" + integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg== + dependencies: + array.prototype.find "^2.1.1" + function.prototype.name "^1.1.2" + is-regex "^1.1.0" + object-is "^1.1.2" + object.assign "^4.1.0" + object.entries "^1.1.2" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.13.1" ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0: +ajv-keywords@^3.1.0, 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== @@ -3522,7 +4973,7 @@ ajv@6.10.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3533,15 +4984,46 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" - integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== + version "8.6.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" +ali-oss@^6.12.0: + version "6.16.0" + resolved "https://registry.npmjs.org/ali-oss/-/ali-oss-6.16.0.tgz#3b7fbe10f13fbd535478fc31c7d05aaf4280269b" + integrity sha512-tK/+yEKtBBD+kMoHABxg6lCgC+Ad9HNjCln7qdL6LRYbUm+FFTKJubC4hT2FIooMBDb9tnI7My4MVreKnbJQRg== + dependencies: + address "^1.0.0" + agentkeepalive "^3.4.1" + bowser "^1.6.0" + co-defer "^1.0.0" + copy-to "^2.0.1" + dateformat "^2.0.0" + debug "^2.2.0" + destroy "^1.0.4" + end-or-error "^1.0.1" + get-ready "^1.0.0" + humanize-ms "^1.2.0" + is-type-of "^1.0.0" + js-base64 "^2.5.2" + jstoxml "^0.2.3" + merge-descriptors "^1.0.1" + mime "^2.4.5" + mz-modules "^2.1.0" + platform "^1.3.1" + pump "^3.0.0" + sdk-base "^2.0.1" + stream-http "2.8.2" + stream-wormhole "^1.0.4" + urllib "^2.33.1" + utility "^1.8.0" + xml2js "^0.4.16" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -3599,12 +5081,12 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3618,6 +5100,11 @@ ansi-gray@^0.1.1: dependencies: ansi-wrap "0.1.0" +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + ansi-red@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" @@ -3635,7 +5122,7 @@ ansi-regex@^3.0.0: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -3664,6 +5151,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -3698,10 +5190,57 @@ antd-mobile@^2.3.1: rmc-tabs "~1.2.0" rmc-tooltip "~1.0.0" -antd@^4.1.3, antd@^4.15.0: - version "4.15.1" - resolved "https://registry.npmjs.org/antd/-/antd-4.15.1.tgz#1ba1e0108866e1be03d3e8fb351582ade17d88db" - integrity sha512-zTZz8GY9yERNjSnH6xWU3Rw5sC3RtHEs/LOTKcSMTtU3Q5jHXIbAHKd1C6bYLQT6Ru75p+/UyKvJoNip/ax/WQ== +antd@^4.1.2: + version "4.16.13" + resolved "https://registry.npmjs.org/antd/-/antd-4.16.13.tgz#e9b9b4a590db28747aae1cab98981649a35880af" + integrity sha512-EMPD3fzKe7oayx9keD/GA1oKatcx7j5CGlkJj5eLS0/eEDDEkxVj3DFmKOPuHYt4BK7ltTzMFS+quSTmqUXPiw== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons" "^4.6.3" + "@ant-design/react-slick" "~0.28.1" + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + lodash "^4.17.21" + moment "^2.25.3" + rc-cascader "~1.4.0" + rc-checkbox "~2.3.0" + rc-collapse "~3.1.0" + rc-dialog "~8.6.0" + rc-drawer "~4.3.0" + rc-dropdown "~3.2.0" + rc-field-form "~1.20.0" + rc-image "~5.2.5" + rc-input-number "~7.1.0" + rc-mentions "~1.6.1" + rc-menu "~9.0.12" + rc-motion "^2.4.0" + rc-notification "~4.5.7" + rc-pagination "~3.1.9" + rc-picker "~2.5.10" + rc-progress "~3.1.0" + rc-rate "~2.9.0" + rc-resize-observer "^1.0.0" + rc-select "~12.1.6" + rc-slider "~9.7.1" + rc-steps "~4.1.0" + rc-switch "~3.2.0" + rc-table "~7.15.1" + rc-tabs "~11.10.0" + rc-textarea "~0.3.0" + rc-tooltip "~5.1.1" + rc-tree "~4.2.1" + rc-tree-select "~4.3.0" + rc-trigger "^5.2.10" + rc-upload "~4.3.0" + rc-util "^5.13.1" + scroll-into-view-if-needed "^2.2.25" + +antd@^4.1.3, antd@^4.16.11: + version "4.16.11" + resolved "https://registry.npmjs.org/antd/-/antd-4.16.11.tgz#924116b0de7370f914e9de6c8c5a4bf019b3d668" + integrity sha512-7Tsx0sTjpSpgRqnXIRbuerqf4pu8+V1OPY4oZXXqTzuYPwKHdnbfXMg/L35IfeLtK1QcwgF4lfTR7bChJIcWSw== dependencies: "@ant-design/colors" "^6.0.0" "@ant-design/icons" "^4.6.2" @@ -3715,17 +5254,17 @@ antd@^4.1.3, antd@^4.15.0: rc-cascader "~1.4.0" rc-checkbox "~2.3.0" rc-collapse "~3.1.0" - rc-dialog "~8.5.1" + rc-dialog "~8.6.0" rc-drawer "~4.3.0" rc-dropdown "~3.2.0" rc-field-form "~1.20.0" - rc-image "~5.2.4" - rc-input-number "~7.0.1" - rc-mentions "~1.5.0" - rc-menu "~8.10.0" + rc-image "~5.2.5" + rc-input-number "~7.1.0" + rc-mentions "~1.6.1" + rc-menu "~9.0.12" rc-motion "^2.4.0" - rc-notification "~4.5.2" - rc-pagination "~3.1.6" + rc-notification "~4.5.7" + rc-pagination "~3.1.9" rc-picker "~2.5.10" rc-progress "~3.1.0" rc-rate "~2.9.0" @@ -3734,17 +5273,16 @@ antd@^4.1.3, antd@^4.15.0: rc-slider "~9.7.1" rc-steps "~4.1.0" rc-switch "~3.2.0" - rc-table "~7.13.0" - rc-tabs "~11.7.0" + rc-table "~7.15.1" + rc-tabs "~11.10.0" rc-textarea "~0.3.0" - rc-tooltip "~5.1.0" - rc-tree "~4.1.0" + rc-tooltip "~5.1.1" + rc-tree "~4.2.1" rc-tree-select "~4.3.0" rc-trigger "^5.2.1" - rc-upload "~4.2.0-alpha.0" - rc-util "^5.9.4" + rc-upload "~4.3.0" + rc-util "^5.13.1" scroll-into-view-if-needed "^2.2.25" - warning "^4.0.3" any-promise@^1.0.0, any-promise@^1.1.0, any-promise@^1.3.0: version "1.3.0" @@ -3759,7 +5297,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.1: +anymatch@^3.0.3, anymatch@~3.1.1, 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== @@ -3774,6 +5312,11 @@ append-buffer@^1.0.2: dependencies: buffer-equal "^1.0.0" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -3847,6 +5390,11 @@ array-differ@^2.0.3: resolved "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -3857,7 +5405,7 @@ array-ify@^1.0.0: resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1: +array-includes@^3.1.2, array-includes@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== @@ -3885,6 +5433,11 @@ array-union@^1.0.2: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -3895,7 +5448,26 @@ array-unique@^0.3.2: resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: +array.prototype.filter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.0.tgz#24d63e38983cdc6bf023a3c574b2f2a3f384c301" + integrity sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.5" + +array.prototype.find@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" + integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.4" + +array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== @@ -3904,6 +5476,16 @@ array.prototype.flat@^1.2.3: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" +array.prototype.flatmap@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3956,11 +5538,26 @@ ast-types@^0.13.2: dependencies: tslib "^2.0.1" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + 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== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async-listener@^0.6.0: version "0.6.10" resolved "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc" @@ -3970,9 +5567,9 @@ async-listener@^0.6.0: shimmer "^1.1.0" async-validator@^3.0.3: - version "3.5.1" - resolved "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz#cd62b9688b2465f48420e27adb47760ab1b5559f" - integrity sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ== + version "3.5.2" + resolved "https://registry.npmjs.org/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" + integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ== async@^2.6.3, async@~2.6.1: version "2.6.3" @@ -3981,10 +5578,10 @@ async@^2.6.3, async@~2.6.1: dependencies: lodash "^4.17.14" -async@~3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== +async@^3.2.0, async@~3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" + integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== asynckit@^0.4.0: version "0.4.0" @@ -4038,12 +5635,37 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.21.0: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.21.1: version "0.21.1" resolved "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== dependencies: follow-redirects "^1.10.0" +babel-core@7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^24.8.0, babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-jest@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" @@ -4058,6 +5680,11 @@ babel-jest@^26.6.3: graceful-fs "^4.2.4" slash "^3.0.0" +babel-plugin-dva-hmr@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/babel-plugin-dva-hmr/-/babel-plugin-dva-hmr-0.4.2.tgz#56cf3d49cc366fb191cd883e27ca42bddfd12735" + integrity sha512-QP5W0IT9LDFgoqkXD0g7wn/FMn7zO562P8qys23twXri4i3E1SGOQ3z7jqcPrqzfTZHx+Ufr+cXy9oI6OLMYZg== + 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" @@ -4065,7 +5692,7 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-istanbul@^5.2.0: +babel-plugin-istanbul@^5.1.0, babel-plugin-istanbul@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== @@ -4086,6 +5713,13 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + babel-plugin-jest-hoist@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" @@ -4096,35 +5730,65 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== +babel-plugin-macros@2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" + integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== + dependencies: + "@babel/runtime" "^7.4.2" + cosmiconfig "^5.2.0" + resolve "^1.10.0" + +babel-plugin-module-resolver@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" + integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - core-js-compat "^3.9.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" -babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" + +babel-plugin-react-require@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz#2e4e7b4496b93a654a1c80042276de4e4eeb20e3" + integrity sha1-Lk57RJa5OmVKHIAEInbeTk7rIOM= babel-plugin-react-require@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.1.1.tgz#5c3d2564fa16b1e45212ed52519db147b1596106" integrity sha512-XFz+B0dWx41fnGnugzCWn5rOgrDHb150N5gFhUfO3BgYDCT25o4sofRtd9uUfqUHoRu+t4/r5Cr2RMPIKuCt2g== +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -4143,6 +5807,14 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + babel-preset-jest@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" @@ -4151,6 +5823,34 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" +babel-preset-umi@1.8.4: + version "1.8.4" + resolved "https://registry.npmjs.org/babel-preset-umi/-/babel-preset-umi-1.8.4.tgz#f7db66eca3aa394fda957a51f05dc24d2b77acb6" + integrity sha512-4IU0WuLZTiw7MstZJMwtjyYIGyOhWNUKcpSz1v5T9X8/ka2WXZ3qlkUe8dEb2kBNGrbOdXRw7u8FBEMtexqbow== + dependencies: + "@babel/core" "7.4.5" + "@babel/plugin-proposal-async-generator-functions" "7.2.0" + "@babel/plugin-proposal-class-properties" "7.4.4" + "@babel/plugin-proposal-decorators" "7.4.4" + "@babel/plugin-proposal-do-expressions" "7.2.0" + "@babel/plugin-proposal-export-default-from" "7.2.0" + "@babel/plugin-proposal-export-namespace-from" "7.2.0" + "@babel/plugin-proposal-function-bind" "7.2.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.4.4" + "@babel/plugin-proposal-object-rest-spread" "7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "7.2.0" + "@babel/plugin-proposal-optional-chaining" "7.2.0" + "@babel/plugin-proposal-pipeline-operator" "7.3.2" + "@babel/plugin-syntax-dynamic-import" "7.2.0" + "@babel/plugin-transform-destructuring" "7.4.4" + "@babel/plugin-transform-runtime" "7.4.4" + "@babel/preset-env" "7.4.5" + "@babel/preset-react" "7.0.0" + "@babel/runtime" "7.4.5" + babel-plugin-macros "2.6.1" + babel-plugin-react-require "3.0.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -4169,7 +5869,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4194,26 +5894,70 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bcrypt@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71" + integrity sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^3.1.0" + +beautiful-react-hooks@^0.35.0: + version "0.35.0" + resolved "https://registry.npmjs.org/beautiful-react-hooks/-/beautiful-react-hooks-0.35.0.tgz#816664f9a9fcf0a944f08bacf897cb1e5e94edbb" + integrity sha512-EDjpQWskuK7ob+rfH/Xt6UpFA+vC+ARM1TYAWRgYWcjcaDCGFuc3q5Ko4WJQUcFP2cq9ps3GihUSqN+KfUwQdg== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + before-after-hook@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" - integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== + version "2.2.2" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" + integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== 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@^1.0.0: + version "1.13.1" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.nlark.com/bl/download/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo= + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blessed@0.1.81: version "0.1.81" resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" integrity sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk= +block-stream@*: + version "0.0.9" + resolved "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4239,6 +5983,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +bowser@^1.6.0: + version "1.9.4" + resolved "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" + integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== + boxen@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" @@ -4275,7 +6024,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -4308,6 +6057,13 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -4369,16 +6125,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.1, browserslist@^4.6.4: - version "4.16.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz#7ebf913487f40caf4637b892b268069951c35d58" - integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.16.7, browserslist@^4.6.0, browserslist@^4.6.1, browserslist@^4.6.4: + version "4.16.7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz#108b0d1ef33c4af1b587c54f390e7041178e4335" + integrity sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA== dependencies: - caniuse-lite "^1.0.30001208" + caniuse-lite "^1.0.30001248" colorette "^1.2.2" - electron-to-chromium "^1.3.712" + electron-to-chromium "^1.3.793" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^1.1.73" bs-logger@0.x: version "0.2.6" @@ -4404,10 +6160,10 @@ buffer-equal@^1.0.0: resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= -buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1: + 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== buffer-writer@2.0.0: version "2.0.0" @@ -4428,7 +6184,15 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^3.1.0: +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npm.taobao.org/buffer/download/buffer-5.7.1.tgz?cache=0&sync_timestamp=1606098073225&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA= + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.0.0, builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== @@ -4443,6 +6207,14 @@ builtins@^1.0.3: resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + byline@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -4453,7 +6225,7 @@ byte-size@^5.0.1: resolved "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== -bytes@3.1.0: +bytes@3.1.0, bytes@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== @@ -4552,6 +6324,14 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.1: + 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" @@ -4618,10 +6398,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001208: - version "1.0.30001208" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" - integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001248: + version "1.0.30001251" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85" + integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A== capture-exit@^2.0.0: version "2.0.0" @@ -4648,6 +6428,15 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +cfb@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8" + integrity sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ== + dependencies: + adler-32 "~1.2.0" + crc-32 "~1.2.0" + printj "~1.1.2" + chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4677,9 +6466,9 @@ chalk@^1.1.3: supports-color "^2.0.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + 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" @@ -4719,7 +6508,36 @@ charm@~0.1.1: resolved "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296" integrity sha1-BsIe7RobBq62dVPNxT4jJ0usIpY= -chokidar@3.5.1, chokidar@^3.0.2, chokidar@^3.2.2, chokidar@^3.5.1: +cheerio-select@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" + integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== + dependencies: + css-select "^4.1.3" + css-what "^5.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils "^2.7.0" + +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.10" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== + dependencies: + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" + +china-division@2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/china-division/-/china-division-2.3.1.tgz#a49fa806af01d1852747466ad3c30bf0be988511" + integrity sha512-mOfLagVRZ+lRmbIIZ0sci0+9Sr+uGyPCp9an4Orov2KxLf3DGSB/4qyao/jy3pegW4Weppvh0yzGfs+dAPJA7A== + +chokidar@3.5.1: version "3.5.1" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -4734,15 +6552,49 @@ chokidar@3.5.1, chokidar@^3.0.2, chokidar@^3.2.2, chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.1" -chownr@^1.1.1, chownr@^1.1.2: +chokidar@^2.0.4: + version "2.1.8" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.0.2, chokidar@^3.2.2, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + 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" + +chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^2.0.0: version "2.0.0" @@ -4777,11 +6629,6 @@ classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnames@^2.2.3, classna resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== -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.0: version "2.2.1" resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" @@ -4796,11 +6643,16 @@ cli-cursor@^2.1.0: cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + resolved "https://registry.nlark.com/cli-cursor/download/cli-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629747481175&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= dependencies: restore-cursor "^3.1.0" +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.npmmirror.com/cli-spinners/download/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha1-rclU6+KBw3pjGb+kAebdJIj/tw0= + cli-tableau@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz#baa78d83e08a2d7ab79b7dad9406f0254977053f" @@ -4808,28 +6660,11 @@ cli-tableau@^2.0.0: dependencies: chalk "3.0.0" -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - cli-width@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -clipboard@^2.0.0: - version "2.0.8" - resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - clipboardy@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" @@ -4866,6 +6701,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -4911,6 +6755,11 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + co-body@^6.0.0: version "6.1.0" resolved "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" @@ -4921,6 +6770,11 @@ co-body@^6.0.0: raw-body "^2.3.3" type-is "^1.6.16" +co-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/co-defer/-/co-defer-1.0.0.tgz#3e4a787a8eed6b0a21ee287c094f7e8de0d3c818" + integrity sha1-Pkp4eo7tawoh7ih8CU9+jeDTyBg= + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -4940,6 +6794,14 @@ code-point-at@^1.0.0: resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codepage@~1.14.0: + version "1.14.0" + resolved "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99" + integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k= + dependencies: + commander "~2.14.1" + exit-on-epipe "~1.0.1" + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -4953,7 +6815,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.3: 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== @@ -4977,10 +6839,10 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -4991,17 +6853,17 @@ color-support@^1.1.3: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== color@^3.0.0: - version "3.1.3" - resolved "https://registry.npmjs.org/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" + color-convert "^1.9.3" + color-string "^1.6.0" colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + version "1.3.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" + integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== columnify@^1.5.4: version "1.5.4" @@ -5011,7 +6873,7 @@ columnify@^1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5023,6 +6885,11 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +commander@*, commander@>=7.0.0, commander@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" + integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== + commander@2.15.1: version "2.15.1" resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -5033,10 +6900,20 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.0.0, commander@^6.2.0: - version "6.2.1" - resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^8.2.0: + version "8.2.0" + resolved "https://registry.nlark.com/commander/download/commander-8.2.0.tgz#37fe2bde301d87d47a53adeff8b5915db1381ca8" + integrity sha1-N/4r3jAdh9R6U63v+LWRXbE4HKg= + +commander@~2.14.1: + version "2.14.1" + resolved "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commondir@^1.0.1: version "1.0.1" @@ -5058,7 +6935,7 @@ component-classes@^1.2.5: dependencies: component-indexof "0.0.3" -component-emitter@^1.2.0, component-emitter@^1.2.1: +component-emitter@^1.2.1, component-emitter@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -5068,6 +6945,13 @@ component-indexof@0.0.3: resolved "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" integrity sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= +compressible@^2.0.0: + 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" + compute-scroll-into-view@^1.0.17: version "1.0.17" resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" @@ -5078,7 +6962,7 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -5098,17 +6982,32 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concat-with-sourcemaps@^1.1.0: +concat-with-sourcemaps@^1.0.5, concat-with-sourcemaps@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== dependencies: source-map "^0.6.1" +concurrently@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-6.2.1.tgz#d880fc1d77559084732fa514092a3d5109a0d5bf" + integrity sha512-emgwhH+ezkuYKSHZQ+AkgEpoUZZlbpPVYCVv7YZx0r+T7fny1H03r2nYRebpi2DudHR4n1Rgbo2YTxKOxVJ4+g== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + read-pkg "^5.2.0" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + version "1.1.13" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -5137,6 +7036,15 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" +connected-react-router@6.5.2: + version "6.5.2" + resolved "https://registry.npmjs.org/connected-react-router/-/connected-react-router-6.5.2.tgz#422af70f86cb276681e20ab4295cf27dd9b6c7e3" + integrity sha512-qzsLPZCofSI80fwy+HgxtEgSGS4ndYUUZAWaw1dqaOGPLKX/FVwIOEb7q+hjHdnZ4v5pKZcNv5GG4urjujIoyA== + dependencies: + immutable "^3.8.1" + prop-types "^15.7.2" + seamless-immutable "^7.1.3" + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -5152,10 +7060,10 @@ constants-browserify@^1.0.0: resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= +constate@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/constate/-/constate-3.3.0.tgz#3961f552ab1bec2a9d0d56c9bc1d6bcde407357b" + integrity sha512-mRjWH2J4D3Rq6XAuEhoGUkBWrBLUNbiYr/Rp4M/MEEp+LN0vctQS3EAw/6bxlnDy59T+UrAEU9Tg136Dfp6ytg== content-disposition@~0.5.2: version "0.5.3" @@ -5164,7 +7072,7 @@ content-disposition@~0.5.2: dependencies: safe-buffer "5.1.2" -content-type@^1.0.4: +content-type@^1.0.2, 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== @@ -5260,14 +7168,14 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== +convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" -cookiejar@^2.1.0: +cookiejar@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== @@ -5321,19 +7229,34 @@ copy-to@^2.0.1: resolved "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= -core-js-compat@^3.6.2, core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.10.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" - integrity sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg== +core-js-compat@^3.1.1, core-js-compat@^3.14.0, core-js-compat@^3.16.0, core-js-compat@^3.6.2: + version "3.16.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz#c44b7caa2dcb94b673a98f27eee1c8312f55bc2d" + integrity sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ== dependencies: - browserslist "^4.16.3" + browserslist "^4.16.7" semver "7.0.0" +core-js-pure@^3.8.1: + version "3.16.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.1.tgz#b997df2669c957a5b29f06e95813a171f993592e" + integrity sha512-TyofCdMzx0KMhi84mVRS8rL1XsRk2SPUNz2azmth53iRN0/08Uim9fdhQTaZTG1LqaXHYVci4RDHka6WrXfnvg== + +core-js@3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07" + integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ== + core-js@3.6.5: version "3.6.5" resolved "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== +core-js@3.8.2: + version "3.8.2" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" + integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== + core-js@^1.0.0: version "1.2.7" resolved "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -5344,12 +7267,12 @@ core-js@^2.4.0: resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.0.0, cosmiconfig@^5.1.0: +cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -5370,6 +7293,14 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc-32@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -5406,8 +7337,21 @@ create-react-class@^15.6.0: resolved "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng== dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cron-parser@^3.1.0: + version "3.5.0" + resolved "https://registry.npmjs.org/cron-parser/-/cron-parser-3.5.0.tgz#b1a9da9514c0310aa7ef99c2f3f1d0f8c235257c" + integrity sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ== + dependencies: + is-nan "^1.3.2" + luxon "^1.26.0" cron@1.8.2: version "1.8.2" @@ -5416,13 +7360,6 @@ cron@1.8.2: dependencies: moment-timezone "^0.5.x" -cross-env@^7.0.2: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -5443,7 +7380,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, 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== @@ -5479,6 +7416,13 @@ crypto-random-string@^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== +crypto-random-string@^3.3.0: + version "3.3.1" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.1.tgz#13cee94cac8001e4842501608ef779e0ed08f82d" + integrity sha512-5j88ECEn6h17UePrLi6pn1JcLtAiANa3KExyr9y9Z5vo2mv56Gh3I4Aja/B9P9uyMwyxNHAHWv+nE72f30T5Dg== + dependencies: + type-fest "^0.8.1" + css-animation@1.x, css-animation@^1.3.2: version "1.6.1" resolved "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz#162064a3b0d51f958b7ff37b3d6d4de18e17039e" @@ -5549,6 +7493,17 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + css-selector-tokenizer@^0.7.0: version "0.7.3" resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" @@ -5578,6 +7533,21 @@ css-what@^3.2.1: resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== +css-what@^5.0.0, css-what@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + +css@2.X, css@^2.2.1: + version "2.2.4" + resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -5651,7 +7621,7 @@ cssnano-util-same-parent@^4.0.0: resolved "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== -cssnano@^4.1.10: +cssnano@^4.1.10, cssnano@^4.1.8: version "4.1.11" resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== @@ -5668,15 +7638,22 @@ csso@^4.0.2: dependencies: css-tree "^1.1.2" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + cssom@^0.4.4: version "0.4.4" resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +cssstyle@^1.0.0, cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" cssstyle@^2.3.0: version "2.3.0" @@ -5686,9 +7663,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.0.7" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" - integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== + version "3.0.8" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== culvert@^0.1.2: version "0.1.2" @@ -5707,6 +7684,46 @@ cyclist@^1.0.1: resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +d3-color@1: + version "1.4.1" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-ease@^1.0.5: + version "1.0.7" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" + integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== + +d3-hierarchy@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218" + integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw== + +d3-interpolate@^1.3.2: + version "1.4.0" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-regression@^1.3.5: + version "1.3.9" + resolved "https://registry.npmjs.org/d3-regression/-/d3-regression-1.3.9.tgz#61c34acb9b6bbd9172ede89f05d0b7fbd57ccdc0" + integrity sha512-PoMpToIvxSnVpgAZTCERVseRend40JIBICJxwATJ/T4laWGaI5dpRdRxrPITxD8hk8W455fKonVChwSmDyWEyg== + +d3-timer@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dargs@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -5726,6 +7743,15 @@ data-uri-to-buffer@3: resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5735,21 +7761,50 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@^2.15.0: - version "2.21.0" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.21.0.tgz#4672b8e926d1b37d5353dc14da44b883481ac927" - integrity sha512-lbAFpaKz7QuVxm6m1rmioh4BB2gmLx1r1JMYXU2A/ufT5ly4zEG7HYH4fvS/QfbdyC5rkYyiS30mYz4Q7XCO+w== +date-arithmetic@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz#e5d6434e9deb71f79760a37b729e4a515e730ddf" + integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== + +date-fns@2.x: + version "2.23.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" + integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== + +date-fns@^2.16.1: + version "2.24.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.24.0.tgz#7d86dc0d93c87b76b63d213b4413337cfd1c105d" + integrity sha512-6ujwvwgPID6zbI0o7UbURi2vlLDR9uP26+tW6Lg+Ji3w7dd0i3DOcjcClLjLPranT60SSEFBwdSyYwn/ZkPIuw== + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= dateformat@^3.0.0: version "3.0.3" resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dayjs@1.x, dayjs@^1.9.1: + version "1.10.6" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63" + integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== + dayjs@~1.8.24, dayjs@~1.8.25: version "1.8.36" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50" integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw== +debug-fabulous@1.X: + version "1.1.0" + resolved "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" + integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg== + dependencies: + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" + debug@3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -5757,13 +7812,27 @@ debug@3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@~4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@3.X, debug@^3.1.0, debug@^3.2.6, 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, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@~4.3.1: + version "4.3.2" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" +debug@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -5771,13 +7840,6 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: - 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" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -5797,9 +7859,9 @@ decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + version "10.3.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decode-uri-component@^0.2.0: version "0.2.0" @@ -5818,6 +7880,11 @@ dedent@^0.7.0: resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +dedupe@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/dedupe/-/dedupe-3.0.2.tgz#c7c9d5534167b69dc07bd21d093882abbe88b0a9" + integrity sha512-1BmvzpTdYjyvzTMgd8+A7R9jNJh8GfvVZJqREZpqq7OpePtVFNdw56FjsHFdC35ROSng6y+h4qFYO/VkiKEztg== + deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -5843,6 +7910,13 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +default-user-agent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz#16c46efdcaba3edc45f24f2bd4868b01b7c2adc6" + integrity sha1-FsRu/cq6PtxF8k8r1IaLAbfCrcY= + dependencies: + os-name "~1.0.3" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -5893,16 +7967,21 @@ degenerator@^2.2.0: escodegen "^1.8.1" esprima "^4.0.0" +degenerator@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b" + integrity sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ== + dependencies: + ast-types "^0.13.2" + escodegen "^1.8.1" + esprima "^4.0.0" + vm2 "^3.9.3" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -5928,6 +8007,11 @@ deprecation@^2.0.0, deprecation@^2.3.1: resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +dequal@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -5941,11 +8025,26 @@ destroy@^1.0.4: resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-browser@^5.0.0, detect-browser@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-libc@^1.0.2, detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@2.X, detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -5959,11 +8058,29 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^27.0.6: + version "27.0.6" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -5978,6 +8095,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +digest-header@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/digest-header/-/digest-header-0.0.1.tgz#11ccf6deec5766ac379744d901c12cba49514be6" + integrity sha1-Ecz23uxXZqw3l0TZAcEsuklRS+Y= + dependencies: + utility "0.1.11" + dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -5985,13 +8109,24 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +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" + +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + +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" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -6001,9 +8136,17 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-align@1.x, dom-align@^1.7.0: - version "1.12.0" - resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" - integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA== + version "1.12.2" + resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" + integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== + +dom-helpers@^5.1.0, dom-helpers@^5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" dom-serializer@0: version "0.2.2" @@ -6013,6 +8156,20 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1, dom-serializer@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -6023,11 +8180,18 @@ domelementtype@1: resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domexception@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -6035,6 +8199,13 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" +domhandler@4.2.0, domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== + dependencies: + domelementtype "^2.2.0" + domutils@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -6043,6 +8214,23 @@ domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@^4.1.0, dot-prop@^4.2.0: version "4.2.1" resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" @@ -6058,9 +8246,9 @@ dot-prop@^5.1.0, dot-prop@^5.2.0: is-obj "^2.0.0" dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + version "8.6.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== dottie@^2.0.0: version "2.0.2" @@ -6072,21 +8260,21 @@ dumi-assets-types@1.0.0: resolved "https://registry.npmjs.org/dumi-assets-types/-/dumi-assets-types-1.0.0.tgz#d5368cb11045b203bf1ef1080e553b2287a2ec81" integrity sha512-7nhSeWM15vybbUAMPLZsdls2jKoHB2UU4P1RM6kLPucuS8eC/HSmufquFqTTYtX4oIDLHGtil/dVtMreNGwhdA== -dumi-theme-default@1.0.13: - version "1.0.13" - resolved "https://registry.npmjs.org/dumi-theme-default/-/dumi-theme-default-1.0.13.tgz#35c0721f7ee70eac7fa893be8c216ab40d594878" - integrity sha512-Z/iOpEDFm6HAh3SVk0XcwBR33lFOYMpdXZLcTSHy7UxVRVmsWmgaCvsFLkGnLL+B8AXW9BkKIq4b1e5xp1VJww== +dumi-theme-default@1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/dumi-theme-default/-/dumi-theme-default-1.1.8.tgz#aa951fb9edb10aa2a7ac7d081b7bb0d61d285985" + integrity sha512-K/IjnJ4Vz0ToiTTNl9kcNU8qbJdgesjY/FDDy1BTwzd63GhIEFrvdesun/7l51Wehr+nAC3XGERzZV0AbEfMOA== dependencies: prism-react-renderer "^1.1.1" prismjs "^1.21.0" rc-tabs "^11.7.1" -dumi@^1.0.12: - version "1.1.13" - resolved "https://registry.npmjs.org/dumi/-/dumi-1.1.13.tgz#514d607691b0ea5ffe227729165ce86e5f66dcc0" - integrity sha512-6OVqFRv3dbE9nagcZasLcGljL9cLKgYZItZJsdhHUvssYRnbSwQsUrDr3TyGUp/jbdQtXOtWv+6dzx6gqHlrgQ== +dumi@^1.1.25: + version "1.1.25" + resolved "https://registry.npmjs.org/dumi/-/dumi-1.1.25.tgz#8d86043cbcb35d02e7eff5097f43d266634d48bc" + integrity sha512-YJGjtFILtfy8v09+CXprFOagZTHk5oWCU3zt1FblDcxYO7CXmKFyPatqyeZLKAih+q6iOfBcqTa1taE61WC56A== dependencies: - "@umijs/preset-dumi" "1.1.13" + "@umijs/preset-dumi" "1.1.25" umi "^3.0.0" duplexer3@^0.1.4: @@ -6109,6 +8297,60 @@ duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +dva-core@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/dva-core/-/dva-core-2.0.4.tgz#086665d1d5f684e089c5bfac9ba388d91cc9050a" + integrity sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA== + dependencies: + "@babel/runtime" "^7.0.0" + flatten "^1.0.2" + global "^4.3.2" + invariant "^2.2.1" + is-plain-object "^2.0.3" + redux-saga "^0.16.0" + warning "^3.0.0" + +dva-immer@^0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/dva-immer/-/dva-immer-0.5.2.tgz#128bd6d96b25f11e6f137807b614b9c58cf03f32" + integrity sha512-xg23ktGsrdzgiU0ACl8vFm2+E2GBWbtXndXRKM9wtHDR+yMH27NfttVuAZQWvv4aaj6f5/bC+TdsZ9t7n6cAhQ== + dependencies: + "@babel/runtime" "^7.0.0" + immer "^7.0.5" + +dva-loading@^3.0.20: + version "3.0.22" + resolved "https://registry.npmjs.org/dva-loading/-/dva-loading-3.0.22.tgz#c0dd2fb081492752b992d9ce2701b88825186e02" + integrity sha512-WReyAQwW42aimEwkjDLJSu3W4y1WjkOVcqdIY7x1ARrobgkNC3dVfLe4xUgdtHuLfSJzWa55FrdRrVM3b5QwcA== + dependencies: + "@babel/runtime" "^7.0.0" + +dva@^2.6.0-beta.20: + version "2.6.0-beta.22" + resolved "https://registry.npmjs.org/dva/-/dva-2.6.0-beta.22.tgz#3288993ecea70ee9c507d4aa9e0ed8247d4af69c" + integrity sha512-Q19fqiQxtl9L4a/woKoLTStagZR3QxTUEHuFhYBe0RLAf514HEuPmJXQrDz4p+QggNpTaI8lUzzId2TzntAFcQ== + dependencies: + "@babel/runtime" "^7.0.0" + "@types/isomorphic-fetch" "^0.0.35" + "@types/react-redux" "^7.1.0" + "@types/react-router-dom" "^5.1.2" + connected-react-router "6.5.2" + dva-core "2.0.4" + global "^4.3.2" + history "^4.7.2" + invariant "^2.2.4" + isomorphic-fetch "^2.2.1" + react-redux "^7.1.0" + react-router-dom "^5.1.2" + redux "^4.0.1" + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + dependencies: + xtend "^4.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -6117,15 +8359,15 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ee-first@1.1.1: +ee-first@1.1.1, ee-first@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.712: - version "1.3.717" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz#78d4c857070755fb58ab64bcc173db1d51cbc25f" - integrity sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ== +electron-to-chromium@^1.3.793: + version "1.3.806" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz#21502100f11aead6c501d1cd7f2504f16c936642" + integrity sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA== elliptic@^6.5.3: version "6.5.4" @@ -6191,6 +8433,11 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +end-or-error@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz#dc7a6210fe78d372fee24a8b4899dbd155414dcb" + integrity sha1-3HpiEP5403L+4kqLSJnb0VVBTcs= + enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1: version "4.5.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -6200,7 +8447,7 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1: memory-fs "^0.5.0" tapable "^1.0.0" -enquirer@2.3.6, enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@2.3.6, enquirer@^2.3.5: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -6222,6 +8469,70 @@ envinfo@^7.3.1: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +enzyme-adapter-react-16@^1.14.0: + version "1.15.6" + resolved "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz#fd677a658d62661ac5afd7f7f541f141f8085901" + integrity sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g== + dependencies: + enzyme-adapter-utils "^1.14.0" + enzyme-shallow-equal "^1.0.4" + has "^1.0.3" + object.assign "^4.1.2" + object.values "^1.1.2" + prop-types "^15.7.2" + react-is "^16.13.1" + react-test-renderer "^16.0.0-0" + semver "^5.7.0" + +enzyme-adapter-utils@^1.14.0: + version "1.14.0" + resolved "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz#afbb0485e8033aa50c744efb5f5711e64fbf1ad0" + integrity sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg== + dependencies: + airbnb-prop-types "^2.16.0" + function.prototype.name "^1.1.3" + has "^1.0.3" + object.assign "^4.1.2" + object.fromentries "^2.0.3" + prop-types "^15.7.2" + semver "^5.7.1" + +enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz#b9256cb25a5f430f9bfe073a84808c1d74fced2e" + integrity sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q== + dependencies: + has "^1.0.3" + object-is "^1.1.2" + +enzyme@^3.10.0: + version "3.11.0" + resolved "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" + integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== + dependencies: + array.prototype.flat "^1.2.3" + cheerio "^1.0.0-rc.3" + enzyme-shallow-equal "^1.0.1" + function.prototype.name "^1.1.2" + has "^1.0.3" + html-element-map "^1.2.0" + is-boolean-object "^1.0.1" + is-callable "^1.1.5" + is-number-object "^1.0.4" + is-regex "^1.0.5" + is-string "^1.0.5" + is-subset "^0.1.1" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.7.0" + object-is "^1.0.2" + object.assign "^4.1.0" + object.entries "^1.1.1" + object.values "^1.1.1" + raf "^3.4.1" + rst-selector-parser "^2.2.3" + string.prototype.trim "^1.2.1" + err-code@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -6241,10 +8552,17 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.18.0, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.5" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19" + integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -6252,16 +8570,27 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: get-intrinsic "^1.1.1" has "^1.0.3" has-symbols "^1.0.2" + internal-slot "^1.0.3" is-callable "^1.2.3" is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" + unbox-primitive "^1.0.1" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-module-lexer@0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" + integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== es-to-primitive@^1.2.1: version "1.2.1" @@ -6272,10 +8601,28 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + es5-imcompatible-versions@^0.1.62: - version "0.1.67" - resolved "https://registry.npmjs.org/es5-imcompatible-versions/-/es5-imcompatible-versions-0.1.67.tgz#ce7de397dbdb62b926be683282455ac415e06c39" - integrity sha512-L74XSKBby2NFW0Rxf6QhdQ45x0MrxbDmuNicti5arzoK7w2I+A6sxHGIQqPaN5NpoYDO3RTT/I3NZC5oIUskpw== + version "0.1.73" + resolved "https://registry.npmjs.org/es5-imcompatible-versions/-/es5-imcompatible-versions-0.1.73.tgz#2d34dbb29cbc54f38902cc1150bbe301b388c014" + integrity sha512-P0SgLrYl9iqlrt0h6n/iz5z5P1uuhnfHp9BA/tcLfqgVIWHNvY4Rm+jtSvnh1ADK4DJOYDwJvxlrHMRoLQMgmQ== + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" es6-promise@^4.0.3: version "4.2.8" @@ -6289,6 +8636,29 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +esbuild@0.12.15: + version "0.12.15" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.12.15.tgz#9d99cf39aeb2188265c5983e983e236829f08af0" + integrity sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw== + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -6319,7 +8689,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.8.1: +escodegen@^1.11.0, escodegen@^1.8.1, escodegen@^1.9.1: version "1.14.3" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -6343,20 +8713,20 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.5.tgz#939bbb0f74e179e757ca87f7a4a890dabed18ac4" + integrity sha512-XMoPKjSpXbkeJ7ZZ9icLnJMTY5Mc1kZbCakHquaFsXPpyWOwK0TK6CODO+0ca54UoM9LKOxyUNnoVZRl8TeaAg== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== dependencies: - debug "^2.6.9" + debug "^3.2.7" pkg-dir "^2.0.0" eslint-plugin-es@^3.0.0: @@ -6368,22 +8738,24 @@ eslint-plugin-es@^3.0.0: regexpp "^3.0.0" eslint-plugin-import@^2.22.0: - version "2.22.1" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + version "2.24.0" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz#697ffd263e24da5e84e03b282f5fb62251777177" + integrity sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.5" + eslint-module-utils "^2.6.2" + find-up "^2.0.0" has "^1.0.3" + is-core-module "^2.4.0" minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" tsconfig-paths "^3.9.0" eslint-plugin-node@^11.1.0: @@ -6403,12 +8775,30 @@ eslint-plugin-promise@^4.2.1: resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== +eslint-plugin-react@^7.23.2: + version "7.24.0" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz#eadedfa351a6f36b490aa17f4fa9b14e842b9eb4" + integrity sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q== + dependencies: + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.values "^1.1.4" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.5" + eslint-plugin-standard@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== -eslint-scope@^5.0.0, 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== @@ -6423,38 +8813,48 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.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@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + 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@^7.4.0: - version "7.24.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" - integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== + version "7.32.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.0" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" 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 "^5.0.0" + glob-parent "^5.1.2" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" @@ -6463,7 +8863,7 @@ eslint@^7.4.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -6472,7 +8872,7 @@ eslint@^7.4.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -6519,7 +8919,7 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== -estree-walker@^0.6.1: +estree-walker@^0.6.0, estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== @@ -6539,6 +8939,14 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + eventemitter2@5.0.1, eventemitter2@~5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" @@ -6595,19 +9003,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -6621,7 +9016,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.1.0: +execa@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -6636,11 +9031,31 @@ execa@^4.0.0, execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.nlark.com/execa/download/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= + 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" + exenv@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -6659,6 +9074,18 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + expect@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" @@ -6671,6 +9098,13 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^1.1.2: version "1.1.4" resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" @@ -6741,12 +9175,17 @@ fancy-log@^1.3.2: parse-node-version "^1.0.0" time-stamp "^1.0.0" +fast-deep-equal@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: +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== @@ -6763,6 +9202,22 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + 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-patch@^3.0.0-1: + version "3.1.0" + resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6" + integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA== + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -6773,68 +9228,22 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.8" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f" + integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag== + fastparse@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== -father-build@^1.19.2: - version "1.19.4" - resolved "https://registry.npmjs.org/father-build/-/father-build-1.19.4.tgz#82d3d0cd584e0aa3eb56880c9820140cce1dac67" - integrity sha512-ub3sqUI6/LsZju0n+AL11VpPvhKZud5XjUpP/gZG4UOeYDPtI4TNWcuniBY9Rvg84OIEBh/WXfpe5p9FF00snA== - dependencies: - "@babel/core" "7.12.3" - "@babel/plugin-proposal-class-properties" "7.12.1" - "@babel/plugin-proposal-decorators" "7.12.1" - "@babel/plugin-proposal-do-expressions" "7.12.1" - "@babel/plugin-proposal-export-default-from" "7.12.1" - "@babel/plugin-proposal-export-namespace-from" "7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" - "@babel/plugin-proposal-optional-chaining" "7.12.1" - "@babel/plugin-syntax-dynamic-import" "7.8.3" - "@babel/plugin-transform-modules-commonjs" "7.12.1" - "@babel/plugin-transform-runtime" "7.12.1" - "@babel/preset-env" "7.12.1" - "@babel/preset-react" "7.12.1" - "@babel/preset-typescript" "7.12.1" - "@babel/register" "7.12.1" - "@lerna/project" "^3.21.0" - "@rollup/plugin-babel" "5.2.1" - "@rollup/plugin-commonjs" "16.0.0" - "@rollup/plugin-inject" "4.0.2" - "@rollup/plugin-json" "4.1.0" - "@rollup/plugin-node-resolve" "10.0.0" - "@rollup/plugin-replace" "2.3.4" - "@rollup/plugin-url" "5.0.1" - "@svgr/rollup" "5.4.0" - ajv "6.10.0" - autoprefixer "9.6.0" - babel-plugin-istanbul "^5.2.0" - babel-plugin-react-require "3.1.1" - chalk "2.4.2" - chokidar "^3.0.2" - glob "^7.1.4" - gulp-if "2.0.2" - gulp-less "^4.0.1" - gulp-plumber "^1.2.1" - gulp-typescript "5.0.1" - less "3.9.0" - less-plugin-npm-import "2.1.0" - lodash "4.17.19" - rimraf "2.6.3" - rollup "2.33.3" - rollup-plugin-postcss "3.1.8" - rollup-plugin-terser "7.0.2" - rollup-plugin-typescript2 "0.29.0" - signale "1.4.0" - slash2 "2.0.0" - temp-dir "2.0.0" - through2 "3.0.1" - ts-loader "^8.0.7" - typescript "^4.0.5" - update-notifier "3.0.0" - vinyl-fs "3.0.3" - yargs-parser "13.1.2" +fastq@^1.6.0: + version "1.11.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" + integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== + dependencies: + reusify "^1.0.4" fault@^1.0.0: version "1.0.4" @@ -6868,6 +9277,16 @@ fclone@1.0.11, fclone@~1.0.11: resolved "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" integrity sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA= +fecha@~4.2.0: + version "4.2.1" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" + integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== + +fflate@^0.3.8: + version "0.3.11" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz#2c440d7180fdeb819e64898d8858af327b042a5d" + integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A== + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -6880,13 +9299,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6894,6 +9306,16 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + file-uri-to-path@2: version "2.0.0" resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" @@ -6921,6 +9343,14 @@ filter-obj@^1.1.0: resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= +find-babel-config@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -6977,10 +9407,20 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat-to-nested@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/flat-to-nested/-/flat-to-nested-1.1.1.tgz#ec183cd9a72f6bfbf8ca21acb0fc8235e509f581" + integrity sha512-Sym5oik6BO9JnsDEjv9Q9hPTCexG2ttk0UiM2mgLEiCiiUOQr8acBd33r8ixnoSGR0HAxPoP8WtLAL5oV46IhQ== + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.2" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== flatten@^1.0.2: version "1.0.3" @@ -6996,9 +9436,21 @@ flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: readable-stream "^2.3.6" follow-redirects@^1.10.0: - version "1.13.3" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + version "1.14.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + +follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" @@ -7015,13 +9467,13 @@ fork-stream@^0.0.4: resolved "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA= -form-data@^2.3.1: - version "2.5.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" form-data@~2.3.2: @@ -7038,11 +9490,25 @@ format@^0.2.0: resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= -formidable@^1.2.0: +formidable@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== +formstream@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/formstream/-/formstream-1.1.1.tgz#17259d2440c35ca9736db9f45fb3ba3f8669c750" + integrity sha512-yHRxt3qLFnhsKAfhReM4w17jP+U1OlhUjnKPPtonwKbIJO7oBP0MvoxkRUwb8AU9n0MIkYy5X5dK6pQnbj+R2Q== + dependencies: + destroy "^1.0.4" + mime "^2.5.2" + pause-stream "~0.0.11" + +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -7072,13 +9538,20 @@ fs-extra@8.1.0, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: +fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: minipass "^2.6.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -7102,7 +9575,15 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.1.2, fsevents@~2.3.1: +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@~2.3.1, 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== @@ -7112,6 +9593,16 @@ fsevents@~2.1.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + ftp@^0.3.10: version "0.3.10" resolved "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -7125,11 +9616,26 @@ function-bind@^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.2, function.prototype.name@^1.1.3: + version "1.1.4" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.4.tgz#e4ea839b9d3672ae99d0efd9f38d9191c5eaac83" + integrity sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + 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 sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" + integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -7168,12 +9674,12 @@ gensync@^1.0.0-beta.1, gensync@^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-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -7208,6 +9714,11 @@ get-port@^4.2.0: resolved "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-ready@^1.0.0, get-ready@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz#f91817f1e9adecfea13a562adfc8de883ab34782" + integrity sha1-+RgX8emt7P6hOlYq38jeiDqzR4I= + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -7232,6 +9743,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.nlark.com/get-stream/download/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= + get-uri@3: version "3.0.2" resolved "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" @@ -7294,17 +9810,17 @@ git-sha1@^0.1.2: integrity sha1-WZrBkrcYdYJeE6RF86bgURjC90U= git-up@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" - integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== + version "4.0.5" + resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" + integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== dependencies: is-ssh "^1.3.0" - parse-url "^5.0.0" + parse-url "^6.0.0" git-url-parse@^11.1.2: - version "11.4.4" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.4.tgz#5d747debc2469c17bc385719f7d0427802d83d77" - integrity sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw== + version "11.5.0" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.5.0.tgz#acaaf65239cb1536185b19165a24bbc754b3f764" + integrity sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA== dependencies: git-up "^4.0.0" @@ -7322,6 +9838,11 @@ github-slugger@^1.3.0: dependencies: emoji-regex ">=6.0.0 <=6.1.1" +gl-matrix@^3.0.0, gl-matrix@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz#232eef60b1c8b30a28cbbe75b2caf6c48fd6358b" + integrity sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -7330,7 +9851,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0, 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== @@ -7358,10 +9879,22 @@ glob-to-regexp@^0.3.0: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob@^7.0.3: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -7384,24 +9917,37 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" +global@^4.3.2: + version "4.4.0" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" -globals@^13.6.0: - version "13.8.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" - integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: - type-fest "^0.20.2" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" globby@^9.2.0: version "9.2.0" @@ -7417,13 +9963,6 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - got@^9.6.0: version "9.6.0" resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -7441,10 +9980,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== growly@^1.3.0: version "1.3.0" @@ -7490,6 +10029,23 @@ gulp-plumber@^1.2.1: plugin-error "^0.1.2" through2 "^2.0.3" +gulp-sourcemaps@2.6.5: + version "2.6.5" + resolved "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6" + integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg== + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "5.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "~0.6.0" + strip-bom-string "1.X" + through2 "2.X" + gulp-typescript@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz#96c6565a6eb31e08c2aae1c857b1a079e6226d94" @@ -7532,6 +10088,11 @@ hard-rejection@^2.1.0: resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -7564,6 +10125,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +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-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -7700,9 +10268,9 @@ hast-util-raw@^6.0.0: zwitch "^1.0.0" hast-util-to-html@^7.1.1: - version "7.1.2" - resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.2.tgz#db677f0ee483658cea0eecc9dec30aba42b67111" - integrity sha512-pu73bvORzdF6XZgwl9eID/0RjBb/jtRfoGRRSykpR1+o9rCdiAHpgkSukZsQBRlIqMg6ylAcd7F0F7myJUb09Q== + version "7.1.3" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" + integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== dependencies: ccount "^1.0.0" comma-separated-tokens "^1.0.0" @@ -7774,7 +10342,7 @@ history-with-query@4.10.4: tiny-warning "^1.0.0" value-equal "^1.0.1" -history@^4.9.0: +history@^4.7.2, 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== @@ -7795,7 +10363,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: 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== @@ -7831,6 +10399,29 @@ hsla-regex@^1.0.0: resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= +html-dom-parser@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.0.1.tgz#5d147fed6656c12918edbcea4a423eefe8d0e715" + integrity sha512-uKXISKlHzB/l9A08jrs2wseQJ9b864ZfEdmIZskj10cuP6HxCOMHSK0RdluV8NVQaWs0PwefN7d8wqG3jR0IbQ== + dependencies: + domhandler "4.2.0" + htmlparser2 "6.1.0" + +html-element-map@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz#44b2cbcfa7be7aa4ff59779e47e51012e1c73c08" + integrity sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg== + dependencies: + array.prototype.filter "^1.0.0" + call-bind "^1.0.2" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -7838,16 +10429,41 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" +html-entities@^2.1.0: + version "2.3.2" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-react-parser@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.2.8.tgz#6806984a5056417de38fc4b52145bd56b1b32d73" + integrity sha512-fPPbnMNbVuceyJARZTCu2/Ai7XbVsfncwVUl3IFpgV8BG7lv6hm+Z8NWXRgc2r1DXTf1wRnLaPDL4unbln/r+g== + dependencies: + domhandler "4.2.0" + html-dom-parser "1.0.1" + react-property "1.0.1" + style-to-js "1.1.0" + 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== +htmlparser2@6.1.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" + http-assert@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" @@ -7877,7 +10493,7 @@ http-errors@1.7.3, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@^1.6.3, http-errors@^1.7.3: +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@^1.8.0: version "1.8.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== @@ -7888,6 +10504,16 @@ http-errors@^1.6.3, http-errors@^1.7.3: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -7940,14 +10566,19 @@ human-signals@^1.1.1: resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -humanize-ms@^1.2.1: +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/human-signals/download/human-signals-2.1.0.tgz?cache=0&sync_timestamp=1624364695595&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhuman-signals%2Fdownload%2Fhuman-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= + +humanize-ms@^1.2.0, humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.15, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7955,9 +10586,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -7966,7 +10597,14 @@ icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: resolved "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= -ieee754@^1.1.4: +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -7982,9 +10620,9 @@ ignore-by-default@^1.0.1: integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + version "3.0.4" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" @@ -7993,7 +10631,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: +ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -8003,7 +10641,17 @@ image-size@~0.5.0: resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= -import-cwd@^2.0.0: +immer@^7.0.5: + version "7.0.15" + resolved "https://registry.npmjs.org/immer/-/immer-7.0.15.tgz#dc3bc6db87401659d2e737c67a21b227c484a4ad" + integrity sha512-yM7jo9+hvYgvdCQdqvhCNRRio0SCXc8xDPzA25SvKWa7b1WVPjLwQs1VYU5JPXjcJPTqAa5NP5dqpORGYBQ2AA== + +immutable@^3.8.1: + version "3.8.2" + resolved "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +import-cwd@^2.0.0, import-cwd@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= @@ -8110,10 +10758,10 @@ inflation@^2.0.0: resolved "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= -inflection@1.12.0: - version "1.12.0" - resolved "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" - integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= +inflection@1.13.1: + version "1.13.1" + resolved "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== inflight@^1.0.4: version "1.0.6" @@ -8123,7 +10771,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, 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== @@ -8186,6 +10834,52 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +intersection-observer@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz#ee16bee978db53516ead2f0a8154b09b400bbdc9" + integrity sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg== + +intl-format-cache@^4.2.21: + version "4.3.1" + resolved "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.3.1.tgz#484d31a9872161e6c02139349b259a6229ade377" + integrity sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q== + +intl-messageformat-parser@^3.6.4: + version "3.6.4" + resolved "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.6.4.tgz#5199d106d816c3dda26ee0694362a9cf823978fb" + integrity sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA== + dependencies: + "@formatjs/intl-unified-numberformat" "^3.2.0" + +intl-messageformat@^7.8.4: + version "7.8.4" + resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-7.8.4.tgz#c29146a06b9cd26662978a4d95fff2b133e3642f" + integrity sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA== + dependencies: + intl-format-cache "^4.2.21" + intl-messageformat-parser "^3.6.4" + +intl@1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" + integrity sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94= + +invariant@^2.2.1, invariant@^2.2.2, 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" + ip@1.1.5, ip@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -8242,9 +10936,18 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 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@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" @@ -8253,12 +10956,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== +is-boolean-object@^1.0.1, 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.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5: version "1.1.6" @@ -8270,17 +10974,10 @@ is-buffer@^2.0.0: 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.3: - version "1.2.3" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.3: + 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" @@ -8289,6 +10986,11 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-class-hotfix@~0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435" + integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ== + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -8301,10 +11003,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0, is-core-module@^2.4.0: + version "2.5.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== dependencies: has "^1.0.3" @@ -8323,9 +11025,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + 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" @@ -8405,9 +11109,11 @@ is-generator-fn@^2.0.0: integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: - version "1.0.8" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" - integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" is-glob@^3.1.0: version "3.1.0" @@ -8444,11 +11150,24 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/is-interactive/download/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4= + is-module@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -8470,9 +11189,11 @@ is-npm@^4.0.0: integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.6" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -8530,11 +11251,16 @@ is-plain-object@^5.0.0: resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + is-property@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -8547,13 +11273,13 @@ is-reference@^1.2.1: dependencies: "@types/estree" "*" -is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== +is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.3: + 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-symbols "^1.0.1" + has-tostringtag "^1.0.0" is-regexp@^1.0.0: version "1.0.0" @@ -8573,9 +11299,9 @@ is-resolvable@^1.0.0: integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-ssh@^1.3.0: - version "1.3.2" - resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" - integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== + version "1.3.3" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" + integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== dependencies: protocols "^1.1.0" @@ -8585,21 +11311,28 @@ is-stream@^1.0.1, is-stream@^1.1.0: integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + 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: - version "1.0.5" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.5, is-string@^1.0.6: + 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-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + 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.1" + has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" @@ -8608,6 +11341,15 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-type-of@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5" + integrity sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA== + dependencies: + core-util-is "^1.0.2" + is-class-hotfix "~0.0.6" + isstream "~0.1.2" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8622,8 +11364,13 @@ is-unc-path@^1.0.0: is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + resolved "https://registry.nlark.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1625294161966&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= + +is-url@1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" @@ -8645,6 +11392,11 @@ is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -8684,7 +11436,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: +isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= @@ -8697,7 +11449,7 @@ isstream@~0.1.2: resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.5: +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== @@ -8707,7 +11459,7 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-instrument@^3.3.0: +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== @@ -8730,6 +11482,15 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -8739,6 +11500,17 @@ istanbul-lib-report@^3.0.0: make-dir "^3.0.0" supports-color "^7.1.0" +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + istanbul-lib-source-maps@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" @@ -8748,6 +11520,13 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + istanbul-reports@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" @@ -8761,6 +11540,15 @@ javascript-stringify@^2.0.1: resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -8770,6 +11558,25 @@ jest-changed-files@^26.6.2: execa "^4.0.0" throat "^5.0.0" +jest-cli@^24.8.0, jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + jest-cli@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" @@ -8789,6 +11596,29 @@ jest-cli@^26.6.3: prompts "^2.0.1" yargs "^15.4.1" +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + jest-config@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" @@ -8813,7 +11643,17 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" -jest-diff@^26.0.0, jest-diff@^26.6.2: +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-diff@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== @@ -8823,6 +11663,23 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-diff@^27.0.0: + version "27.2.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz#bda761c360f751bab1e7a2fe2fc2b0a35ce8518c" + integrity sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.0.6" + jest-get-type "^27.0.6" + pretty-format "^27.2.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + jest-docblock@^26.0.0: version "26.0.0" resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" @@ -8830,6 +11687,17 @@ jest-docblock@^26.0.0: dependencies: detect-newline "^3.0.0" +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + jest-each@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" @@ -8841,6 +11709,30 @@ jest-each@^26.6.2: jest-util "^26.6.2" pretty-format "^26.6.2" +jest-environment-jsdom-fourteen@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^14.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + jest-environment-jsdom@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" @@ -8854,6 +11746,17 @@ jest-environment-jsdom@^26.6.2: jest-util "^26.6.2" jsdom "^16.4.0" +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jest-environment-node@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" @@ -8866,11 +11769,40 @@ jest-environment-node@^26.6.2: jest-mock "^26.6.2" jest-util "^26.6.2" +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^27.0.6: + version "27.0.6" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" + integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -8892,6 +11824,28 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + jest-jasmine2@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" @@ -8916,6 +11870,14 @@ jest-jasmine2@^26.6.3: pretty-format "^26.6.2" throat "^5.0.0" +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + jest-leak-detector@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" @@ -8924,6 +11886,16 @@ jest-leak-detector@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + jest-matcher-utils@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" @@ -8934,6 +11906,20 @@ jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + jest-message-util@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" @@ -8949,6 +11935,13 @@ jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + jest-mock@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" @@ -8957,16 +11950,30 @@ jest-mock@^26.6.2: "@jest/types" "^26.6.2" "@types/node" "*" -jest-pnp-resolver@^1.2.2: +jest-pnp-resolver@^1.2.0, jest-pnp-resolver@^1.2.1, jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + jest-regex-util@^26.0.0: version "26.0.0" resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + jest-resolve-dependencies@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" @@ -8976,6 +11983,17 @@ jest-resolve-dependencies@^26.6.3: jest-regex-util "^26.0.0" jest-snapshot "^26.6.2" +jest-resolve@^24.8.0, jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + jest-resolve@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" @@ -8990,6 +12008,31 @@ jest-resolve@^26.6.2: resolve "^1.18.1" slash "^3.0.0" +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + jest-runner@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" @@ -9016,6 +12059,35 @@ jest-runner@^26.6.3: source-map-support "^0.5.6" throat "^5.0.0" +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + jest-runtime@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" @@ -9049,6 +12121,11 @@ jest-runtime@^26.6.3: strip-bom "^4.0.0" yargs "^15.4.1" +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + jest-serializer@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" @@ -9057,6 +12134,25 @@ jest-serializer@^26.6.2: "@types/node" "*" graceful-fs "^4.2.4" +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + jest-snapshot@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" @@ -9079,6 +12175,24 @@ jest-snapshot@^26.6.2: pretty-format "^26.6.2" semver "^7.3.2" +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + jest-util@^26.1.0, jest-util@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" @@ -9091,6 +12205,18 @@ jest-util@^26.1.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + jest-validate@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" @@ -9103,6 +12229,19 @@ jest-validate@^26.6.2: leven "^3.1.0" pretty-format "^26.6.2" +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + jest-watcher@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" @@ -9116,7 +12255,7 @@ jest-watcher@^26.6.2: jest-util "^26.6.2" string-length "^4.0.1" -jest-worker@24.9.0: +jest-worker@24.9.0, jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== @@ -9133,7 +12272,15 @@ jest-worker@26.6.2, jest-worker@^26.2.1, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^26.1.0: +jest@^24.8.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +jest@^26.6.3: version "26.6.3" resolved "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== @@ -9142,6 +12289,16 @@ jest@^26.1.0: import-local "^3.0.2" jest-cli "^26.6.3" +js-base64@^2.5.2: + version "2.6.4" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + js-git@^0.7.8: version "0.7.8" resolved "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz#52fa655ab61877d6f1079efc6534b554f31e5444" @@ -9152,6 +12309,11 @@ js-git@^0.7.8: git-sha1 "^0.1.2" pako "^0.2.5" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "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" @@ -9170,13 +12332,77 @@ jsbn@~0.1.0: resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + jsdom@^16.0.0, jsdom@^16.4.0: - version "16.5.3" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" - integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" - acorn "^8.1.0" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -9184,12 +12410,13 @@ jsdom@^16.0.0, jsdom@^16.4.0: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -9199,7 +12426,7 @@ jsdom@^16.0.0, jsdom@^16.4.0: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.4" + ws "^7.4.6" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -9252,6 +12479,14 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json-templates@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/json-templates/-/json-templates-4.1.0.tgz#5b8e9a9f0f77d5107214b77f06412ae9b884c278" + integrity sha512-Xjcnphott7Kj09zTSvszDVMXNa6utrQjXR25oxFMGKRNuX9wYQsJgKeQWVAxHE26I8lPUriIJ9nba1fCCBiI4Q== + dependencies: + dedupe "^3.0.2" + object-path "^0.11.4" + json2mq@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" @@ -9259,13 +12494,18 @@ json2mq@^0.2.0: dependencies: string-convert "^0.2.0" -json5@2.x, json5@^2.1.2: +json5@2.x, json5@^2.1.0, json5@^2.1.2, json5@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -9295,6 +12535,19 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jstoxml@^0.2.3: + version "0.2.4" + resolved "https://registry.npmjs.org/jstoxml/-/jstoxml-0.2.4.tgz#ff3fb67856883a032953c7ce8ce7486210f48447" + integrity sha1-/z+2eFaIOgMpU8fOjOdIYhD0hEc= + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.0" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + katex@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" @@ -9355,6 +12608,13 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +ko-sleep@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.0.3.tgz#28a2a0a1485e8b7f415ff488dee17d24788ab082" + integrity sha1-KKKgoUhei39BX/SI3uF9JHiKsII= + dependencies: + ms "^2.0.0" + koa-bodyparser@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" @@ -9375,6 +12635,17 @@ koa-compose@^4.1.0: resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== +koa-compress@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/koa-compress/-/koa-compress-5.1.0.tgz#7b9fe24f4c1b28d9cae90864597da472c2fcf701" + integrity sha512-G3Ppo9jrUwlchp6qdoRgQNMiGZtM0TAHkxRZQ7EoVvIG8E47J4nAsMJxXHAUQ+0oc7t0MDxSdONWTFcbzX7/Bg== + dependencies: + bytes "^3.0.0" + compressible "^2.0.0" + http-errors "^1.8.0" + koa-is-json "^1.0.0" + statuses "^2.0.1" + koa-convert@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" @@ -9383,6 +12654,36 @@ koa-convert@^1.2.0: co "^4.6.0" koa-compose "^3.0.0" +koa-is-json@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" + integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= + +koa-mount@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/koa-mount/-/koa-mount-4.0.0.tgz#e0265e58198e1a14ef889514c607254ff386329c" + integrity sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ== + dependencies: + debug "^4.0.1" + koa-compose "^4.1.0" + +koa-send@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" + integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + resolve-path "^1.4.0" + +koa-static@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" + integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== + dependencies: + debug "^3.1.0" + koa-send "^5.0.0" + koa@^2.13.0: version "2.13.1" resolved "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz#6275172875b27bcfe1d454356a5b6b9f5a9b1051" @@ -9443,6 +12744,11 @@ lead@^1.0.0: dependencies: flush-write-stream "^1.0.2" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + lerna@^3.22.0: version "3.22.1" resolved "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -9533,42 +12839,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@^10.0.7: - version "10.5.4" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" - integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== - dependencies: - chalk "^4.1.0" - cli-truncate "^2.1.0" - commander "^6.2.0" - cosmiconfig "^7.0.0" - debug "^4.2.0" - dedent "^0.7.0" - enquirer "^2.3.6" - execa "^4.1.0" - listr2 "^3.2.2" - log-symbols "^4.0.0" - micromatch "^4.0.2" - normalize-path "^3.0.0" - please-upgrade-node "^3.2.0" - string-argv "0.3.1" - stringify-object "^3.3.0" - -listr2@^3.2.2: - version "3.6.2" - resolved "https://registry.npmjs.org/listr2/-/listr2-3.6.2.tgz#7260159f9108523eaa430d4a674db65b6c2d08cc" - integrity sha512-B2vlu7Zx/2OAMVUovJ7Tv1kQ2v2oXd0nZKzkSAcRCej269d8gkS/gupDEdNl23KQ3ZjVD8hQmifrrBFbx8F9LA== - dependencies: - chalk "^4.1.0" - cli-truncate "^2.1.0" - figures "^3.2.0" - indent-string "^4.0.0" - log-update "^4.0.0" - p-map "^4.0.0" - rxjs "^6.6.7" - through "^2.3.8" - wrap-ansi "^7.0.0" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -9580,16 +12850,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -9652,6 +12912,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.11: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -9682,16 +12947,31 @@ lodash.defaults@^4.0.1: resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= -lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + +lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -9702,7 +12982,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.4.0: +lodash.merge@^4.4.0, 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== @@ -9742,6 +13022,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -9752,12 +13037,7 @@ lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.19: - version "4.17.19" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -lodash@4.x, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.1, lodash@^4.7.0: +lodash@4.x, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9767,23 +13047,18 @@ log-driver@^1.2.7: resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -log-symbols@^4.0.0: +log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + resolved "https://registry.npm.taobao.org/log-symbols/download/log-symbols-4.1.0.tgz?cache=0&sync_timestamp=1618723146520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-symbols%2Fdownload%2Flog-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha1-P727lbRoOsn8eFER55LlWNSr1QM= dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" +long-timeout@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" + integrity sha1-lyHXiLR+C8taJMLivuGg2lXatRQ= long@^4.0.0: version "4.0.0" @@ -9815,6 +13090,13 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^2.0.1, 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" @@ -9847,17 +13129,29 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +luxon@^1.26.0: + version "1.28.0" + resolved "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" + integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= macos-release@^2.2.0: - version "2.4.1" - resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" - integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== + version "2.5.0" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" + integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== -magic-string@^0.25.5, magic-string@^0.25.7: +magic-string@^0.25.2, magic-string@^0.25.5, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== @@ -9879,7 +13173,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +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== @@ -9950,13 +13244,14 @@ markdown-table@^2.0.0: repeat-string "^1.0.0" mathjax-full@^3.0.0: - version "3.1.2" - resolved "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.1.2.tgz#53ac5b38252379d515d60e99092672b42725bf6a" - integrity sha512-jFCwRFdFwIOa8J7r6VZT0AIv9ZwbLQ9aPc9YZp695NTvv7XKU2NunJodA+zDWzElIFJ7mTsImyfe5R3QyRNZjw== + version "3.2.0" + resolved "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.0.tgz#e53269842a943d4df10502937518991268996c5c" + integrity sha512-D2EBNvUG+mJyhn+M1C858k0f2Fc4KxXvbEX2WCMXroV10212JwfYqaBJ336ECBSz5X9L5LRoamxb7AJtg3KaJA== dependencies: esm "^3.2.25" + mhchemparser "^4.1.0" mj-context-menu "^0.6.1" - speech-rule-engine "^3.1.1" + speech-rule-engine "^3.3.3" md5.js@^1.3.4: version "1.3.5" @@ -10103,6 +13398,25 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memoize-one@^5.1.1: + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +memoizee@0.4.X: + version "0.4.15" + resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== + dependencies: + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" + memory-fs@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" @@ -10159,6 +13473,11 @@ meow@^8.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 sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + merge-stream@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -10171,16 +13490,21 @@ merge-stream@^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.2.3: +merge2@^1.2.3, merge2@^1.3.0: 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.1, methods@^1.1.2: +methods@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +mhchemparser@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz#a2142fdab37a02ec8d1b48a445059287790becd5" + integrity sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA== + micromark-extension-frontmatter@^0.2.0: version "0.2.2" resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz#61b8e92e9213e1d3c13f5a59e7862f5ca98dfa53" @@ -10268,7 +13592,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.0, micromatch@^4.0.2: +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -10284,24 +13608,41 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.47.0: - version "1.47.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +"mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-match@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" + integrity sha1-P4fDHprxpf1IX7nbE0Qosju7e6g= + dependencies: + wildcard "^1.1.0" mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.30" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + version "2.1.32" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - mime-db "1.47.0" + mime-db "1.49.0" + +mime@1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + integrity sha1-WR2E02U6awtKO5343lqoEI5y5eA= mime@^1.4.1: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: +mime@^2.4.4, mime@^2.4.5, mime@^2.4.6, mime@^2.5.2: version "2.5.2" resolved "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== @@ -10321,6 +13662,13 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -10334,14 +13682,6 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-store@^3.0.1: - version "3.0.6" - resolved "https://registry.npmjs.org/mini-store/-/mini-store-3.0.6.tgz#44b86be5b2877271224ce0689b3a35a2dffb1ca9" - integrity sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ== - dependencies: - hoist-non-react-statics "^3.3.2" - shallowequal "^1.0.2" - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10376,12 +13716,12 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -10389,13 +13729,28 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.2.1: +minipass@^3.0.0: + version "3.1.3" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: minipass "^2.9.0" +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -10432,18 +13787,25 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*, mkdirp@1.0.4, mkdirp@1.x: +mkdirp@*, mkdirp@1.0.4, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +mockjs@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06" + integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ== + dependencies: + commander "*" + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -10461,11 +13823,21 @@ moment-timezone@^0.5.31, moment-timezone@^0.5.x: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.24.0, moment@^2.25.3, moment@^2.26.0: +"moment@>= 2.9.0", moment@^2.24.0, moment@^2.25.3, moment@^2.26.0, moment@^2.29.1: version "2.29.1" resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +monaco-editor@^0.25.2: + version "0.25.2" + resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.25.2.tgz#119e2b15bbd968a1a99c03cac9c329316d7c37e9" + integrity sha512-5iylzSJevCnzJn9UVsW8yOZ3yHjmAs4TfvH3zsbftKiFKmHG0xirGN6DK9Kk04VSWxYCZZAIafYJoNJJMAU1KA== + +moo@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -10493,6 +13865,20 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multer@^1.4.2: + version "1.4.3" + resolved "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz#4db352d6992e028ac0eacf7be45c6efd0264297b" + integrity sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg== + dependencies: + append-field "^1.0.0" + busboy "^0.2.11" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + multimatch@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" @@ -10514,9 +13900,9 @@ mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== mysql2@^2.1.0: - version "2.2.5" - resolved "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz#72624ffb4816f80f96b9c97fedd8c00935f9f340" - integrity sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g== + version "2.3.0" + resolved "https://registry.npmjs.org/mysql2/-/mysql2-2.3.0.tgz#600f5cc27e397dfb77b59eac93666434f88e8079" + integrity sha512-0t5Ivps5Tdy5YHk5NdKwQhe/4Qyn2pload+S+UooDBvsqngtzujG1BaTWBihQLfeKO3t3122/GtusBtmHEHqww== dependencies: denque "^1.4.1" generate-function "^2.3.1" @@ -10527,7 +13913,18 @@ mysql2@^2.1.0: seq-queue "^0.0.5" sqlstring "^2.3.2" -mz@^2.5.0: +mz-modules@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz#7f529877afd0d42f409a7463b96986d61cfbcf96" + integrity sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog== + dependencies: + glob "^7.1.2" + ko-sleep "^1.0.3" + mkdirp "^0.5.1" + pump "^3.0.0" + rimraf "^2.6.1" + +mz@^2.5.0, mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== @@ -10543,6 +13940,11 @@ named-placeholders@^1.1.2: dependencies: lru-cache "^4.1.3" +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -10570,6 +13972,16 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.7.10: + version "2.20.1" + resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + needle@2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -10579,6 +13991,15 @@ needle@2.4.0: iconv-lite "^0.4.4" sax "^1.2.4" +needle@^2.2.1: + version "2.9.1" + resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.2: version "0.6.2" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -10594,11 +14015,34 @@ netmask@^2.0.1: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== +next-tick@1, next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^3.0.0, node-addon-api@^3.1.0: + version "3.2.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-fetch-npm@^2.0.2: version "2.0.4" resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" @@ -10608,6 +14052,11 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" +node-fetch@2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -10621,6 +14070,24 @@ node-fetch@^2.5.0, node-fetch@^2.6.1: resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-gyp@3.x: + version "3.8.0" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -10677,6 +14144,17 @@ node-modules-regexp@^1.0.0: resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-notifier@^5.4.2: + version "5.4.5" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-notifier@^8.0.0: version "8.0.2" resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" @@ -10689,15 +14167,62 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" -nodemon@^2.0.4: - version "2.0.7" - resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32" - integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== +node-releases@^1.1.73: + version "1.1.74" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz#e5866488080ebaa70a93b91144ccde06f3c3463e" + integrity sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw== + +node-schedule@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/node-schedule/-/node-schedule-2.0.0.tgz#73ab4957d056c63708409cc1fab676e0e149c191" + integrity sha512-cHc9KEcfiuXxYDU+HjsBVo2FkWL1jRAUoczFoMIzRBpOA4p/NRHuuLs85AWOLgKsHtSPjN8csvwIxc2SqMv+CQ== + dependencies: + cron-parser "^3.1.0" + long-timeout "0.1.1" + sorted-array-functions "^1.3.0" + +node-xlsx@^0.16.1: + version "0.16.2" + resolved "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.16.2.tgz#40f580187eae0e032cac96e958e97cb6ceca09f6" + integrity sha512-ZT3Y4Zg2BFC2UWdp9B/6x3GqrFL0Bf0cXKy9IyhcwlKbcDAf5GuPAPSqrWFQK68NIpfTNA1Kr/NNjpwYxUgHTA== + dependencies: + "@babel/runtime" "^7.14.6" + buffer-from "^1.1.1" + xlsx "^0.17.0" + +nodemailer-mock@^1.5.11: + version "1.5.11" + resolved "https://registry.npmjs.org/nodemailer-mock/-/nodemailer-mock-1.5.11.tgz#1bb6b9af44e9007380191d32e33555ea136a819f" + integrity sha512-RbqkppKkptTgSzry3q8u/YD8pxulln/hYQ30O5brFRki8gEKv7KoAYGwfErZM2VsI7nGNBYRo5IOLnMW3NXBcw== + dependencies: + debug "^4.3.2" + nodemailer "^6.x" + +nodemailer@^6.6.1, nodemailer@^6.x: + version "6.6.5" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz#f9f6953cee5cfe82cbea152eeddacf7a0442049a" + integrity sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A== + +nodemon@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz#5dae4e162b617b91f1873b3bfea215dd71e144d5" + integrity sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA== dependencies: chokidar "^3.2.2" debug "^3.2.6" @@ -10710,6 +14235,13 @@ nodemon@^2.0.4: undefsafe "^2.0.3" update-notifier "^4.1.0" +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -10718,6 +14250,13 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -10745,12 +14284,7 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= - -normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -10777,15 +14311,20 @@ normalize-url@1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" -normalize-url@^3.0.0, normalize-url@^3.3.0: +normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + 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.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== normalize.css@^7.0.0: version "7.0.0" @@ -10800,9 +14339,9 @@ now-and-later@^2.0.0: once "^1.3.2" npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + version "1.1.2" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" @@ -10835,7 +14374,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.4.4: +npm-packlist@^1.1.6, npm-packlist@^1.4.4: version "1.4.8" resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -10860,14 +14399,14 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -10892,6 +14431,13 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + dependencies: + boolbase "^1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -10902,7 +14448,7 @@ number-is-nan@^1.0.0: resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.2.0: +nwsapi@^2.0.7, nwsapi@^2.1.3, nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -10912,7 +14458,7 @@ oauth-sign@~0.9.0: resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.X, object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -10926,16 +14472,29 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +object-inspect@^1.11.0, object-inspect@^1.7.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.2, object-is@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" object-keys@^1.0.12, 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-path@^0.11.4: + version "0.11.5" + resolved "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" + integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -10953,7 +14512,26 @@ object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: +object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +object.fromentries@^2.0.3, object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== @@ -10969,15 +14547,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.3" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.3, object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.18.2" octokit-pagination-methods@^1.1.0: version "1.1.0" @@ -11005,7 +14582,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: +onetime@^5.1.0, 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== @@ -11041,6 +14618,21 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.nlark.com/ora/download/ora-5.4.1.tgz?cache=0&sync_timestamp=1631556513877&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fora%2Fdownload%2Fora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg= + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ordered-read-streams@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" @@ -11066,12 +14658,20 @@ os-name@^3.1.0: macos-release "^2.2.0" windows-release "^3.1.0" +os-name@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" + integrity sha1-GzefZINa98Wn9JizV8uVIVwVnt8= + dependencies: + osx-release "^1.0.0" + win-release "^1.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4, osenv@^0.1.5: +osenv@0, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -11079,11 +14679,25 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osx-release@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz#f217911a28136949af1bf9308b241e2737d3cd6c" + integrity sha1-8heRGigTaUmvG/kwiyQeJzfTzWw= + dependencies: + minimist "^1.1.0" + 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-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -11141,18 +14755,16 @@ p-map@^2.1.0: resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -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-pipe@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= +p-queue@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34" + integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== + p-queue@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346" @@ -11212,6 +14824,21 @@ pac-proxy-agent@^4.1.0: raw-body "^2.2.0" socks-proxy-agent "5" +pac-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e" + integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + get-uri "3" + http-proxy-agent "^4.0.1" + https-proxy-agent "5" + pac-resolver "^5.0.0" + raw-body "^2.2.0" + socks-proxy-agent "5" + pac-resolver@^4.1.0: version "4.2.0" resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz#b82bcb9992d48166920bc83c7542abb454bd9bdd" @@ -11221,6 +14848,15 @@ pac-resolver@^4.1.0: ip "^1.1.5" netmask "^2.0.1" +pac-resolver@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz#1d717a127b3d7a9407a16d6e1b012b13b9ba8dc0" + integrity sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA== + dependencies: + degenerator "^3.0.1" + ip "^1.1.5" + netmask "^2.0.1" + package-json@^6.3.0: version "6.5.0" resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -11255,6 +14891,14 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +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" @@ -11330,17 +14974,34 @@ parse-path@^4.0.0: qs "^6.9.4" query-string "^6.13.8" -parse-url@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" - integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== +parse-url@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" + integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== dependencies: is-ssh "^1.3.0" - normalize-url "^3.3.0" + normalize-url "^6.1.0" parse-path "^4.0.0" protocols "^1.4.0" -parse5@6.0.1, parse5@^6.0.0: +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -11350,6 +15011,14 @@ parseurl@^1.3.2: resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.1, 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" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -11382,7 +15051,7 @@ path-exists@^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: +path-is-absolute@1.0.1, 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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -11403,11 +15072,11 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + 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@^1.7.0: +path-to-regexp@1.x, 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== @@ -11428,13 +15097,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -11447,6 +15109,13 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@~0.0.11: + version "0.0.11" + resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= + dependencies: + through "~2.3" + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -11458,6 +15127,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pdfast@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/pdfast/-/pdfast-0.2.0.tgz#8cbc556e1bf2522177787c0de2e0d4373ba885c9" + integrity sha1-jLxVbhvyUiF3eHwN4uDUNzuohck= + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -11469,21 +15143,21 @@ pg-connection-string@^2.5.0: integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== pg-hstore@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.3.tgz#d1978c12a85359830b1388d3b0ff233b88928e96" - integrity sha512-qpeTpdkguFgfdoidtfeTho1Q1zPVPbtMHgs8eQ+Aan05iLmIs3Z3oo5DOZRclPGoQ4i68I1kCtQSJSa7i0ZVYg== + version "2.3.4" + resolved "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz#4425e3e2a3e15d2a334c35581186c27cf2e9b8dd" + integrity sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA== dependencies: - underscore "^1.7.0" + underscore "^1.13.1" pg-int8@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz#12d5c7f65ea18a6e99ca9811bd18129071e562fc" - integrity sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg== +pg-pool@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" + integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== pg-protocol@^1.5.0: version "1.5.0" @@ -11501,15 +15175,15 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.3.0: - version "8.6.0" - resolved "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz#e222296b0b079b280cce106ea991703335487db2" - integrity sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ== +pg@^8.3.3, pg@^8.6.0: + version "8.7.1" + resolved "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" + integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" pg-connection-string "^2.5.0" - pg-pool "^3.3.0" + pg-pool "^3.4.1" pg-protocol "^1.5.0" pg-types "^2.1.0" pgpass "1.x" @@ -11522,11 +15196,11 @@ pgpass@1.x: split2 "^3.1.1" picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + version "2.3.0" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pidusage@2.0.21: +pidusage@2.0.21, pidusage@^2.0.21: version "2.0.21" resolved "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz#7068967b3d952baea73e57668c98b9eaa876894e" integrity sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA== @@ -11601,12 +15275,17 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= dependencies: - semver-compare "^1.0.0" + find-up "^2.1.0" + +platform@^1.3.1: + version "1.3.6" + resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== plugin-error@^0.1.2: version "0.1.2" @@ -11629,7 +15308,7 @@ plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -pm2-axon-rpc@~0.7.0: +pm2-axon-rpc@~0.7.0, pm2-axon-rpc@~0.7.1: version "0.7.1" resolved "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz#2daec5383a63135b3f18babb70266dacdcbc429a" integrity sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw== @@ -11661,12 +15340,23 @@ pm2-multimeter@^0.1.2: dependencies: charm "~0.1.1" -pm2@^4.5.6: - version "4.5.6" - resolved "https://registry.npmjs.org/pm2/-/pm2-4.5.6.tgz#2f477a158957860e440f1e71e88dc82627fcff99" - integrity sha512-4J5q704Xl6VmpmQhXFGMJL4kXyyQw3AZM1FE9vRxhS3LiDI/+WVBtOM6pqJ4g/RKW+AUjEkc23i/DCC4BVenDA== +pm2-sysmonit@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz#eddea34a53fd8c8d7c3efb73b97a3c548686e24d" + integrity sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA== + dependencies: + async "^3.2.0" + debug "^4.3.1" + pidusage "^2.0.21" + systeminformation "^5.7" + tx2 "~1.0.4" + +pm2@^5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/pm2/-/pm2-5.1.2.tgz#bffe4e9a84ee013362717eaad1b39b4d73f0fcd0" + integrity sha512-2nJQeCWjkN0WnTkWctaoZpqrJTiUN/Icw76IMVHHzPhr/p7yQYlEQgHzlL5IFWxO2N1HdBNXNdZft2p4HUmUcA== dependencies: - "@pm2/agent" "~1.0.8" + "@pm2/agent" "~2.0.0" "@pm2/io" "~5.0.0" "@pm2/js-api" "~0.6.7" "@pm2/pm2-version-check" latest @@ -11686,16 +15376,22 @@ pm2@^4.5.6: needle "2.4.0" pidusage "2.0.21" pm2-axon "~4.0.1" - pm2-axon-rpc "~0.7.0" + pm2-axon-rpc "~0.7.1" pm2-deploy "~1.0.2" pm2-multimeter "^0.1.2" promptly "^2" - ps-list "6.3.0" semver "^7.2" source-map-support "0.5.19" sprintf-js "1.1.2" - vizion "2.2.1" + vizion "~2.2.1" yamljs "0.3.0" + optionalDependencies: + pm2-sysmonit "^1.2.8" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== posix-character-classes@^0.1.0: version "0.1.1" @@ -12047,6 +15743,17 @@ postcss-modules-values@1.3.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-modules@^1.4.1: + version "1.5.0" + resolved "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.5.0.tgz#08da6ce43fcfadbc685a021fe6ed30ef929f0bcc" + integrity sha512-KiAihzcV0TxTTNA5OXreyIXctuHOfR50WIhqBpc8pe0Q5dcs/Uap9EVlifOI9am7zGGdGOJQ6B1MPYKo2UxgOg== + dependencies: + css-modules-loader-core "^1.1.0" + generic-names "^2.0.1" + lodash.camelcase "^4.3.0" + postcss "^7.0.1" + string-hash "^1.1.1" + postcss-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postcss-modules/-/postcss-modules-2.0.0.tgz#473d0d7326651d8408585c2a154115d5cb36cce0" @@ -12297,13 +16004,11 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.6" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" postcss-svgo@^4.0.3: @@ -12371,9 +16076,9 @@ postcss@^6.0.1: supports-color "^5.4.0" postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.35" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + version "7.0.36" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -12421,17 +16126,32 @@ prepend-http@^2.0.0: resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +prettier@1.15.3: + version "1.15.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a" + integrity sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg== + prettier@2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -prettier@^1.19.1: - version "1.19.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.3.0: + version "2.3.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" -pretty-format@^26.0.0, pretty-format@^26.6.2: +pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -12441,17 +16161,30 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.0, pretty-format@^27.2.0: + version "27.2.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz#ee37a94ce2a79765791a8649ae374d468c18ef19" + integrity sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA== + dependencies: + "@jest/types" "^27.1.1" + ansi-regex "^5.0.0" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +printj@~1.1.0, printj@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + prism-react-renderer@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz#5ad4f90c3e447069426c8a53a0eafde60909cdf4" - integrity sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg== + version "1.2.1" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" + integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== prismjs@^1.21.0: - version "1.23.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== - optionalDependencies: - clipboard "^2.0.0" + version "1.24.1" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz#c4d7895c4d6500289482fa8936d9cdd192684036" + integrity sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow== process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" @@ -12522,7 +16255,16 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.2: +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + +prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -12555,7 +16297,7 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-agent@~4.0.1: +proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz#326c3250776c7044cd19655ccbfadf2e065a045c" integrity sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA== @@ -12569,6 +16311,20 @@ proxy-agent@~4.0.1: proxy-from-env "^1.0.0" socks-proxy-agent "^5.0.0" +proxy-agent@~5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" + integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== + dependencies: + agent-base "^6.0.0" + debug "4" + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + lru-cache "^5.1.1" + pac-proxy-agent "^5.0.0" + proxy-from-env "^1.0.0" + socks-proxy-agent "^5.0.0" + proxy-from-env@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -12579,11 +16335,6 @@ prr@~1.0.1: resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -ps-list@6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz#a2b775c2db7d547a28fbaa3a05e4c281771259be" - integrity sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA== - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -12663,7 +16414,7 @@ q@^1.1.2, q@^1.5.1: resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@^6.5.1, qs@^6.5.2, qs@^6.9.4: +qs@^6.4.0, qs@^6.5.2, qs@^6.9.1, qs@^6.9.4: version "6.10.1" resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== @@ -12703,6 +16454,11 @@ querystring@0.2.0: resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +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== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -12713,13 +16469,26 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -raf@^3.1.0, raf@^3.3.2, raf@^3.4.0: +raf@^3.1.0, raf@^3.3.2, raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -12756,13 +16525,14 @@ rc-align@^2.4.0: rc-util "^4.0.4" rc-align@^4.0.0: - version "4.0.9" - resolved "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz#46d8801c4a139ff6a65ad1674e8efceac98f85f2" - integrity sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw== + version "4.0.11" + resolved "https://registry.npmjs.org/rc-align/-/rc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" + integrity sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" dom-align "^1.7.0" + lodash "^4.17.21" rc-util "^5.3.0" resize-observer-polyfill "^1.5.1" @@ -12780,9 +16550,9 @@ rc-animate@2.x, rc-animate@^2.4.4: react-lifecycles-compat "^3.0.4" rc-cascader@~1.4.0: - version "1.4.2" - resolved "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.2.tgz#caa81098e3ef4d5f823f9156f6d8d6dbd6321afa" - integrity sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ== + version "1.4.3" + resolved "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.3.tgz#d91b0dcf8157b60ebe9ec3e58b4db054d5299464" + integrity sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA== dependencies: "@babel/runtime" "^7.12.5" array-tree-filter "^2.1.0" @@ -12819,9 +16589,9 @@ rc-collapse@~1.9.1: rc-animate "2.x" rc-collapse@~3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.0.tgz#4ce5e612568c5fbeaf368cc39214471c1461a1a1" - integrity sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ== + version "3.1.1" + resolved "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.1.tgz#2421d454e85781d1cf2f04f906918e0677d779e6" + integrity sha512-/oetKApTHzGGeR8Q8vD168EXkCs2MpEIrURGyy2D+LrrJd29LY/huuIMvOiJoSV6W3bcGhJqIdgHtg1Dxn1smA== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -12829,10 +16599,10 @@ rc-collapse@~3.1.0: rc-util "^5.2.1" shallowequal "^1.1.0" -rc-dialog@~8.5.0, rc-dialog@~8.5.1: - version "8.5.2" - resolved "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz#530e289c25a31c15c85a0e8a4ba3f33414bff418" - integrity sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw== +rc-dialog@~8.6.0: + version "8.6.0" + resolved "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.6.0.tgz#3b228dac085de5eed8c6237f31162104687442e7" + integrity sha512-GSbkfqjqxpZC5/zc+8H332+q5l/DKUhpQr0vdX2uDsxo5K0PhvaMEVjyoJUTkZ3+JstEADQji1PVLVb/2bJeOQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -12848,7 +16618,7 @@ rc-drawer@~4.3.0: classnames "^2.2.6" rc-util "^5.7.0" -rc-dropdown@^3.1.3, rc-dropdown@~3.2.0: +rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz#da6c2ada403842baee3a9e909a0b1a91ba3e1090" integrity sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw== @@ -12858,9 +16628,9 @@ rc-dropdown@^3.1.3, rc-dropdown@~3.2.0: rc-trigger "^5.0.4" rc-field-form@~1.20.0: - version "1.20.0" - resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.0.tgz#2201092095429f7f020825462835c4086d2baf16" - integrity sha512-jkzsIfXR7ywEYdeAtktt1aLff88wxIPDLpq7KShHNl4wlsWrCE+TzkXBfjvVzYOVZt5GGrD8YDqNO/q6eaR/eA== + version "1.20.1" + resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.1.tgz#d1c51888107cf075b42704b7b575bef84c359291" + integrity sha512-f64KEZop7zSlrG4ef/PLlH12SLn6iHDQ3sTG+RfKBM45hikwV1i8qMf53xoX12NvXXWg1VwchggX/FSso4bWaA== dependencies: "@babel/runtime" "^7.8.4" async-validator "^3.0.3" @@ -12873,105 +16643,105 @@ rc-gesture@~0.0.18, rc-gesture@~0.0.22: dependencies: babel-runtime "6.x" -rc-image@~5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/rc-image/-/rc-image-5.2.4.tgz#ff1059f937bde6ca918c6f1beb316beba911f255" - integrity sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q== +rc-image@~5.2.5: + version "5.2.5" + resolved "https://registry.npmjs.org/rc-image/-/rc-image-5.2.5.tgz#44e6ffc842626827960e7ab72e1c0d6f3a8ce440" + integrity sha512-qUfZjYIODxO0c8a8P5GeuclYXZjzW4hV/5hyo27XqSFo1DmTCs2HkVeQObkcIk5kNsJtgsj1KoPThVsSc/PXOw== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" - rc-dialog "~8.5.0" + rc-dialog "~8.6.0" rc-util "^5.0.6" -rc-input-number@~7.0.1: - version "7.0.6" - resolved "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.0.6.tgz#26ab51f28215abef8df0bd99ec5facb884480abc" - integrity sha512-J5DIoCKIunoPb16FEghaEOyNDuZXD5F9LxLNcqd31z/0e37XtuHgo4QF/TonKLsESwdg7UAzWhiD0K6PPrN3YQ== +rc-input-number@~7.1.0: + version "7.1.4" + resolved "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.1.4.tgz#9d7410c91ff8dc6384d0233c20df278982989f9a" + integrity sha512-EG4iqkqyqzLRu/Dq+fw2od7nlgvXLEatE+J6uhi3HXE1qlM3C7L6a7o/hL9Ly9nimkES2IeQoj3Qda3I0izj3Q== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" rc-util "^5.9.8" -rc-mentions@~1.5.0: - version "1.5.3" - resolved "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.5.3.tgz#b92bebadf8ad9fb3586ba1af922d63b49d991c67" - integrity sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ== +rc-mentions@~1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae" + integrity sha512-LDzGI8jJVGnkhpTZxZuYBhMz3avcZZqPGejikchh97xPni/g4ht714Flh7DVvuzHQ+BoKHhIjobHnw1rcP8erg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" - rc-menu "^8.0.1" + rc-menu "^9.0.0" rc-textarea "^0.3.0" rc-trigger "^5.0.4" rc-util "^5.0.1" -rc-menu@^8.0.1, rc-menu@^8.6.1, rc-menu@~8.10.0: - version "8.10.7" - resolved "https://registry.npmjs.org/rc-menu/-/rc-menu-8.10.7.tgz#8ea2d2c27137f77a8580c403df634ec5d780f046" - integrity sha512-m/ypV7OjkkUsMdutzMUxEI8tWyi0Y1TQ5YkSDk7k2uv2aCKkHYEoDKsDAfcPeejo3HMo2z5unWE+jD+dCphraw== +rc-menu@^9.0.0, rc-menu@~9.0.12: + version "9.0.12" + resolved "https://registry.npmjs.org/rc-menu/-/rc-menu-9.0.12.tgz#492c4bb07a596e2ce07587c669b27ee28c3810c5" + integrity sha512-8uy47DL36iDEwVZdUO/fjhhW5+4j0tYlrCsOzw6iy8MJqKL7/HC2pj7sL/S9ayp2+hk9fYQYB9Tu+UN+N2OOOQ== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" - mini-store "^3.0.1" - rc-motion "^2.0.1" + rc-motion "^2.4.3" + rc-overflow "^1.2.0" rc-trigger "^5.1.2" - rc-util "^5.7.0" - resize-observer-polyfill "^1.5.0" + rc-util "^5.12.0" shallowequal "^1.1.0" -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz#323f47c8635e6b2bc0cba2dfad25fc415b58e1dc" - integrity sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg== +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0, rc-motion@^2.4.3: + version "2.4.4" + resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" + integrity sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-util "^5.2.1" -rc-notification@~4.5.2: - version "4.5.5" - resolved "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.5.tgz#9660a495d5f20bd677686e4f7fc00e4f0c1a3849" - integrity sha512-YIfhTSw+h5GsSdgMnuMx24wqiPlg3FeamuOlkh9RkyHx+SeZVAKzQ0juy2NGvPEF2hDWi5xTqxUqLdo0L2AmGg== +rc-notification@~4.5.7: + version "4.5.7" + resolved "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1" + integrity sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^2.2.0" rc-util "^5.0.1" -rc-overflow@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.1.1.tgz#c465e75f115f1b4b0cbe5e05faf3a84469d18190" - integrity sha512-bkGrxvWtz6xQfxBPBQcN8xOEHFCeG0R4pfLAku6kFLQF9NPMTt5HvT+Bq0+stqom9eI3WRlun6RPzfjTamPwew== +rc-overflow@^1.0.0, rc-overflow@^1.2.0: + version "1.2.2" + resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.2.tgz#95b0222016c0cdbdc0db85f569c262e7706a5f22" + integrity sha512-X5kj9LDU1ue5wHkqvCprJWLKC+ZLs3p4He/oxjZ1Q4NKaqKBaYf5OdSzRSgh3WH8kSdrfU8LjvlbWnHgJOEkNQ== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-resize-observer "^1.0.0" rc-util "^5.5.1" -rc-pagination@~3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.6.tgz#db3c06e50270b52fe272ac527c1fdc2c8d28af1f" - integrity sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw== +rc-pagination@~3.1.9: + version "3.1.9" + resolved "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.9.tgz#797ad75d85b1ef7a82801207ead410110337fdd6" + integrity sha512-IKBKaJ4icVPeEk9qRHrFBJmHxBUrCp3+nENBYob4Ofqsu3RXjBOy4N36zONO7oubgLyiG3PxVmyAuVlTkoc7Jg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" rc-picker@~2.5.10: - version "2.5.10" - resolved "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.10.tgz#0db17c535a37abbe5d016bdcdfb13d6626f802d0" - integrity sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA== + version "2.5.15" + resolved "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.15.tgz#7270c11815ca4be2ad931a9d9120099fc1820ab7" + integrity sha512-txKEj20LJuxKFlRKT727Qju7Xsek0WnB6xDaCrmSCiuEBGO5DlG57Wy8zhKgQgMY3+afVrQAzyg13mYonGuXyg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" - date-fns "^2.15.0" + date-fns "2.x" + dayjs "1.x" moment "^2.24.0" rc-trigger "^5.0.4" rc-util "^5.4.0" shallowequal "^1.1.0" rc-progress@~3.1.0: - version "3.1.3" - resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.3.tgz#d77d8fd26d9d948d72c2a28b64b71a6e86df2426" - integrity sha512-Jl4fzbBExHYMoC6HBPzel0a9VmhcSXx24LVt/mdhDM90MuzoMCJjXZAlhA0V0CJi+SKjMhfBoIQ6Lla1nD4QNw== + version "3.1.4" + resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.4.tgz#66040d0fae7d8ced2b38588378eccb2864bad615" + integrity sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -12996,9 +16766,9 @@ rc-resize-observer@^1.0.0: resize-observer-polyfill "^1.5.1" rc-select@^12.0.0, rc-select@~12.1.6: - version "12.1.9" - resolved "https://registry.npmjs.org/rc-select/-/rc-select-12.1.9.tgz#87b1bbb58649bc4a4d7961c1f1aa36a16c011a59" - integrity sha512-jsqcdby3Ag9ohYQ0d4vS4Q2jeWjj6kb2NHS9WcQSse0/5lCb3mqXI/1fkKRRIhdQvMBklYh4ctSox3mDrZiB8A== + version "12.1.13" + resolved "https://registry.npmjs.org/rc-select/-/rc-select-12.1.13.tgz#c33560ccb9339d30695b52458f55efc35af35273" + integrity sha512-cPI+aesP6dgCAaey4t4upDbEukJe+XN0DK6oO/6flcCX5o28o7KNZD7JAiVtC/6fCwqwI/kSs7S/43dvHmBl+A== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -13060,26 +16830,26 @@ rc-switch@~3.2.0: classnames "^2.2.1" rc-util "^5.0.1" -rc-table@~7.13.0: - version "7.13.3" - resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.13.3.tgz#25d5f5ec47ee2d8a293aff18c4c4b8876f78c22b" - integrity sha512-oP4fknjvKCZAaiDnvj+yzBaWcg+JYjkASbeWonU1BbrLcomkpKvMUgPODNEzg0QdXA9OGW0PO86h4goDSW06Kg== +rc-table@~7.15.1: + version "7.15.2" + resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.15.2.tgz#f6ab73b2cfb1c76f3cf9682c855561423c6b5b22" + integrity sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" rc-resize-observer "^1.0.0" - rc-util "^5.4.0" + rc-util "^5.13.0" shallowequal "^1.1.0" -rc-tabs@^11.7.1, rc-tabs@~11.7.0: - version "11.7.3" - resolved "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.3.tgz#32a30e59c6992d60fb58115ba0bf2652b337ed43" - integrity sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w== +rc-tabs@^11.7.1, rc-tabs@~11.10.0: + version "11.10.1" + resolved "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.10.1.tgz#7b112f78bac998480c777ae160adc425e3fdb7cb" + integrity sha512-ey1i2uMyfnRNYbViLcUYGH+Y7hueJbdCVSLaXnXki9hxBcGqxJMPy9t5xR0n/3QFQspj7Tf6+2VTXVtmO7Yaug== dependencies: "@babel/runtime" "^7.11.2" classnames "2.x" - rc-dropdown "^3.1.3" - rc-menu "^8.6.1" + rc-dropdown "^3.2.0" + rc-menu "^9.0.0" rc-resize-observer "^1.0.0" rc-util "^5.5.0" @@ -13102,18 +16872,18 @@ rc-tooltip@^3.4.2: prop-types "^15.5.8" rc-trigger "^2.2.2" -rc-tooltip@^5.0.1, rc-tooltip@~5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz#abb453c463c31a705aa01d268279f4ae6ae3b15f" - integrity sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ== +rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" + integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA== dependencies: "@babel/runtime" "^7.11.2" rc-trigger "^5.0.0" rc-tree-select@~4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.1.tgz#4881bae5f6a5d696c5f61e52ad9489313f356eb4" - integrity sha512-OeV8u5kBEJ8MbatP04Rh8T3boOHGjdGBTEm1a0bubBbB2GNNhlMOr4ZxezkHYtXf02JdBS/WyydmI/RMjXgtJA== + version "4.3.3" + resolved "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.3.tgz#28eba4d8a8dc8c0f9b61d83ce465842a6915eca4" + integrity sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -13121,10 +16891,10 @@ rc-tree-select@~4.3.0: rc-tree "^4.0.0" rc-util "^5.0.5" -rc-tree@^4.0.0, rc-tree@~4.1.0: - version "4.1.5" - resolved "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz#734ab1bfe835e78791be41442ca0e571147ab6fa" - integrity sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ== +rc-tree@^4.0.0, rc-tree@~4.2.1: + version "4.2.2" + resolved "https://registry.npmjs.org/rc-tree/-/rc-tree-4.2.2.tgz#4429187cbbfbecbe989714a607e3de8b3ab7763f" + integrity sha512-V1hkJt092VrOVjNyfj5IYbZKRMHxWihZarvA5hPL/eqm7o2+0SNkeidFYm7LVVBrAKBpOpa0l8xt04uiqOd+6w== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -13145,10 +16915,10 @@ rc-trigger@^2.2.2: rc-util "^4.4.0" react-lifecycles-compat "^3.0.4" -rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1: - version "5.2.5" - resolved "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.5.tgz#b9a37a0d709b23a1b3a5d7f1727183e6f66773df" - integrity sha512-RlF5RpWqK+JeiFeQVOzwjLFzpNe2FowoXc/42azz+20wr/bYF1Q/MwprUK+3+vs/oFhLC0ht3/NlrslAo/OoWA== +rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1, rc-trigger@^5.2.10: + version "5.2.10" + resolved "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" + integrity sha512-FkUf4H9BOFDaIwu42fvRycXMAvkttph9AlbCZXssZDVzz2L+QZ0ERvfB/4nX3ZFPh1Zd+uVGr1DEDeXxq4J1TA== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" @@ -13156,10 +16926,10 @@ rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1: rc-motion "^2.0.0" rc-util "^5.5.0" -rc-upload@~4.2.0-alpha.0: - version "4.2.0" - resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.2.0.tgz#5e21cab29f10ecb69d71cfb9055912d0e1e08ee0" - integrity sha512-BXtvBs1PnwLjaUzBBU5z4yb9NMSaxc6mUIoPmS9LUAzaTz12L3TLrwu+8dnopYUiyLmYFS3LEO7aUfEWBqJfSA== +rc-upload@~4.3.0: + version "4.3.1" + resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.1.tgz#d6ee66b8bd1e1dd2f78526c486538423f7e7ed84" + integrity sha512-W8Iyv0LRyEnFEzpv90ET/i1XG2jlPzPxKkkOVtDfgh9c3f4lZV770vgpUfiyQza+iLtQLVco3qIvgue8aDiOsQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" @@ -13176,25 +16946,25 @@ rc-util@4.x, rc-util@^4.0.4, rc-util@^4.15.3, rc-util@^4.4.0: react-lifecycles-compat "^3.0.4" shallowequal "^1.1.0" -rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: - version "5.9.8" - resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.9.8.tgz#dfcacc1f7b7c45fa18ab786e2b530dd0509073f1" - integrity sha512-typLSHYGf5irvGLYQshs0Ra3aze086h0FhzsAkyirMunYZ7b3Te8gKa5PVaanoHaZa9sS6qx98BxgysoRP+6Tw== +rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.13.0, rc-util@^5.13.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: + version "5.13.2" + resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.13.2.tgz#a8a0bb77743351841ba8bed6393e03b8d2f685c8" + integrity sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog== dependencies: "@babel/runtime" "^7.12.5" react-is "^16.12.0" shallowequal "^1.1.0" rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0: - version "3.2.6" - resolved "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz#2c92a40f4425e19881b38134d6bd286a11137d2d" - integrity sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q== + version "3.3.0" + resolved "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.3.0.tgz#2f95a6ddbbf63d78b28662b57f1e69f7472762fe" + integrity sha512-lVXpGWC6yMdwV2SHo6kc63WlqjCnb3eO72V726KA2/wh9KA6wi/swcdR3zAowuA8hJxG/lRANmY5kpLZ+Pz3iQ== dependencies: classnames "^2.2.6" rc-resize-observer "^1.0.0" rc-util "^5.0.7" -rc@^1.2.8: +rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -13209,12 +16979,29 @@ react-attr-converter@^0.3.1: resolved "https://registry.npmjs.org/react-attr-converter/-/react-attr-converter-0.3.1.tgz#4a2abf6d907b7ddae4d862dfec80e489ce41ad6e" integrity sha512-dSxo2Mn6Zx4HajeCeQNLefwEO4kNtV/0E682R1+ZTyFRPqxDa5zYb5qM/ocqw9Bxr/kFQO0IUiqdV7wdHw+Cdg== -react-docgen-typescript@^1.20.5: - version "1.22.0" - resolved "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-1.22.0.tgz#00232c8e8e47f4437cac133b879b3e9437284bee" - integrity sha512-MPLbF8vzRwAG3GcjdL+OHQlhgtWsLTXs+7uJiHfEeT3Ur7IsZaNYqRTLQ9sj2nB6M6jylcPCeCmH7qbszJmecg== - -react-dom@16.x: +react-big-calendar@^0.33.6: + version "0.33.6" + resolved "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-0.33.6.tgz#87594b4ce54b4f3cc7f69d52f2d34ddf6b2eb00b" + integrity sha512-4crVUE1W7+zIUfbfrXxd9nDOVktwn8M8Ffrjd39r9zFIveZu1zhrWwi+qqu46EQw2xRnb+mFx+mcwUozkqYlkA== + dependencies: + "@babel/runtime" "^7.1.5" + clsx "^1.0.4" + date-arithmetic "^4.1.0" + dom-helpers "^5.1.0" + invariant "^2.2.4" + lodash "^4.17.11" + lodash-es "^4.17.11" + memoize-one "^5.1.1" + prop-types "^15.7.2" + react-overlays "^4.1.1" + uncontrollable "^7.0.0" + +react-docgen-typescript-dumi-tmp@^1.22.1-0: + version "1.22.1-0" + resolved "https://registry.npmjs.org/react-docgen-typescript-dumi-tmp/-/react-docgen-typescript-dumi-tmp-1.22.1-0.tgz#6f452de05c5c114a6e1dd60b34930afaa7ae39a0" + integrity sha512-wjuAm1yj+ZZucovow2VF0MXkH2SGZ+squZxfNdnam3oyUbHy/xZaU1ZabCn7rY+13ZFx0/NLda+ZuBgF3g8vBA== + +react-dom@16.x, react-dom@^16.8.6: version "16.14.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== @@ -13224,21 +17011,81 @@ react-dom@16.x: prop-types "^15.6.2" scheduler "^0.19.1" -react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +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-fast-compare@^3.1.1: + 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@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-image-lightbox@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.4.tgz#5b847dcb79e9efdf9d7cd5621a92e0f156d2cf30" + integrity sha512-kTiAODz091bgT7SlWNHab0LSMZAPJtlNWDGKv7pLlLY1krmf7FuG1zxE0wyPpeA8gPdwfr3cu6sPwZRqWsc3Eg== + dependencies: + prop-types "^15.7.2" + react-modal "^3.11.1" + +react-intl@3.12.1: + version "3.12.1" + resolved "https://registry.npmjs.org/react-intl/-/react-intl-3.12.1.tgz#e9a783ea20302e9da25e4eda59e5593a43d2ec80" + integrity sha512-cgumW29mwROIqyp8NXStYsoIm27+8FqnxykiLSawWjOxGIBeLuN/+p2srei5SRIumcJefOkOIHP+NDck05RgHg== + dependencies: + "@formatjs/intl-displaynames" "^1.2.0" + "@formatjs/intl-listformat" "^1.4.1" + "@formatjs/intl-relativetimeformat" "^4.5.9" + "@formatjs/intl-unified-numberformat" "^3.2.0" + "@formatjs/intl-utils" "^2.2.0" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/invariant" "^2.2.31" + hoist-non-react-statics "^3.3.2" + intl-format-cache "^4.2.21" + intl-messageformat "^7.8.4" + intl-messageformat-parser "^3.6.4" + shallow-equal "^1.2.1" + +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: 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-is@^17.0.1: +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.0, 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-modal@^3.11.1: + version "3.14.3" + resolved "https://registry.npmjs.org/react-modal/-/react-modal-3.14.3.tgz#7eb7c5ec85523e5843e2d4737cc17fc3f6aeb1c0" + integrity sha512-+C2KODVKyu20zHXPJxfOOcf571L1u/EpFlH+oS/3YDn8rgVE51QZuxuuIwabJ8ZFnOEHaD+r6XNjqwtxZnXO0g== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + react-native-swipeout@^2.2.2: version "2.3.6" resolved "https://registry.npmjs.org/react-native-swipeout/-/react-native-swipeout-2.3.6.tgz#47dac8a835825cf3f2eef9e495574a3d9ab6d3fa" @@ -13248,10 +17095,41 @@ react-native-swipeout@^2.2.2: prop-types "^15.5.10" react-tween-state "^0.1.5" -react-refresh@0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" - integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== +react-overlays@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-4.1.1.tgz#0060107cbe1c5171a744ccda3fbf0556d064bc5f" + integrity sha512-WtJifh081e6M24KnvTQoNjQEpz7HoLxqt8TwZM7LOYIkYJ8i/Ly1Xi7RVte87ZVnmqQ4PFaFiNHZhSINPSpdBQ== + dependencies: + "@babel/runtime" "^7.12.1" + "@popperjs/core" "^2.5.3" + "@restart/hooks" "^0.3.25" + "@types/warning" "^3.0.0" + dom-helpers "^5.2.0" + prop-types "^15.7.2" + uncontrollable "^7.0.0" + warning "^4.0.3" + +react-property@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/react-property/-/react-property-1.0.1.tgz#4ae4211557d0a0ae050a71aa8ad288c074bea4e6" + integrity sha512-1tKOwxFn3dXVomH6pM9IkLkq2Y8oh+fh/lYW3MJ/B03URswUTqttgckOlbxY2XHF3vPG6uanSc4dVsLW/wk3wQ== + +react-redux@^7.1.0: + version "7.2.5" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.5.tgz#213c1b05aa1187d9c940ddfc0b29450957f6a3b8" + integrity sha512-Dt29bNyBsbQaysp6s/dN0gUodcq+dVKKER8Qv82UrpeygwYeX1raTtil7O/fftw/rFqzaf6gJhDZRkkZnn6bjg== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/react-redux" "^7.1.16" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.13.1" + +react-refresh@0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" + integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== react-router-config@5.1.1: version "5.1.1" @@ -13260,7 +17138,7 @@ react-router-config@5.1.1: dependencies: "@babel/runtime" "^7.1.2" -react-router-dom@5.2.0: +react-router-dom@5.2.0, react-router-dom@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== @@ -13273,6 +17151,19 @@ react-router-dom@5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-router-dom@^5.1.2: + version "5.3.0" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + react-router@5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" @@ -13289,6 +17180,72 @@ react-router@5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-router@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== + 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-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== + +react-sortable-hoc@^1.11.0: + version "1.11.0" + resolved "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.11.0.tgz#fe4022362bbafc4b836f5104b9676608a40a278f" + integrity sha512-v1CDCvdfoR3zLGNp6qsBa4J1BWMEVH25+UKxF/RvQRh+mrB+emqtVHMgZ+WreUiKJoEaiwYoScaueIKhMVBHUg== + dependencies: + "@babel/runtime" "^7.2.0" + invariant "^2.2.4" + prop-types "^15.5.7" + +react-sticky-box@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/react-sticky-box/-/react-sticky-box-0.9.3.tgz#8450d4cef8e4fdd7b0351520365bc98c97da11af" + integrity sha512-Y/qO7vTqAvXuRR6G6ZCW4fX2Bz0GZRwiiLTVeZN5CVz9wzs37ev0Xj3KSKF/PzF0jifwATivI4t24qXG8rSz4Q== + dependencies: + "@babel/runtime" "^7.1.5" + resize-observer-polyfill "^1.5.1" + +react-test-renderer@^16.0.0-0: + version "16.14.0" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae" + integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.19.1" + +react-test-renderer@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" + react-tween-state@^0.1.5: version "0.1.5" resolved "https://registry.npmjs.org/react-tween-state/-/react-tween-state-0.1.5.tgz#e98b066551efb93cb92dd1be14995c2e3deae339" @@ -13297,7 +17254,7 @@ react-tween-state@^0.1.5: raf "^3.1.0" tween-functions "^1.0.1" -react@16.x: +react@16.x, react@^16.8.6: version "16.14.0" resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== @@ -13306,6 +17263,14 @@ react@16.x: object-assign "^4.1.1" prop-types "^15.6.2" +react@^17.0.1: + 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-cmd-shim@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" @@ -13340,14 +17305,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -13382,15 +17339,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -13440,7 +17388,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -13459,6 +17407,15 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -13466,6 +17423,20 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.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" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -13490,6 +17461,23 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-saga@^0.16.0: + version "0.16.2" + resolved "https://registry.npmjs.org/redux-saga/-/redux-saga-0.16.2.tgz#993662e86bc945d8509ac2b8daba3a8c615cc971" + integrity sha512-iIjKnRThI5sKPEASpUvySemjzwqwI13e3qP7oLub+FycCRDysLSAOwt958niZW6LhxfmS6Qm1BzbU70w/Koc4w== + +redux@^4.0.0, redux@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" + integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== + dependencies: + "@babel/runtime" "^7.9.2" + +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -13502,6 +17490,11 @@ regenerate@^1.4.0: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== +regenerator-runtime@0.13.2: + version "0.13.2" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-runtime@0.13.5: version "0.13.5" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" @@ -13512,10 +17505,10 @@ regenerator-runtime@^0.11.0: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -13532,10 +17525,18 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: version "4.7.1" @@ -13708,7 +17709,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.9: +request-promise-native@^1.0.5: version "1.0.9" resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -13717,7 +17718,7 @@ request-promise-native@^1.0.9: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.83.0, request@^2.88.0, request@^2.88.2: +request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -13767,6 +17768,16 @@ require-main-filename@^2.0.0: resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -13808,6 +17819,14 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" @@ -13818,6 +17837,11 @@ resolve-url@^0.2.1: resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.7, resolve@~1.1.6: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@1.17.0: version "1.17.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -13825,7 +17849,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.0.0, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.20.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -13833,10 +17857,13 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@~1.1.6: - version "1.1.7" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" responselike@^1.0.2: version "1.0.2" @@ -13855,8 +17882,8 @@ restore-cursor@^2.0.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + resolved "https://registry.nlark.com/restore-cursor/download/restore-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629746923086&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= dependencies: onetime "^5.1.0" signal-exit "^3.0.2" @@ -13878,6 +17905,11 @@ retry@^0.10.0: resolved "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= +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== + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -13895,6 +17927,13 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@2.6.3: version "2.6.3" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -13902,13 +17941,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -14076,6 +18108,45 @@ rmc-trigger@1.x: rc-util "4.x" rmc-align "~1.0.0" +rollup-plugin-commonjs@^9.2.0: + version "9.3.4" + resolved "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz#2b3dddbbbded83d45c36ff101cdd29e924fd23bc" + integrity sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w== + dependencies: + estree-walker "^0.6.0" + magic-string "^0.25.2" + resolve "^1.10.0" + rollup-pluginutils "^2.6.0" + +rollup-plugin-node-resolve@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.0.tgz#9bc6b8205e9936cc0e26bba2415f1ecf1e64d9b2" + integrity sha512-7Ni+/M5RPSUBfUaP9alwYQiIKnKeXCOHiqBpKUl9kwp3jX5ZJtgXAait1cne6pGEVUUztPD6skIKH9Kq9sNtfw== + dependencies: + builtin-modules "^3.0.0" + is-module "^1.0.0" + resolve "^1.8.1" + +rollup-plugin-postcss@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-2.0.3.tgz#1fd5b7e1fc7545cb0084d9c99d11b259e41a05e6" + integrity sha512-d12oKl6za/GGXmlytzVPzzTdPCKgti/Kq2kNhtfm5vv9hkNbyrTvizMBm6zZ5rRWX/sIWl3znjIJ8xy6Hofoeg== + dependencies: + chalk "^2.4.2" + concat-with-sourcemaps "^1.0.5" + cssnano "^4.1.8" + import-cwd "^2.1.0" + p-queue "^2.4.2" + pify "^3.0.0" + postcss "^7.0.14" + postcss-load-config "^2.0.0" + postcss-modules "^1.4.1" + promise.series "^0.2.0" + reserved-words "^0.1.2" + resolve "^1.5.0" + rollup-pluginutils "^2.0.1" + style-inject "^0.3.0" + rollup-plugin-postcss@3.1.8: version "3.1.8" resolved "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-3.1.8.tgz#d1bcaf8eb0fcb0936e3684c22dd8628d13a82fd1" @@ -14096,6 +18167,14 @@ rollup-plugin-postcss@3.1.8: safe-identifier "^0.4.1" style-inject "^0.3.0" +rollup-plugin-replace@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" + integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + dependencies: + magic-string "^0.25.2" + rollup-pluginutils "^2.6.0" + rollup-plugin-terser@7.0.2: version "7.0.2" resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" @@ -14117,13 +18196,22 @@ rollup-plugin-typescript2@0.29.0: resolve "1.17.0" tslib "2.0.1" -rollup-pluginutils@^2.8.2: +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== dependencies: estree-walker "^0.6.1" +rollup@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/rollup/-/rollup-1.1.2.tgz#8d094b85683b810d0c05a16bd7618cf70d48eba7" + integrity sha512-OkdMxqMl8pWoQc5D8y1cIinYQPPLV8ZkfLgCzL6SytXeNA2P7UHynEQXI9tYxuAjAMsSyvRaWnyJDLHMxq0XAg== + dependencies: + "@types/estree" "0.0.39" + "@types/node" "*" + acorn "^6.0.5" + rollup@2.33.3: version "2.33.3" resolved "https://registry.npmjs.org/rollup/-/rollup-2.33.3.tgz#ae72ce31f992b09a580072951bfea76e9df17342" @@ -14131,6 +18219,14 @@ rollup@2.33.3: optionalDependencies: fsevents "~2.1.2" +rst-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -14141,6 +18237,13 @@ run-async@^2.2.0: resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -14153,7 +18256,7 @@ run-series@^1.1.8: resolved "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz#15ba9cb90e6a6c054e67c98e1dc063df0ecc113a" integrity sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g== -rxjs@^6.4.0, rxjs@^6.6.7: +rxjs@^6.4.0, rxjs@^6.6.3: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -14202,11 +18305,18 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.4, 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== +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + saxes@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -14222,6 +18332,14 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" +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@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -14231,6 +18349,20 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^3.0.0: + 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" + +screenfull@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.1.0.tgz#85c13c70f4ead4c1b8a935c70010dfdcd2c0e5c8" + integrity sha512-dYaNuOdzr+kc6J6CFcBrzkLCfyGcMg+gWkJ8us93IQ7y1cevhQAugFsaCdMHb6lw8KV3xPzSxzH7zM1dQap9mA== + scroll-into-view-if-needed@^2.2.25: version "2.2.28" resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" @@ -14238,15 +18370,17 @@ scroll-into-view-if-needed@^2.2.25: dependencies: compute-scroll-into-view "^1.0.17" -select@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= +sdk-base@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz#ba40289e8bdf272ed11dd9ea97eaf98e036d24c6" + integrity sha1-ukAonovfJy7RHdnql+r5jgNtJMY= + dependencies: + get-ready "~1.0.0" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= +seamless-immutable@^7.1.3: + version "7.1.4" + resolved "https://registry.npmjs.org/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8" + integrity sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A== semver-diff@^2.0.0: version "2.1.0" @@ -14262,7 +18396,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -14277,13 +18411,18 @@ semver@7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.x, semver@^7.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@7.x, semver@^7.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + semver@~7.2.0: version "7.2.3" resolved "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz#3641217233c6382173c76bf2c7ecd1e1c16b0d8a" @@ -14299,14 +18438,33 @@ sequelize-pool@^6.0.0: resolved "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz#caaa0c1e324d3c2c3a399fed2c7998970925d668" integrity sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg== -sequelize@^6.3.4: - version "6.6.2" - resolved "https://registry.npmjs.org/sequelize/-/sequelize-6.6.2.tgz#3681b0a4aeb106e31079d3a537d88542051dab2e" - integrity sha512-H/zrzmTK+tis9PJaSigkuXI57nKBvNCtPQol0yxCvau1iWLzSOuq8t3tMOVeQ+Ep8QH2HoD9/+FCCIAqzUr/BQ== +sequelize@6.7.0: + version "6.7.0" + resolved "https://registry.npmmirror.com/sequelize/download/sequelize-6.7.0.tgz#6af3149ad9b39c4bfc8b563f25e1598e2a0cf881" + integrity sha1-avMUmtmznEv8i1Y/JeFZjioM+IE= + dependencies: + debug "^4.1.1" + dottie "^2.0.0" + inflection "1.13.1" + lodash "^4.17.20" + moment "^2.26.0" + moment-timezone "^0.5.31" + retry-as-promised "^3.2.0" + semver "^7.3.2" + sequelize-pool "^6.0.0" + toposort-class "^1.0.1" + uuid "^8.1.0" + validator "^13.6.0" + wkx "^0.5.0" + +sequelize@^6.3.3: + version "6.6.5" + resolved "https://registry.npmjs.org/sequelize/-/sequelize-6.6.5.tgz#6f618e99f3df1fc81f28709e8a3139cec3ef1f0c" + integrity sha512-QyRrJrDRiwuiILqTMHUA1yWOPIL12KlfmgZ3hnzQwbMvp2vJ6fzu9bYJQB+qPMosck4mBUggY4Cjoc6Et8FBIQ== dependencies: debug "^4.1.1" dottie "^2.0.0" - inflection "1.12.0" + inflection "1.13.1" lodash "^4.17.20" moment "^2.26.0" moment-timezone "^0.5.31" @@ -14315,7 +18473,7 @@ sequelize@^6.3.4: sequelize-pool "^6.0.0" toposort-class "^1.0.1" uuid "^8.1.0" - validator "^10.11.0" + validator "^13.6.0" wkx "^0.5.0" serialize-javascript@^4.0.0: @@ -14345,6 +18503,11 @@ setimmediate@^1.0.4, setimmediate@^1.0.5: resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +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.1.1: version "1.1.1" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -14370,7 +18533,12 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallowequal@^1.0.1, shallowequal@^1.0.2, shallowequal@^1.1.0: +shallow-equal@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +shallowequal@^1.0.1, 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== @@ -14418,12 +18586,17 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -signale@1.4.0: +signal-exit@^3.0.3: + version "3.0.4" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" + integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== + +signale@1.4.0, signale@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== @@ -14454,6 +18627,11 @@ sitemap@^6.3.3: arg "^5.0.0" sax "^1.2.4" +size-sensor@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.1.tgz#f84e46206d3e259faff1d548e4b3beca93219dbb" + integrity sha512-QTy7MnuugCFXIedXRpUSk9gUnyNiaxIdxGfUjr8xxXOqIB3QvBUYP9+b51oCg2C4dnhaeNk/h57TxjbvoJrJUA== + slash2@2.0.0, slash2@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/slash2/-/slash2-2.0.0.tgz#f4e0a11708b8545b912695981cf7096f52c63487" @@ -14469,15 +18647,6 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -14493,9 +18662,9 @@ slide@^1.1.6: integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== snapdragon-node@^2.0.1: version "2.1.1" @@ -14528,11 +18697,11 @@ snapdragon@^0.8.1: use "^3.1.0" socks-proxy-agent@5, socks-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" - integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== + version "5.0.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== dependencies: - agent-base "6" + agent-base "^6.0.2" debug "4" socks "^2.3.3" @@ -14545,9 +18714,9 @@ socks-proxy-agent@^4.0.0: socks "~2.3.2" socks@^2.3.3: - version "2.6.0" - resolved "https://registry.npmjs.org/socks/-/socks-2.6.0.tgz#6b984928461d39871b3666754b9000ecf39dfac2" - integrity sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw== + version "2.6.1" + resolved "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== dependencies: ip "^1.1.5" smart-buffer "^4.1.0" @@ -14574,7 +18743,12 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -source-map-resolve@^0.5.0: +sorted-array-functions@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" + integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -14593,6 +18767,14 @@ source-map-support@0.5.19, source-map-support@^0.5.16, source-map-support@^0.5.1 buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.5.12: + version "0.5.20" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" @@ -14623,6 +18805,11 @@ space-separated-tokens@^1.0.0: resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -14645,16 +18832,16 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.10" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== -speech-rule-engine@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.1.1.tgz#d790cee416e17838712c7cff5ad00c7dfe2097be" - integrity sha512-FGX8B44yI3yGhmcw8nZ/by2ffUlZG6m5b/O3RULXsSiwhL/evL+jwQ6BXQxV3gGtOYptOFalTVCAFknAJgBKAg== +speech-rule-engine@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.3.3.tgz#781ed03cbcf3279f94d1d80241025ea954c6d571" + integrity sha512-0exWw+0XauLjat+f/aFeo5T8SiDsO1JtwpY3qgJE4cWt+yL/Stl0WP4VNDWdh7lzGkubUD9lWP4J1ASnORXfyQ== dependencies: - commander "^6.0.0" + commander ">=7.0.0" wicked-good-xpath "^1.3.0" xmldom-sre "^0.1.31" @@ -14701,11 +18888,28 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sqlite3@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" + integrity sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA== + dependencies: + node-addon-api "^3.0.0" + node-pre-gyp "^0.11.0" + optionalDependencies: + node-gyp "3.x" + sqlstring@^2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz#cdae7169389a1375b18e885f2e60b3e460809514" integrity sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg== +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -14733,6 +18937,13 @@ stable@^0.1.8: resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + stack-utils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" @@ -14740,6 +18951,16 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -14748,11 +18969,16 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.5.0 < 2", statuses@^1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.3.1, statuses@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +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== + stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -14774,6 +19000,17 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-http@2.8.2: + version "2.8.2" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz#4126e8c6b107004465918aa2fc35549e77402c87" + integrity sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-http@^2.7.2: version "2.8.3" resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" @@ -14790,6 +19027,16 @@ stream-shift@^1.0.0: resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-wormhole@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz#300aff46ced553cfec642a05251885417693c33d" + integrity sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew== + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -14800,11 +19047,6 @@ strict-uri-encode@^2.0.0: resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= -string-argv@0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - string-convert@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" @@ -14815,6 +19057,14 @@ string-hash@^1.1.1: resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -14858,6 +19108,29 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" + integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -14939,6 +19212,11 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom-string@1.X: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -14985,16 +19263,16 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" +strip-json-comments@^2.0.0, 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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= + 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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strong-log-transformer@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -15009,7 +19287,14 @@ style-inject@^0.3.0: resolved "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== -style-to-object@^0.3.0: +style-to-js@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz#631cbb20fce204019b3aa1fcb5b69d951ceac4ac" + integrity sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA== + dependencies: + style-to-object "0.3.0" + +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== @@ -15025,29 +19310,38 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== +superagent@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" + integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" + component-emitter "^1.3.0" + cookiejar "^2.1.2" + debug "^4.1.1" + fast-safe-stringify "^2.0.7" + form-data "^3.0.0" + formidable "^1.2.2" + methods "^1.1.2" + mime "^2.4.6" + qs "^6.9.4" + readable-stream "^3.6.0" + semver "^7.3.2" -supertest@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" - integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== +supertest@^6.1.3: + version "6.1.5" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.1.5.tgz#b011c8465281b30c64e9d4be4cb3808b91cd1ec0" + integrity sha512-Is3pFB2TxSFPohDS2tIM8h2JOMvUQwbJ9TvTfsWAm89ZZv1CF4VTLAsQz+5+5S1wOgaMqFqSpFriU15L3e2AXQ== dependencies: methods "^1.1.2" - superagent "^3.8.3" + superagent "^6.1.0" + +supertest@^6.1.6: + version "6.1.6" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz#6151c518f4c5ced2ac2aadb9f96f1bf8198174c8" + integrity sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg== + dependencies: + methods "^1.1.2" + superagent "^6.1.0" supports-color@^2.0.0: version "2.0.0" @@ -15082,6 +19376,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.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.0.0: version "2.2.0" resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -15114,43 +19415,79 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-tree@^3.2.4: +symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.4: - version "6.1.0" - resolved "https://registry.npmjs.org/table/-/table-6.1.0.tgz#676a0cfb206008b59e783fcd94ef8ba7d67d966c" - integrity sha512-T4G5KMmqIk6X87gLKWyU5exPpTjLjY5KyrFWaIjv3SvgaIUGXV7UEzGEnZJdTA38/yUS6f9PlKezQ0bYXG3iIQ== +systeminformation@^5.7: + version "5.9.4" + resolved "https://registry.npmjs.org/systeminformation/-/systeminformation-5.9.4.tgz#1f0e29e0aa376dec8f69cc517eeefc5cdcda411a" + integrity sha512-FOsiTn0CyJZoj9kIhla11ndsMzbbwwuriul81wpqIBt9IpbxHZ6P/oZCphIFgJrwqjTnme0Qp1HDzIkUD9Xr/g== + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.npmjs.org/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: ajv "^8.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" lodash.clonedeep "^4.5.0" - lodash.flatten "^4.4.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" 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== +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^4: + version "4.4.19" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: - version "4.4.13" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + version "4.4.17" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.17.tgz#44be5e3fa8353ee1d11db3b1401561223a5c3985" + integrity sha512-q7OwXq6NTdcYIa+k58nEMV3j1euhDhGCs/VRw9ymx/PbH0jtIM2+VTgDE/BW3rbLkrBUXs5fzEKgic5oUciu7g== dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.1.0: + version "6.1.8" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz#4fc50cfe56511c538ce15b71e05eebe66530cbd4" + integrity sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" temp-dir@2.0.0: version "2.0.0" @@ -15214,9 +19551,9 @@ terser@5.6.0: source-map-support "~0.5.19" terser@^5.0.0, terser@^5.5.1: - version "5.6.1" - resolved "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c" - integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== + version "5.7.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -15265,6 +19602,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + throat@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" @@ -15278,14 +19620,7 @@ through2-filter@^3.0.0: through2 "~2.0.0" xtend "~4.0.0" -through2@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== - dependencies: - readable-stream "2 || 3" - -through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -15293,6 +19628,21 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2. readable-stream "~2.3.6" xtend "~4.0.1" +through2@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz#468b461df9cd9fcc170f22ebf6852e467e578ff2" + integrity sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ== + dependencies: + readable-stream "2 || 3" + xtend "~4.0.1" + +through2@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through2@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" @@ -15308,7 +19658,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -15325,16 +19675,19 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timers-ext@^0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + timsort@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tiny-invariant@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" @@ -15441,7 +19794,7 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@^2.3.3, tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -15465,13 +19818,18 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -15483,9 +19841,9 @@ trim-newlines@^2.0.0: integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + 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-off-newlines@^1.0.0: version "1.0.1" @@ -15497,10 +19855,10 @@ trough@^1.0.0: resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== -ts-jest@^26.1.2: - version "26.5.4" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.4.tgz#207f4c114812a9c6d5746dd4d1cdf899eafc9686" - integrity sha512-I5Qsddo+VTm94SukBJ4cPimOoFZsYTeElR2xy6H2TOVs+NsvgYglW8KuQgKoApOKuaU/Ix/vrF9ebFZlb5D2Pg== +ts-jest@^26.5.6: + version "26.5.6" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" + integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -15514,9 +19872,9 @@ ts-jest@^26.1.2: yargs-parser "20.x" ts-loader@^8.0.7: - version "8.1.0" - resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-8.1.0.tgz#d6292487df279c7cc79b6d3b70bb9d31682b693e" - integrity sha512-YiQipGGAFj2zBfqLhp28yUvPP9jUGqHxRzrGYuc82Z2wM27YIHbElXiaZDc93c3x0mz4zvBmS6q/DgExpdj37A== + version "8.3.0" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" + integrity sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag== dependencies: chalk "^4.1.0" enhanced-resolve "^4.0.0" @@ -15524,27 +19882,53 @@ ts-loader@^8.0.7: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== +ts-node-dev@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066" + integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.5" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^9.0.0" + tsconfig "^7.0.0" + +ts-node@^9.0.0, ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" yn "3.1.1" tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + version "3.10.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" + integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^2.2.0" minimist "^1.2.0" strip-bom "^3.0.0" +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + tslib@1.9.3: version "1.9.3" resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -15560,17 +19944,17 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1: - version "2.2.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsscmp@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsutils@^3.17.1: +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== @@ -15604,6 +19988,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +tx2@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/tx2/-/tx2-1.0.4.tgz#cb9432df22e0b8c54daf711b51b708f094449ddf" + integrity sha512-rU+y30nUY3PyIi+znvv74HzxlpULKwMPAyRK+YiCjvGkk3rY3fic3D6Z+avLpun3V5A6HFwPQ9JrBTMNEV/dxg== + dependencies: + json-stringify-safe "^5.0.1" + 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" @@ -15653,7 +20044,7 @@ type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@^1.6.16: +type-is@^1.6.16, type-is@^1.6.4: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -15661,6 +20052,16 @@ type-is@^1.6.16: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.5.0" + resolved "https://registry.npmjs.org/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + 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" @@ -15673,15 +20074,15 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.9.6: - version "3.9.9" - resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== +typescript@4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== -typescript@^4.0.5: - version "4.2.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +typescript@^3.7.2: + version "3.9.10" + resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== ua-parser-js@^0.7.18: version "0.7.28" @@ -15699,9 +20100,9 @@ uglify-js@^2.8.22: uglify-to-browserify "~1.0.0" uglify-js@^3.1.4: - version "3.13.4" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" - integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + version "3.14.1" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz#e2cb9fe34db9cb4cf7e35d1d26dfea28e09a7d06" + integrity sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g== uglify-to-browserify@~1.0.0: version "1.0.2" @@ -15718,23 +20119,106 @@ umask@^1.1.0: resolved "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= +umi-request@^1.2.14: + version "1.4.0" + resolved "https://registry.npmjs.org/umi-request/-/umi-request-1.4.0.tgz#ed0e54e47f043d2be06e691477f0890383f9dd8a" + integrity sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA== + dependencies: + isomorphic-fetch "^2.2.1" + qs "^6.9.1" + +umi-request@^1.3.5: + version "1.3.9" + resolved "https://registry.npmjs.org/umi-request/-/umi-request-1.3.9.tgz#e745edc22e1eb83e9e8d02334a6d1ebae20b025e" + integrity sha512-vjm8N1PDP8r3oG2MqUw69luRP4X8ucwIGeEpzbBGpjLy6s/WH9LOgcTxw7ferwn3u4IXqOVawSaGHUrI17blVA== + dependencies: + isomorphic-fetch "^2.2.1" + qs "^6.9.1" + +umi-test@^1.2.0: + version "1.9.6" + resolved "https://registry.npmjs.org/umi-test/-/umi-test-1.9.6.tgz#63856c511d396def5a088e6df7cdfc5311da2321" + integrity sha512-2t5YbLAKLE9HhCiFzgy32yUrYG7fjTLgYcIdLBROnD17bB7KoOWj+Y83RZIJqH3rUSpOqWxOKqv7cUdArbEqTQ== + dependencies: + "@babel/core" "7.4.5" + "@babel/preset-typescript" "7.3.3" + babel-core "7.0.0-bridge.0" + babel-jest "^24.8.0" + babel-plugin-module-resolver "3.2.0" + babel-preset-umi "1.8.4" + core-js "3.1.4" + debug "4.1.1" + enzyme "^3.10.0" + enzyme-adapter-react-16 "^1.14.0" + identity-obj-proxy "3.0.0" + jest "^24.8.0" + jest-cli "^24.8.0" + jest-pnp-resolver "^1.2.0" + jest-resolve "^24.8.0" + react "^16.8.6" + react-dom "^16.8.6" + regenerator-runtime "0.13.2" + typescript "^3.7.2" + umi-utils "1.7.2" + yargs-parser "13.1.1" + +umi-tools@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/umi-tools/-/umi-tools-0.4.0.tgz#ff1573df6abc6a579ed523a522581ed68246ff3e" + integrity sha512-RX9vEnVM6Zx6h1nkhFxNf8vYYFYGeB/MTEqFYkMk+qxc022VJUX0veIfiXSkC0apAAJ070Kp6HyyQ8ZlSkpzBg== + dependencies: + "@babel/core" "^7.1.2" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-do-expressions" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/preset-env" "^7.1.0" + "@babel/preset-react" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/runtime" "^7.3.0" + chalk "^2.4.1" + chokidar "^2.0.4" + rimraf "^2.6.2" + rollup "1.1.2" + rollup-plugin-commonjs "^9.2.0" + rollup-plugin-node-resolve "4.0.0" + rollup-plugin-postcss "2.0.3" + rollup-plugin-replace "^2.1.0" + signale "^1.3.0" + slash2 "^2.0.0" + through2 "3.0.0" + umi-test "^1.2.0" + vinyl-fs "^3.0.3" + yargs-parser "13.0.0" + +umi-utils@1.7.2: + version "1.7.2" + resolved "https://registry.npmjs.org/umi-utils/-/umi-utils-1.7.2.tgz#940448f1241630843dd55e7b3b48a5c3d1aff53d" + integrity sha512-l/IV3bcPqjhzTi4L4HkcWVh8+mLzXupXdsQi87RmGHcPR9CRlZW91PLRVaybZ3G/KTBbhlVl4pF4RrtU972/QA== + dependencies: + chalk "2.4.2" + dotenv "^8.2.0" + is-url "1.2.4" + node-fetch "2.6.0" + prettier "1.15.3" + slash2 "2.0.0" + umi@^3.0.0: - version "3.4.8" - resolved "https://registry.npmjs.org/umi/-/umi-3.4.8.tgz#f9f473f77e7ce46809563d964b143b3a65c01c90" - integrity sha512-PKpXqZpBl5iAADFVEosp07l5PHSjUbTcGb8h2VGoYFAE3rUj3zpsSgJjF05nKoLdpVPxBLZt7zPmmuVfXNzxfg== - dependencies: - "@umijs/bundler-webpack" "3.4.8" - "@umijs/core" "3.4.8" - "@umijs/deps" "0.8.1" - "@umijs/preset-built-in" "3.4.8" - "@umijs/runtime" "3.4.8" - "@umijs/types" "3.4.8" - "@umijs/utils" "3.4.8" + version "3.5.17" + resolved "https://registry.npmjs.org/umi/-/umi-3.5.17.tgz#d58ed323d715057cc09a6c45a1f382f1b6dd2dab" + integrity sha512-KE2DjN4/jEadBROd2Y1wie4HN2uuZi7FxqcDPy9hCKqvLHPIy112hvpoS5IWa+1j39OCym241KfiTTb0y+vvbg== + dependencies: + "@umijs/bundler-webpack" "3.5.17" + "@umijs/core" "3.5.17" + "@umijs/deps" "3.5.17" + "@umijs/preset-built-in" "3.5.17" + "@umijs/runtime" "3.5.17" + "@umijs/types" "3.5.17" + "@umijs/utils" "3.5.17" react "16.x" react-dom "16.x" v8-compile-cache "2.3.0" -unbox-primitive@^1.0.0: +unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -15749,6 +20233,16 @@ unc-path-regex@^0.1.2: resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +uncontrollable@^7.0.0: + version "7.2.1" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + undefsafe@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" @@ -15756,10 +20250,17 @@ undefsafe@^2.0.3: dependencies: debug "^2.2.0" -underscore@^1.7.0: - version "1.13.0" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.0.tgz#3ccdcbb824230fc6bf234ad0ddcd83dff4eafe5f" - integrity sha512-sCs4H3pCytsb5K7i072FAEC9YlSYFIbosvM0tAKAlpSSUgD7yC1iXSEGdl5XrDKQ1YUB+p/HDzYrSG2H2Vl36g== +underscore@^1.13.1: + version "1.13.1" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== + +unescape@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96" + integrity sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ== + dependencies: + extend-shallow "^2.0.1" unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -15944,7 +20445,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.2.0: +upath@^1.1.1, upath@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -15986,6 +20487,13 @@ update-notifier@^4.1.0: semver-diff "^3.1.1" xdg-basedir "^4.0.0" +upper-case@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -16013,6 +20521,27 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +urllib@^2.33.1: + version "2.37.3" + resolved "https://registry.npmjs.org/urllib/-/urllib-2.37.3.tgz#e5044a54947fbe9fe006188bbe73041970334111" + integrity sha512-jGfi6qi23KvN3u3WizRxeU/yWVoh0Ml7c4yfmeRKVfGESMXYfNcQCPgeHRC1w1OMstVa9MXyIUYz3OLj+pWAMA== + dependencies: + any-promise "^1.3.0" + content-type "^1.0.2" + debug "^2.6.9" + default-user-agent "^1.0.0" + digest-header "^0.0.1" + ee-first "~1.1.1" + formstream "^1.1.0" + humanize-ms "^1.2.0" + iconv-lite "^0.4.15" + ip "^1.1.5" + proxy-agent "^4.0.1" + pump "^3.0.0" + qs "^6.4.0" + statuses "^1.3.1" + utility "^1.16.1" + use-subscription@1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" @@ -16037,6 +20566,17 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + util.promisify@~1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" @@ -16061,6 +20601,24 @@ util@^0.11.0: dependencies: inherits "2.0.3" +utility@0.1.11: + version "0.1.11" + resolved "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz#fde60cf9b4e4751947a0cf5d104ce29367226715" + integrity sha1-/eYM+bTkdRlHoM9dEEzik2ciZxU= + dependencies: + address ">=0.0.1" + +utility@^1.16.1, utility@^1.8.0: + version "1.17.0" + resolved "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz#60819f712a6e0ce774f52fb1d691992a5f59d362" + integrity sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw== + dependencies: + copy-to "^2.0.1" + escape-html "^1.0.3" + mkdirp "^0.5.1" + mz "^2.7.0" + unescape "^1.0.1" + uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -16077,9 +20635,9 @@ v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz#04bfd1026ba4577de5472df4f5e89af49de5edda" - integrity sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA== + version "7.1.2" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -16100,10 +20658,10 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validator@^10.11.0: - version "10.11.0" - resolved "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228" - integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== +validator@^13.6.0: + version "13.6.0" + resolved "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" + integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== value-equal@^1.0.1: version "1.0.1" @@ -16212,7 +20770,7 @@ vinyl@^2.0.0, vinyl@^2.1.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vizion@2.2.1: +vizion@~2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz#04201ea45ffd145d5b5210e385a8f35170387fb2" integrity sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww== @@ -16227,13 +20785,27 @@ vm-browserify@^1.0.1: resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -w3c-hr-time@^1.0.2: +vm2@^3.9.3: + version "3.9.3" + resolved "https://registry.npmjs.org/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40" + integrity sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q== + +w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + w3c-xmlserializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" @@ -16262,7 +20834,7 @@ warning@^4.0.1, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -wcwidth@^1.0.0: +wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= @@ -16297,23 +20869,32 @@ webpack-chain@6.5.1: deepmerge "^1.5.2" javascript-stringify "^2.0.1" -whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.5.0: version "3.6.2" resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== -whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -16324,12 +20905,12 @@ whatwg-url@^7.0.0: webidl-conversions "^4.0.2" whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" - tr46 "^2.0.2" + tr46 "^2.1.0" webidl-conversions "^6.1.0" when@^3.7.8: @@ -16353,7 +20934,7 @@ which-module@^2.0.0: resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.1: +which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -16393,6 +20974,18 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wildcard@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" + integrity sha1-pwIEUwhNjNLv5wup02liY94XEKU= + +win-release@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" + integrity sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk= + dependencies: + semver "^5.0.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -16412,11 +21005,21 @@ wkx@^0.5.0: dependencies: "@types/node" "*" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -16459,6 +21062,15 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" @@ -16510,15 +21122,34 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -ws@^7.0.0, ws@^7.4.4: - version "7.4.4" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" -ws@~7.2.0: - version "7.2.5" - resolved "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz#abb1370d4626a5a9cd79d8de404aa18b3465d10d" - integrity sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA== +ws@^6.1.2: + version "6.2.2" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7.0.0: + version "7.5.5" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + +ws@^7.4.6: + version "7.5.3" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@~7.4.0: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xdg-basedir@^3.0.0: version "3.0.0" @@ -16530,12 +21161,41 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xlsx@^0.17.0: + version "0.17.0" + resolved "https://registry.npmjs.org/xlsx/-/xlsx-0.17.0.tgz#028176a0140967dcee1817d221678461e47481c8" + integrity sha512-bZ36FSACiAyjoldey1+7it50PMlDp1pcAJrZKcVZHzKd8BC/z6TQ/QAN8onuqcepifqSznR6uKnjPhaGt6ig9A== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.14.0" + commander "~2.17.1" + crc-32 "~1.2.0" + exit-on-epipe "~1.0.1" + fflate "^0.3.8" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.2.0: +xml2js@^0.4.16: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.1.1, xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== @@ -16560,12 +21220,17 @@ y18n@^4.0.0: resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -16588,7 +21253,23 @@ yamljs@0.3.0: argparse "^1.0.7" glob "^7.0.5" -yargs-parser@13.1.2: +yargs-parser@13.0.0: + version "13.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@13.1.1: + version "13.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -16596,15 +21277,15 @@ yargs-parser@13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.x, yargs-parser@^20.2.3: - version "20.2.7" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== +yargs-parser@20.x, yargs-parser@^20.2.2, 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== yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + version "15.0.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -16617,6 +21298,22 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^14.2.2: version "14.2.3" resolved "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" @@ -16651,6 +21348,19 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -16671,16 +21381,6 @@ yn@3.1.1: resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -yorkie@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" - integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== - dependencies: - execa "^0.8.0" - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" - zscroller@~0.4.0: version "0.4.8" resolved "https://registry.npmjs.org/zscroller/-/zscroller-0.4.8.tgz#69eed68690808eedf81f9714014356b36cdd20f4"