From 4085ed0db762bac50f1a4cd9fc381b98de7bd05d Mon Sep 17 00:00:00 2001 From: katherinehhh Date: Tue, 29 Nov 2022 11:31:30 +0800 Subject: [PATCH] Feat/collection templates (#1124) * feat: add collection templates * feat: collection templates * feat: collection templates * feat: collection templates * feat: collection templates * feat: collection templates * feat: calendar collection template * feat: no id does not support sorting * feat: collection template edit * feat: collectiom templates code improve * feat: collection template supports configurable field interface * feat: collection template supports configurable field interface * feat: establish relation field when there is no id * feat: collection templates * feat: collection templates locale * feat: calendar collection * feat: calendar collection default fields * feat: code optimization * feat: code optimization * feat: code optimization * feat: collectin template fix * feat: add sample-custom-collection-template * feat: code optimization * feat: code optimization * feat: code optimization * feat: code optimization * feat: import code * feat: collection template local * feat: code opimization * feat: code opimization * feat: code opimization * feat: code opimization * feat: code opimization * feat: collection template local * feat: collection template local * fix(collection-manager): exclude reverse parameters when overriding * feat: update docs * feat: disabled * feat: improve code * feat: update submodule * feat: submodules: true * fix: token * fix: with ssh-key * fix: update dockerfile * fix: ci * fix: ci * fix: ci * fix: ci * fix: --no-verify-access * fix: ci * fix: ci * fix: ci * fix: missing env * fix: env Co-authored-by: chenos Co-authored-by: chareice --- .../workflows/aliyun-container-registry.yml | 5 +- Dockerfile.acr | 64 ++++ Dockerfile.official | 47 --- .../release/v08-1-collection-templates.md | 79 ++++ .../v08-1-collection-templates.jpg | Bin 0 -> 180900 bytes .../CollectionManagerProvider.tsx | 8 +- .../CollectionManagerShortcut.tsx | 10 + .../Configuration/AddCollectionAction.tsx | 282 +++++++++++++++ .../Configuration/AddFieldAction.tsx | 42 ++- .../Configuration/ConfigurationTable.tsx | 112 +----- .../Configuration/EditCollectionAction.tsx | 161 +++++++++ .../components/CollectionTemplate.tsx | 14 + .../Configuration/index.tsx | 10 +- .../Configuration/interfaces.tsx | 1 + .../Configuration/schemas/collections.ts | 131 ++----- .../Configuration/templates.tsx | 23 ++ .../src/collection-manager/action-hooks.ts | 33 -- .../hooks/useCollectionManager.ts | 9 +- .../client/src/collection-manager/index.tsx | 2 + .../interfaces/properties/index.ts | 1 + .../collection-manager/templates/calendar.tsx | 37 ++ .../collection-manager/templates/general.tsx | 23 ++ .../collection-manager/templates/index.tsx | 3 + .../templates/properties/index.ts | 121 +++++++ .../templates/treeCollection.tsx | 0 .../src/collection-manager/templates/types.ts | 52 +++ .../client/src/collection-manager/types.ts | 1 + packages/core/client/src/locale/en_US.ts | 9 + packages/core/client/src/locale/ja_JP.ts | 11 +- packages/core/client/src/locale/zh_CN.ts | 10 +- .../antd/table-v2/TableBlockDesigner.tsx | 4 +- .../client/src/schema-initializer/utils.ts | 2 + .../core/create-nocobase-app/src/generator.js | 9 + packages/presets/nocobase/src/index.ts | 36 +- packages/pro-plugins | 2 +- .../custom-collection-template/README.md | 28 ++ .../custom-collection-template/client.d.ts | 4 + .../custom-collection-template/client.js | 30 ++ .../custom-collection-template/package.json | 11 + .../src/client/index.tsx | 31 ++ .../custom-collection-template/src/index.ts | 1 + .../src/server/index.ts | 16 + yarn.lock | 337 +----------------- 43 files changed, 1149 insertions(+), 663 deletions(-) create mode 100644 Dockerfile.acr delete mode 100644 Dockerfile.official create mode 100644 docs/zh-CN/welcome/release/v08-1-collection-templates.md create mode 100644 docs/zh-CN/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg create mode 100644 packages/core/client/src/collection-manager/Configuration/AddCollectionAction.tsx create mode 100644 packages/core/client/src/collection-manager/Configuration/EditCollectionAction.tsx create mode 100644 packages/core/client/src/collection-manager/Configuration/components/CollectionTemplate.tsx create mode 100644 packages/core/client/src/collection-manager/Configuration/templates.tsx create mode 100644 packages/core/client/src/collection-manager/templates/calendar.tsx create mode 100644 packages/core/client/src/collection-manager/templates/general.tsx create mode 100644 packages/core/client/src/collection-manager/templates/index.tsx create mode 100644 packages/core/client/src/collection-manager/templates/properties/index.ts create mode 100644 packages/core/client/src/collection-manager/templates/treeCollection.tsx create mode 100644 packages/core/client/src/collection-manager/templates/types.ts create mode 100644 packages/samples/custom-collection-template/README.md create mode 100755 packages/samples/custom-collection-template/client.d.ts create mode 100755 packages/samples/custom-collection-template/client.js create mode 100644 packages/samples/custom-collection-template/package.json create mode 100644 packages/samples/custom-collection-template/src/client/index.tsx create mode 100644 packages/samples/custom-collection-template/src/index.ts create mode 100644 packages/samples/custom-collection-template/src/server/index.ts diff --git a/.github/workflows/aliyun-container-registry.yml b/.github/workflows/aliyun-container-registry.yml index 74b1fac94..ccc128998 100644 --- a/.github/workflows/aliyun-container-registry.yml +++ b/.github/workflows/aliyun-container-registry.yml @@ -24,6 +24,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + ssh-key: ${{ secrets.SUBMODULE_SSH_KEY }} + submodules: true - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx @@ -51,7 +54,7 @@ jobs: uses: docker/build-push-action@v3 with: context: . - file: Dockerfile + file: Dockerfile.acr build-args: | VERDACCIO_URL=http://localhost:4873/ COMMIT_HASH=${GITHUB_SHA} diff --git a/Dockerfile.acr b/Dockerfile.acr new file mode 100644 index 000000000..1aa532e28 --- /dev/null +++ b/Dockerfile.acr @@ -0,0 +1,64 @@ +FROM node:16 as builder +ARG VERDACCIO_URL=http://host.docker.internal:10104/ +ARG COMIT_HASH + +RUN apt-get update && apt-get install -y jq +WORKDIR /tmp +COPY . /tmp +RUN npx npm-cli-adduser --username test --password test -e test@nocobase.com -r $VERDACCIO_URL +RUN cd /tmp && \ + NEWVERSION="$(cat lerna.json | jq '.version' | tr -d '"').$(date +%s)" \ + && tmp=$(mktemp) \ + && jq ".version = \"${NEWVERSION}\"" lerna.json > "$tmp" && mv "$tmp" lerna.json +RUN yarn install && yarn nocobase install && yarn pm add graph-collection-manager && yarn build + +RUN git checkout -b release \ + && yarn version:alpha -y + +RUN cd packages/pro-plugins && git checkout -b release \ + && git config user.email "test@mail.com" \ + && git config user.name "test" && git add . \ + && git commit -m "chore(versions): test publish packages xxx" + +RUN git config user.email "test@mail.com" \ + && git config user.name "test" && git add . \ + && git commit -m "chore(versions): test publish packages xxx" \ + && git submodule update --init --recursive -- packages/pro-plugins + +RUN yarn release:force --no-verify-access --no-git-reset --registry $VERDACCIO_URL + +RUN yarn config set registry $VERDACCIO_URL +WORKDIR /app +RUN cd /app \ + && yarn config set network-timeout 600000 -g \ + && yarn create nocobase-app my-nocobase-app -a \ + -e APP_ENV=production \ + -e PLUGIN_PACKAGE_PREFIX=@nocobase/plugin-,@nocobase/preset-,@nocobase/plugin-pro- \ + -e PRESET_NOCOBASE_PLUGINS=error-handler,collection-manager,ui-schema-storage,ui-routes-storage,file-manager,system-settings,verification,users,acl,china-region,workflow,client,export,import,audit-logs,graph-collection-manager \ + && cd /app/my-nocobase-app \ + && yarn install --production \ + && yarn add @nocobase/plugin-pro-graph-collection-manager -W + +RUN cd /app \ + && rm -rf my-nocobase-app/packages/app/client/src/.umi \ + && rm -rf nocobase.tar.gz \ + && find ./my-nocobase-app/node_modules/china-division/dist -name '*.csv' -delete \ + && find ./my-nocobase-app/node_modules/china-division/dist -name '*.sqlite' -delete \ + && tar -zcf ./nocobase.tar.gz -C /app/my-nocobase-app . + + +FROM node:16-stretch-slim +RUN apt-get update && apt-get install -y nginx + +RUN rm -rf /etc/nginx/sites-enabled/default +COPY ./docker/nocobase/nocobase.conf /etc/nginx/sites-enabled/nocobase.conf +COPY --from=builder /app/nocobase.tar.gz /app/nocobase.tar.gz + +WORKDIR /app/nocobase + +RUN mkdir -p /app/nocobase/storage/uploads/ && echo "$COMIT_HASH" >> /app/nocobase/storage/uploads/COMIT_HASH + +COPY ./docker/nocobase/docker-entrypoint.sh /app/ + +CMD ["/app/docker-entrypoint.sh"] + diff --git a/Dockerfile.official b/Dockerfile.official deleted file mode 100644 index a400b79c8..000000000 --- a/Dockerfile.official +++ /dev/null @@ -1,47 +0,0 @@ -FROM node:16 as builder -ARG VERDACCIO_URL=https://pkgs.nocobase.com/ - -RUN apt-get update && apt-get install -y jq -WORKDIR /tmp -COPY . /tmp -RUN npx npm-cli-adduser --username test --password test -e test@nocobase.com -r $VERDACCIO_URL -RUN cd /tmp && \ - NEWVERSION="$(cat lerna.json | jq '.version' | tr -d '"').$(date +%s)" \ - && tmp=$(mktemp) \ - && jq ".version = \"${NEWVERSION}\"" lerna.json > "$tmp" && mv "$tmp" lerna.json -RUN yarn install && yarn build - -RUN git checkout -b release \ - && yarn version:alpha -y \ - && git config user.email "test@mail.com" \ - && git config user.name "test" && git add . \ - && git commit -m "chore(versions): test publish packages xxx" \ - && yarn release:force --registry $VERDACCIO_URL - -RUN yarn config set registry $VERDACCIO_URL -WORKDIR /app -RUN cd /app \ - && yarn create nocobase-app my-nocobase-app -a -e APP_ENV=production \ - && cd /app/my-nocobase-app \ - && yarn install --production - -RUN cd /app \ - && rm -rf my-nocobase-app/packages/app/client/src/.umi \ - && rm -rf nocobase.tar.gz \ - && find ./my-nocobase-app/node_modules/china-division/dist -name '*.csv' -delete \ - && find ./my-nocobase-app/node_modules/china-division/dist -name '*.sqlite' -delete \ - && tar -zcf ./nocobase.tar.gz -C /app/my-nocobase-app . - - -FROM node:16-stretch-slim -RUN apt-get update && apt-get install -y nginx - -RUN rm -rf /etc/nginx/sites-enabled/default -COPY ./docker/nocobase/nocobase.conf /etc/nginx/sites-enabled/nocobase.conf -COPY --from=builder /app/nocobase.tar.gz /app/nocobase.tar.gz - -WORKDIR /app/nocobase - -COPY ./docker/nocobase/docker-entrypoint.sh /app/ - -CMD ["/app/docker-entrypoint.sh"] diff --git a/docs/zh-CN/welcome/release/v08-1-collection-templates.md b/docs/zh-CN/welcome/release/v08-1-collection-templates.md new file mode 100644 index 000000000..2fea83326 --- /dev/null +++ b/docs/zh-CN/welcome/release/v08-1-collection-templates.md @@ -0,0 +1,79 @@ +# v0.8.1: Collection 模板 + + + +## 为什么需要 Collection 模板? + +待补充 + +## 配置参数说明 + +```ts +interface ICollectionTemplate { + name: string; + title?: string; + /** 排序 */ + order?: number; + /** 默认配置 */ + default?: CollectionOptions; + /** UI 可配置的 CollectionOptions 参数(添加或编辑的 Collection 表单的字段) */ + configurableProperties?: Record; + /** 当前模板可用的字段类型 */ + availableFieldInterfaces?: AvailableFieldInterfacesInclude | AvailableFieldInterfacesExclude; +} + +interface AvailableFieldInterfacesInclude { + include?: any[]; +} + +interface AvailableFieldInterfacesExclude { + exclude?: any[]; +} + +interface CollectionOptions { + /** + * 自动生成 id + * @default true + * */ + autoGenId?: boolean; + /** 创建人 */ + createdBy?: boolean; + /** 最后更新人 */ + updatedBy?: boolean; + /** 创建日期 */ + createdAt?: boolean; + /** 更新日期 */ + updatedAt?: boolean; + /** 可排序 */ + sortable?: boolean; + /* 树结构 */ + tree?: string; + /* 日志 */ + logging?: boolean; + /** 继承 */ + inherits: string | string[]; + /* 字段列表 */ + fields?: FieldOptions[]; +} +``` + +## 示例 + +创建时都不需要 autoGenId,并且只提供 title 和 name 配置项 + +```ts +import { collectionConfigurableProperties } from '@nocobase/client'; + +{ + default: { + autoGenId: false, + fields: [], + }, + configurableProperties: { + ...collectionConfigurableProperties('name', 'title'), + }, +} +``` + +完整插件示例参考:[samples/custom-collection-template](https://github.com/nocobase/nocobase/tree/feat/collection-templates/packages/samples/custom-collection-template) + diff --git a/docs/zh-CN/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg b/docs/zh-CN/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd0a99af8427bccdeab9d29ca6d47c6b119559d7 GIT binary patch literal 180900 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 eDv&-Z!UHPd)QcYllAG9HK69F!5Y7K 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 = (props) => { - const { service, interfaces, collections = [], refreshCM } = props; + const { service, interfaces, collections = [], refreshCM, templates } = props; + const defaultTemplates = keyBy(templateOptions(), (item) => item.name); const ctx = useContext(CollectionManagerContext); return ( { ConfigurationTable, AddFieldAction, AddCollectionField, + AddCollection, + AddCollectionAction, + EditCollection, + EditCollectionAction, EditFieldAction, EditCollectionField, OverridingCollectionField, @@ -99,6 +107,8 @@ export const CollectionManagerShortcut2 = () => { EditFieldAction, OverridingFieldAction, ViewFieldAction, + AddCollectionAction, + EditCollectionAction, }} /> diff --git a/packages/core/client/src/collection-manager/Configuration/AddCollectionAction.tsx b/packages/core/client/src/collection-manager/Configuration/AddCollectionAction.tsx new file mode 100644 index 000000000..8824c23e8 --- /dev/null +++ b/packages/core/client/src/collection-manager/Configuration/AddCollectionAction.tsx @@ -0,0 +1,282 @@ +import { DownOutlined, PlusOutlined } from '@ant-design/icons'; +import { ArrayTable } from '@formily/antd'; +import { ISchema, useForm } from '@formily/react'; +import { uid } from '@formily/shared'; +import { Button, Dropdown, Menu } from 'antd'; +import { cloneDeep } from 'lodash'; +import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useRequest } from '../../api-client'; +import { RecordProvider, useRecord } from '../../record-provider'; +import { ActionContext, SchemaComponent, useActionContext, useCompile } from '../../schema-component'; +import { useCancelAction } from '../action-hooks'; +import { useCollectionManager } from '../hooks'; +import { useResourceActionContext, useResourceContext } from '../ResourceActionProvider'; +import * as components from './components'; +import { templateOptions } from './templates'; + +const getSchema = (schema, record: any, compile): ISchema => { + if (!schema) { + return; + } + + const properties = cloneDeep(schema.configurableProperties) as any; + + if (schema.hasDefaultValue === true) { + properties['defaultValue'] = cloneDeep(schema.default.uiSchema); + properties['defaultValue']['title'] = compile('{{ t("Default value") }}'); + properties['defaultValue']['x-decorator'] = 'FormItem'; + } + const initialValue: any = { + name: `f_${uid()}`, + template: schema.name, + ...cloneDeep(schema.default), + }; + if (initialValue.reverseField) { + initialValue.reverseField.name = `f_${uid()}`; + } + return { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Drawer', + 'x-component-props': { + getContainer: '{{ getContainer }}', + }, + 'x-decorator': 'Form', + 'x-decorator-props': { + useValues(options) { + return useRequest( + () => + Promise.resolve({ + data: initialValue, + }), + options, + ); + }, + }, + title: '{{ t("Create collection") }}', + properties: { + summary: { + type: 'void', + 'x-component': 'FieldSummary', + 'x-component-props': { + schemaKey: schema.name, + }, + }, + // @ts-ignore + ...properties, + footer: { + type: 'void', + 'x-component': 'Action.Drawer.Footer', + properties: { + action1: { + title: '{{ t("Cancel") }}', + 'x-component': 'Action', + 'x-component-props': { + useAction: '{{ useCancelAction }}', + }, + }, + action2: { + title: '{{ t("Submit") }}', + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + useAction: () => useCreateCollection(), + }, + }, + }, + }, + }, + }, + }, + }; +}; + +const useDefaultCollectionFields = (values) => { + let defaults = values.fields ? [...values.fields] : []; + const { autoGenId = true, createdAt = true, createdBy = true, updatedAt = true, updatedBy = true } = values; + if (autoGenId) { + const pk = values.fields.find((f) => f.primaryKey); + if (!pk) { + defaults.push({ + name: 'id', + type: 'bigInt', + autoIncrement: true, + primaryKey: true, + allowNull: false, + uiSchema: { type: 'number', title: '{{t("ID")}}', 'x-component': 'InputNumber', 'x-read-pretty': true }, + interface: 'id', + }); + } + } + if (createdAt) { + defaults.push({ + name: 'createdAt', + interface: 'createdAt', + type: 'date', + field: 'createdAt', + uiSchema: { + type: 'datetime', + title: '{{t("Created at")}}', + 'x-component': 'DatePicker', + 'x-component-props': {}, + 'x-read-pretty': true, + }, + }); + } + if (createdBy) { + defaults.push({ + name: 'createdBy', + interface: 'createdBy', + type: 'belongsTo', + target: 'users', + foreignKey: 'createdById', + uiSchema: { + type: 'object', + title: '{{t("Created by")}}', + 'x-component': 'RecordPicker', + 'x-component-props': { + fieldNames: { + value: 'id', + label: 'nickname', + }, + }, + 'x-read-pretty': true, + }, + }); + } + if (updatedAt) { + defaults.push({ + type: 'date', + field: 'updatedAt', + name: 'updatedAt', + interface: 'updatedAt', + uiSchema: { + type: 'string', + title: '{{t("Last updated at")}}', + 'x-component': 'DatePicker', + 'x-component-props': {}, + 'x-read-pretty': true, + }, + }); + } + if (updatedBy) { + defaults.push({ + type: 'belongsTo', + target: 'users', + foreignKey: 'updatedById', + name: 'updatedBy', + interface: 'updatedBy', + uiSchema: { + type: 'object', + title: '{{t("Last updated by")}}', + 'x-component': 'RecordPicker', + 'x-component-props': { + fieldNames: { + value: 'id', + label: 'nickname', + }, + }, + 'x-read-pretty': true, + }, + }); + } + // 其他 + return defaults; +}; + +const useCreateCollection = () => { + const form = useForm(); + const { refreshCM } = useCollectionManager(); + const ctx = useActionContext(); + const { refresh } = useResourceActionContext(); + const { resource } = useResourceContext(); + return { + async run() { + await form.submit(); + const values = cloneDeep(form.values); + const fields = useDefaultCollectionFields(values); + console.log(fields); + if (values.autoCreateReverseField) { + } else { + delete values.reverseField; + } + delete values.id; + delete values.autoCreateReverseField; + await resource.create({ + values: { + logging: true, + ...values, + fields, + }, + }); + ctx.setVisible(false); + await form.reset(); + refresh(); + await refreshCM(); + }, + }; +}; + +export const AddCollection = (props) => { + const record = useRecord(); + return ; +}; + +export const AddCollectionAction = (props) => { + const { scope, getContainer, item: record, children, trigger, align } = props; + const { getTemplate } = useCollectionManager(); + const [visible, setVisible] = useState(false); + const [schema, setSchema] = useState({}); + const compile = useCompile(); + const { t } = useTranslation(); + return ( + + + { + const schema = getSchema(getTemplate(info.key), record, compile); + setSchema(schema); + setVisible(true); + }} + > + {templateOptions().map((option) => { + return {compile(option.title)}; + })} + + } + > + {children || ( + + )} + + + + + ); +}; diff --git a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx index f000448e8..c28790103 100644 --- a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx +++ b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx @@ -9,12 +9,12 @@ import { useTranslation } from 'react-i18next'; import { useRequest } from '../../api-client'; import { RecordProvider, useRecord } from '../../record-provider'; import { ActionContext, SchemaComponent, useActionContext, useCompile } from '../../schema-component'; -import { useCancelAction, useCreateAction } from '../action-hooks'; +import { useCancelAction } from '../action-hooks'; import { useCollectionManager } from '../hooks'; import { IField } from '../interfaces/types'; import { useResourceActionContext, useResourceContext } from '../ResourceActionProvider'; import * as components from './components'; -import { getOptions } from './interfaces'; +import { options } from './interfaces'; const getSchema = (schema: IField, record: any, compile) => { if (!schema) { @@ -114,7 +114,6 @@ export const useCollectionFieldFormValues = () => { const useCreateCollectionField = () => { const form = useForm(); - const { run } = useCreateAction(); const { refreshCM } = useCollectionManager(); const ctx = useActionContext(); const { refresh } = useResourceActionContext(); @@ -144,11 +143,44 @@ export const AddCollectionField = (props) => { export const AddFieldAction = (props) => { const { scope, getContainer, item: record, children, trigger, align } = props; - const { getInterface } = useCollectionManager(); + const { getInterface, getTemplate } = useCollectionManager(); const [visible, setVisible] = useState(false); const [schema, setSchema] = useState({}); const compile = useCompile(); const { t } = useTranslation(); + const getFieldOptions = () => { + const { availableFieldInterfaces } = getTemplate(record.template) || {}; + const { exclude, include } = availableFieldInterfaces || {}; + const optionArr = []; + options.forEach((v) => { + if (v.key === 'systemInfo') { + optionArr.push({ + ...v, + children: v.children.filter((v) => { + if (v.value === 'id') { + return typeof record['autoGenId'] === 'boolean' ? record['autoGenId'] : true; + } else { + return typeof record[v.value] === 'boolean' ? record[v.value] : true; + } + }), + }); + } else { + const children = v.children.filter((v) => { + if (include?.length) { + return include.includes(v.value); + } else if (exclude?.length) { + return !exclude.includes(v.value); + } + return true; + }); + optionArr.push({ + ...v, + children, + }); + } + }); + return optionArr; + }; return ( @@ -170,7 +202,7 @@ export const AddFieldAction = (props) => { } }} > - {getOptions().map((option) => { + {getFieldOptions().map((option) => { return ( option.children.length > 0 && ( diff --git a/packages/core/client/src/collection-manager/Configuration/ConfigurationTable.tsx b/packages/core/client/src/collection-manager/Configuration/ConfigurationTable.tsx index 28b4ca81d..31e4d4ced 100644 --- a/packages/core/client/src/collection-manager/Configuration/ConfigurationTable.tsx +++ b/packages/core/client/src/collection-manager/Configuration/ConfigurationTable.tsx @@ -1,13 +1,12 @@ import { useForm } from '@formily/react'; import { action } from '@formily/reactive'; import { uid } from '@formily/shared'; -import React, { useContext, useEffect, useRef, useState } from 'react'; +import React, { useContext, useRef, useState } from 'react'; import { CollectionFieldsTable } from '.'; -import { useRequest } from '../../api-client'; import { useCurrentAppInfo } from '../../appInfo'; import { useRecord } from '../../record-provider'; -import { SchemaComponent, SchemaComponentContext, useActionContext, useCompile } from '../../schema-component'; -import { useCancelAction, useUpdateCollectionActionAndRefreshCM } from '../action-hooks'; +import { SchemaComponent, SchemaComponentContext, useCompile } from '../../schema-component'; +import { useCancelAction } from '../action-hooks'; import { useCollectionManager } from '../hooks/useCollectionManager'; import { DataSourceContext } from '../sub-table'; import { AddSubFieldAction } from './AddSubFieldAction'; @@ -25,109 +24,6 @@ const useAsyncDataSource = (service: any) => (field: any) => { ); }; -const useCollectionValues = (options) => { - const { visible } = useActionContext(); - const result = useRequest( - () => - Promise.resolve({ - data: { - name: `t_${uid()}`, - createdBy: true, - updatedBy: true, - sortable: true, - logging: true, - fields: [ - { - name: 'id', - type: 'bigInt', - autoIncrement: true, - primaryKey: true, - allowNull: false, - uiSchema: { type: 'number', title: '{{t("ID")}}', 'x-component': 'InputNumber', 'x-read-pretty': true }, - interface: 'id', - }, - { - interface: 'createdAt', - type: 'date', - field: 'createdAt', - name: 'createdAt', - uiSchema: { - type: 'datetime', - title: '{{t("Created at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - interface: 'createdBy', - type: 'belongsTo', - target: 'users', - foreignKey: 'createdById', - name: 'createdBy', - uiSchema: { - type: 'object', - title: '{{t("Created by")}}', - 'x-component': 'RecordPicker', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - }, - { - type: 'date', - field: 'updatedAt', - name: 'updatedAt', - interface: 'updatedAt', - uiSchema: { - type: 'string', - title: '{{t("Last updated at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - type: 'belongsTo', - target: 'users', - foreignKey: 'updatedById', - name: 'updatedBy', - interface: 'updatedBy', - uiSchema: { - type: 'object', - title: '{{t("Last updated by")}}', - 'x-component': 'RecordPicker', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - }, - ], - }, - }), - { - ...options, - manual: true, - }, - ); - - useEffect(() => { - if (visible) { - result.run(); - } - }, [visible]); - - return result; -}; - const useSelectedRowKeys = () => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); return [selectedRowKeys, setSelectedRowKeys]; @@ -205,13 +101,11 @@ export const ConfigurationTable = () => { useDestroySubField, useBulkDestroySubField, useSelectedRowKeys, - useCollectionValues, useAsyncDataSource, loadCollections, useCurrentFields, useNewId, useCancelAction, - useUpdateCollectionActionAndRefreshCM, enableInherits: database?.dialect === 'postgres', }} /> diff --git a/packages/core/client/src/collection-manager/Configuration/EditCollectionAction.tsx b/packages/core/client/src/collection-manager/Configuration/EditCollectionAction.tsx new file mode 100644 index 000000000..3799e1dee --- /dev/null +++ b/packages/core/client/src/collection-manager/Configuration/EditCollectionAction.tsx @@ -0,0 +1,161 @@ +import { ArrayTable } from '@formily/antd'; +import { ISchema, useForm } from '@formily/react'; +import { uid } from '@formily/shared'; +import { omit } from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useRequest } from '../../api-client'; +import { RecordProvider, useRecord } from '../../record-provider'; +import { ActionContext, SchemaComponent, useActionContext, useCompile } from '../../schema-component'; +import { useCancelAction } from '../action-hooks'; +import { useCollectionManager } from '../hooks'; +import { IField } from '../interfaces/types'; +import { useResourceActionContext, useResourceContext } from '../ResourceActionProvider'; +import * as components from './components'; + +const getSchema = (schema: IField, record: any, compile, getContainer): ISchema => { + if (!schema) { + return; + } + const properties = (cloneDeep(schema.configurableProperties) as any) || { + title: { + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + }, + name: { + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + 'x-disabled': true, + }, + }; + properties.name['x-disabled'] = true; + if (schema.hasDefaultValue === true) { + properties['defaultValue'] = cloneDeep(schema.default.uiSchema); + properties['defaultValue']['title'] = compile('{{ t("Default value") }}'); + properties['defaultValue']['x-decorator'] = 'FormItem'; + } + + return { + type: 'object', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Action.Drawer', + 'x-decorator': 'Form', + 'x-decorator-props': { + useValues: '{{ useValuesFromRecord }}', + }, + title: '{{ t("Edit collection") }}', + properties: { + ...properties, + footer: { + type: 'void', + 'x-component': 'Action.Drawer.Footer', + properties: { + action1: { + title: '{{ t("Cancel") }}', + 'x-component': 'Action', + 'x-component-props': { + useAction: '{{ useCancelAction }}', + }, + }, + action2: { + title: '{{ t("Submit") }}', + 'x-component': 'Action', + 'x-component-props': { + type: 'primary', + useAction: '{{ useUpdateCollectionActionAndRefreshCM }}', + }, + }, + }, + }, + }, + }, + }, + }; +}; + +export const useValuesFromRecord = (options) => { + const record = useRecord(); + const result = useRequest(() => Promise.resolve({ data: { autoGenId: true, ...record } }), { + ...options, + manual: true, + }); + const ctx = useActionContext(); + useEffect(() => { + if (ctx.visible) { + result.run(); + } + }, [ctx.visible]); + return result; +}; + +export const useUpdateCollectionActionAndRefreshCM = (options) => { + const { refreshCM } = useCollectionManager(); + const form = useForm(); + const ctx = useActionContext(); + const { refresh } = useResourceActionContext(); + const { resource, targetKey } = useResourceContext(); + const { [targetKey]: filterByTk } = useRecord(); + return { + async run() { + await form.submit(); + await resource.update({ filterByTk, values: omit(form.values, ['fields']) }); + ctx.setVisible(false); + await form.reset(); + refresh(); + await refreshCM(); + }, + }; +}; + +export const EditCollection = (props) => { + const record = useRecord(); + return ; +}; + +export const EditCollectionAction = (props) => { + const { scope, getContainer, item: record, children } = props; + const { getTemplate } = useCollectionManager(); + const [visible, setVisible] = useState(false); + const [schema, setSchema] = useState({}); + const { t } = useTranslation(); + const compile = useCompile(); + + return ( + + + { + const templateConf = getTemplate(record.template); + const schema = getSchema( + { + ...templateConf, + }, + record, + compile, + getContainer, + ); + setSchema(schema); + setVisible(true); + }} + > + {children || t('Edit')} + + + + + ); +}; diff --git a/packages/core/client/src/collection-manager/Configuration/components/CollectionTemplate.tsx b/packages/core/client/src/collection-manager/Configuration/components/CollectionTemplate.tsx new file mode 100644 index 000000000..e4b618a9d --- /dev/null +++ b/packages/core/client/src/collection-manager/Configuration/components/CollectionTemplate.tsx @@ -0,0 +1,14 @@ +import { observer } from '@formily/react'; +import { Tag } from 'antd'; +import React from 'react'; +import { useCompile } from '../../../schema-component'; +import { useCollectionManager } from '../../hooks'; + +export const CollectionTemplate = observer((props: any) => { + const { value } = props; + const { getTemplate } = useCollectionManager(); + const compile = useCompile(); + const schema = getTemplate(value); + + return {compile(schema?.title||'{{t("General collection")}}')}; +}); diff --git a/packages/core/client/src/collection-manager/Configuration/index.tsx b/packages/core/client/src/collection-manager/Configuration/index.tsx index 7e994d938..5adfe6afa 100644 --- a/packages/core/client/src/collection-manager/Configuration/index.tsx +++ b/packages/core/client/src/collection-manager/Configuration/index.tsx @@ -1,15 +1,17 @@ import { registerValidateFormats } from '@formily/core'; -import { exp } from 'mathjs'; export * from './AddFieldAction'; export * from './ConfigurationTable'; export * from './EditFieldAction'; export * from './interfaces'; export * from './components'; +export * from './templates'; export * from './CollectionFieldsTable'; -export * from './schemas/collections' -export * from './OverridingCollectionField' -export * from './ViewInheritedField' +export * from './schemas/collections'; +export * from './OverridingCollectionField'; +export * from './ViewInheritedField'; +export * from './AddCollectionAction'; +export * from './EditCollectionAction'; registerValidateFormats({ uid: /^[A-Za-z0-9][A-Za-z0-9_-]*$/, diff --git a/packages/core/client/src/collection-manager/Configuration/interfaces.tsx b/packages/core/client/src/collection-manager/Configuration/interfaces.tsx index 4e6622baa..3e4ffb79b 100644 --- a/packages/core/client/src/collection-manager/Configuration/interfaces.tsx +++ b/packages/core/client/src/collection-manager/Configuration/interfaces.tsx @@ -35,6 +35,7 @@ export const getOptions = () => { return Object.keys(groupLabels).map((groupName) => { return { label: groupLabels[groupName], + key: groupName, children: Object.keys(fields[groupName] || {}) .map((type) => { const field = fields[groupName][type]; diff --git a/packages/core/client/src/collection-manager/Configuration/schemas/collections.ts b/packages/core/client/src/collection-manager/Configuration/schemas/collections.ts index 451010e81..da6ab39f0 100644 --- a/packages/core/client/src/collection-manager/Configuration/schemas/collections.ts +++ b/packages/core/client/src/collection-manager/Configuration/schemas/collections.ts @@ -1,6 +1,7 @@ import { ISchema, Schema } from '@formily/react'; import { i18n } from '../../../i18n'; import { CollectionOptions } from '../../types'; +import { CollectionTemplate } from '../components/CollectionTemplate'; import { collectionFieldSchema } from './collectionFields'; const compile = (source) => { @@ -35,6 +36,16 @@ export const collection: CollectionOptions = { '{{t("Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.")}}', }, }, + { + type: 'string', + name: 'template', + interface: 'input', + uiSchema: { + title: '{{ t("Collection Template") }}', + type: 'string', + 'x-component': 'Input', + }, + }, { type: 'hasMany', name: 'fields', @@ -60,85 +71,6 @@ export const collection: CollectionOptions = { ], }; -export const createCollectionProperties = { - title: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - }, - name: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-validator': 'uid', - }, - inherits: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-visible': '{{ enableInherits}}', - 'x-reactions': ['{{useAsyncDataSource(loadCollections)}}'], - }, - footer: { - type: 'void', - 'x-component': 'Action.Drawer.Footer', - properties: { - action1: { - title: '{{ t("Cancel") }}', - 'x-component': 'Action', - 'x-component-props': { - useAction: '{{ cm.useCancelAction }}', - }, - }, - action2: { - title: '{{ t("Submit") }}', - 'x-component': 'Action', - 'x-component-props': { - type: 'primary', - useAction: '{{ cm.useCreateActionAndRefreshCM }}', - }, - }, - }, - }, -}; - -export const editCollectionProperties = { - title: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - }, - name: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-disabled': true, - }, - inherits: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-disabled': true, - 'x-visible': '{{ enableInherits}}', - 'x-reactions': ['{{useAsyncDataSource(loadCollections)}}'], - }, - footer: { - type: 'void', - 'x-component': 'Action.Drawer.Footer', - properties: { - action1: { - title: '{{ t("Cancel") }}', - 'x-component': 'Action', - 'x-component-props': { - useAction: '{{ useCancelAction }}', - }, - }, - action2: { - title: '{{ t("Submit") }}', - 'x-component': 'Action', - 'x-component-props': { - type: 'primary', - useAction: '{{ useUpdateCollectionActionAndRefreshCM }}', - }, - }, - }, - }, -}; - export const collectionSchema: ISchema = { type: 'object', properties: { @@ -190,6 +122,7 @@ export const collectionSchema: ISchema = { title: '{{ t("Delete") }}', 'x-component': 'Action', 'x-component-props': { + icon: 'DeleteOutlined', useAction: '{{ cm.useBulkDestroyActionAndRefreshCM }}', confirm: { title: "{{t('Delete record')}}", @@ -200,22 +133,10 @@ export const collectionSchema: ISchema = { create: { type: 'void', title: '{{ t("Create collection") }}', - 'x-component': 'Action', + 'x-component': 'AddCollection', 'x-component-props': { type: 'primary', }, - properties: { - drawer: { - type: 'void', - title: '{{ t("Create collection") }}', - 'x-component': 'Action.Drawer', - 'x-decorator': 'Form', - 'x-decorator-props': { - useValues: '{{ useCollectionValues }}', - }, - properties: createCollectionProperties, - }, - }, }, }, }, @@ -255,6 +176,18 @@ export const collectionSchema: ISchema = { }, }, column3: { + type: 'void', + 'x-decorator': 'Table.Column.Decorator', + 'x-component': 'Table.Column', + title: '{{t("Collection template")}}', + properties: { + template: { + 'x-component': CollectionTemplate, + 'x-read-pretty': true, + }, + }, + }, + column4: { type: 'void', title: '{{ t("Actions") }}', 'x-component': 'Table.Column', @@ -294,22 +227,10 @@ export const collectionSchema: ISchema = { update: { type: 'void', title: '{{ t("Edit") }}', - 'x-component': 'Action.Link', + 'x-component': 'EditCollection', 'x-component-props': { type: 'primary', }, - properties: { - drawer: { - type: 'void', - 'x-component': 'Action.Drawer', - 'x-decorator': 'Form', - 'x-decorator-props': { - useValues: '{{ cm.useValuesFromRecord }}', - }, - title: '{{ t("Edit collection") }}', - properties: editCollectionProperties, - }, - }, }, delete: { type: 'void', diff --git a/packages/core/client/src/collection-manager/Configuration/templates.tsx b/packages/core/client/src/collection-manager/Configuration/templates.tsx new file mode 100644 index 000000000..7b6b95a62 --- /dev/null +++ b/packages/core/client/src/collection-manager/Configuration/templates.tsx @@ -0,0 +1,23 @@ +import { ISchema } from '@formily/react'; +import * as types from '../templates'; + +export const templates = new Map(); + +const collectionTemplates: any = {}; + +export function registerTemplate(key: string, schema: any) { + collectionTemplates[key] = schema; +} + +Object.keys(types).forEach((type) => { + const schema = types[type]; + registerTemplate(schema.name || 'others', { order: 0, ...schema }); +}); +export const templateOptions = () => + Object.keys(collectionTemplates) + .sort((a, b) => { + return collectionTemplates[a].order - collectionTemplates[b].order; + }) + .map((templace) => { + return collectionTemplates[templace]; + }); diff --git a/packages/core/client/src/collection-manager/action-hooks.ts b/packages/core/client/src/collection-manager/action-hooks.ts index ecfaef4ed..a9ca6c221 100644 --- a/packages/core/client/src/collection-manager/action-hooks.ts +++ b/packages/core/client/src/collection-manager/action-hooks.ts @@ -259,39 +259,6 @@ export const useBulkDestroyAction = () => { }; }; -export const useUpdateCollectionActionAndRefreshCM = (options) => { - const { refreshCM } = useCollectionManager(); - const form = useForm(); - const ctx = useActionContext(); - const { refresh } = useResourceActionContext(); - const { resource, targetKey } = useResourceContext(); - const { [targetKey]: filterByTk } = useRecord(); - return { - async run() { - await form.submit(); - await resource.update({ filterByTk, values: omit(form.values, ['fields']) }); - ctx.setVisible(false); - await form.reset(); - refresh(); - await refreshCM(); - }, - }; -}; - -export const useValuesFromRecord = (options) => { - const record = useRecord(); - const result = useRequest(() => Promise.resolve({ data: record }), { - ...options, - manual: true, - }); - const ctx = useActionContext(); - useEffect(() => { - if (ctx.visible) { - result.run(); - } - }, [ctx.visible]); - return result; -}; export const useValuesFromRA = (options) => { const ctx = useResourceActionContext(); diff --git a/packages/core/client/src/collection-manager/hooks/useCollectionManager.ts b/packages/core/client/src/collection-manager/hooks/useCollectionManager.ts index 823a1ef2a..694538c25 100644 --- a/packages/core/client/src/collection-manager/hooks/useCollectionManager.ts +++ b/packages/core/client/src/collection-manager/hooks/useCollectionManager.ts @@ -1,11 +1,11 @@ import { clone } from '@formily/shared'; +import { reduce, unionBy, uniq } from 'lodash'; import { useContext } from 'react'; -import { reduce, unionBy,uniq } from 'lodash'; import { CollectionManagerContext } from '../context'; import { CollectionFieldOptions } from '../types'; export const useCollectionManager = () => { - const { refreshCM, service, interfaces, collections } = useContext(CollectionManagerContext); + const { refreshCM, service, interfaces, collections, templates } = useContext(CollectionManagerContext); const getInheritedFields = (name) => { const inheritKeys = getInheritCollections(name); const inheritedFields = reduce( @@ -22,7 +22,7 @@ export const useCollectionManager = () => { const getCollectionFields = (name: string): CollectionFieldOptions[] => { const currentFields = collections?.find((collection) => collection.name === name)?.fields; const inheritedFields = getInheritedFields(name); - const totalFields = unionBy(currentFields?.concat(inheritedFields) || [], 'name').filter((v:any) => { + const totalFields = unionBy(currentFields?.concat(inheritedFields) || [], 'name').filter((v: any) => { return !v.isForeignKey; }); return totalFields; @@ -122,6 +122,9 @@ export const useCollectionManager = () => { getInterface(name: string) { return interfaces[name] ? clone(interfaces[name]) : null; }, + getTemplate(name: string = 'general') { + return templates[name] ? clone(templates[name] || templates['general']) : null; + }, getParentCollectionFields: (parentCollection, currentCollection) => { const currentFields = collections?.find((collection) => collection.name === currentCollection)?.fields; const parentFields = collections?.find((collection) => collection.name === parentCollection)?.fields; diff --git a/packages/core/client/src/collection-manager/index.tsx b/packages/core/client/src/collection-manager/index.tsx index 37ec7fd6c..f73433e2a 100644 --- a/packages/core/client/src/collection-manager/index.tsx +++ b/packages/core/client/src/collection-manager/index.tsx @@ -12,5 +12,7 @@ export * from './hooks'; export * as interfacesProperties from './interfaces/properties'; export * from './interfaces/types'; export * from './ResourceActionProvider'; +export { getConfigurableProperties } from './templates/properties'; +export * from './templates/types'; export * from './types'; diff --git a/packages/core/client/src/collection-manager/interfaces/properties/index.ts b/packages/core/client/src/collection-manager/interfaces/properties/index.ts index dbc2722d4..00a2ed39a 100644 --- a/packages/core/client/src/collection-manager/interfaces/properties/index.ts +++ b/packages/core/client/src/collection-manager/interfaces/properties/index.ts @@ -60,6 +60,7 @@ export const constraintsProps = { title: '{{t("ON DELETE")}}', required: true, default: 'SET NULL', + 'x-disabled': '{{ !createOnly }}', 'x-decorator': 'FormItem', 'x-component': 'Select', enum: [ diff --git a/packages/core/client/src/collection-manager/templates/calendar.tsx b/packages/core/client/src/collection-manager/templates/calendar.tsx new file mode 100644 index 000000000..8ae68baa4 --- /dev/null +++ b/packages/core/client/src/collection-manager/templates/calendar.tsx @@ -0,0 +1,37 @@ +import { getConfigurableProperties } from './properties'; +import { ICollectionTemplate } from './types'; + +export const calendar: ICollectionTemplate = { + name: 'calendar', + title: '{{t("Calendar collection")}}', + order: 2, + color: 'orange', + default: { + fields: [ + { + name: 'cron', + type: 'string', + uiSchema: { + type: 'string', + title: '{{t("Cron")}}', + 'x-component': 'Select', + enum: [ + { value: '0 0 * * *', label: '每天' }, + { value: '0 0 ? * 1', label: '每个星期一' }, + { value: '0 0 12 * * ?', label: '每天中午12点' }, + { value: '0 0 10,14,16 * * ?', label: '每天上午10点,下午2点,4点 ' }, + ], + }, + interface: 'select', + }, + { + name: 'exclude', + type: 'json', + }, + ], + }, + availableFieldInterfaces: { + include: [], + }, + configurableProperties: getConfigurableProperties('title', 'name', 'inherits'), +}; diff --git a/packages/core/client/src/collection-manager/templates/general.tsx b/packages/core/client/src/collection-manager/templates/general.tsx new file mode 100644 index 000000000..805028460 --- /dev/null +++ b/packages/core/client/src/collection-manager/templates/general.tsx @@ -0,0 +1,23 @@ +import { getConfigurableProperties } from './properties'; +import { ICollectionTemplate } from './types'; + +export const general: ICollectionTemplate = { + name: 'general', + title: '{{t("General collection")}}', + order: 1, + color: 'blue', + default: { + fields: [], + }, + configurableProperties: getConfigurableProperties( + 'title', + 'name', + 'inherits', + 'autoGenId', + 'createdAt', + 'updatedAt', + 'createdBy', + 'updatedBy', + 'sortable', + ), +}; diff --git a/packages/core/client/src/collection-manager/templates/index.tsx b/packages/core/client/src/collection-manager/templates/index.tsx new file mode 100644 index 000000000..09afc72d4 --- /dev/null +++ b/packages/core/client/src/collection-manager/templates/index.tsx @@ -0,0 +1,3 @@ +export * from './calendar'; +export * from './general'; + diff --git a/packages/core/client/src/collection-manager/templates/properties/index.ts b/packages/core/client/src/collection-manager/templates/properties/index.ts new file mode 100644 index 000000000..81b838a7d --- /dev/null +++ b/packages/core/client/src/collection-manager/templates/properties/index.ts @@ -0,0 +1,121 @@ +export const defaultConfigurableProperties = { + title: { + type: 'string', + title: '{{ t("Collection display name") }}', + required: true, + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + name: { + type: 'string', + title: '{{t("Collection name")}}', + required: true, + 'x-disabled': '{{ !createOnly }}', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-validator': 'uid', + description: + "{{t('Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.')}}", + }, + inherits: { + title: '{{t("Inherits")}}', + type: 'hasMany', + name: 'inherits', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + mode: 'multiple', + }, + 'x-disabled': '{{ !createOnly }}', + 'x-visible': '{{ enableInherits}}', + 'x-reactions': ['{{useAsyncDataSource(loadCollections)}}'], + }, + autoGenId: { + type: 'boolean', + 'x-content': '{{t("AutoGenId")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + 'x-reactions': [ + { + target: 'sortable', + when: '{{createOnly&&!$self.value}}', + fulfill: { + state: { + value: false, + }, + schema: { + 'x-disabled': true, + }, + }, + otherwise: { + schema: { + 'x-disabled': '{{!createOnly}}', + }, + }, + }, + ], + }, + createdBy: { + type: 'boolean', + 'x-content': '{{t("CreatedBy")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + }, + updatedBy: { + type: 'boolean', + 'x-content': '{{t("UpdatedBy")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + }, + createdAt: { + type: 'boolean', + 'x-content': '{{t("CreatedAt")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + }, + updatedAt: { + type: 'boolean', + 'x-content': '{{t("UpdatedAt")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + }, + sortable: { + type: 'boolean', + 'x-content': '{{t("Records can be sorted")}}', + default: true, + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-disabled': '{{ !createOnly }}', + }, +}; + +export type DefaultConfigurableKeys = + | 'name' + | 'title' + | 'inherits' + | 'autoGenId' + | 'createdBy' + | 'updatedBy' + | 'createdAt' + | 'updatedAt' + | 'sortable'; + +export const getConfigurableProperties = (...keys: DefaultConfigurableKeys[]) => { + const props = {}; + for (const key of keys) { + if (defaultConfigurableProperties[key]) { + props[key] = defaultConfigurableProperties[key]; + } + } + return props; +}; diff --git a/packages/core/client/src/collection-manager/templates/treeCollection.tsx b/packages/core/client/src/collection-manager/templates/treeCollection.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/client/src/collection-manager/templates/types.ts b/packages/core/client/src/collection-manager/templates/types.ts new file mode 100644 index 000000000..b1a858fe3 --- /dev/null +++ b/packages/core/client/src/collection-manager/templates/types.ts @@ -0,0 +1,52 @@ +import { ISchema } from '@formily/react'; +import { FieldOptions } from '../../collection-manager/types'; + + + +export interface ICollectionTemplate { + name: string; + title?: string; + color?:string; + /** 排序 */ + order?: number; + /** 默认配置 */ + default?: CollectionOptions; + /** UI 可配置的 CollectionOptions 参数(添加或编辑的 Collection 表单的字段) */ + configurableProperties?: Record; + /** 当前模板可用的字段类型 */ + availableFieldInterfaces?: AvailableFieldInterfacesInclude | AvailableFieldInterfacesExclude; +} + +interface AvailableFieldInterfacesInclude { + include?: any[]; +} + +interface AvailableFieldInterfacesExclude { + exclude?: any[]; +} + +interface CollectionOptions { + /** + * 自动生成 id + * @default true + * */ + autoGenId?: boolean; + /** 创建人 */ + createdBy?: boolean; + /** 最后更新人 */ + updatedBy?: boolean; + /** 创建日期 */ + createdAt?: boolean; + /** 更新日期 */ + updatedAt?: boolean; + /** 可排序 */ + sortable?: boolean; + /* 树结构 */ + tree?: string; + /* 日志 */ + logging?: boolean; + /** 继承 */ + inherits?: string | string[]; + /* 字段列表 */ + fields?: FieldOptions[]; +} diff --git a/packages/core/client/src/collection-manager/types.ts b/packages/core/client/src/collection-manager/types.ts index 0925db7cf..5719f5660 100644 --- a/packages/core/client/src/collection-manager/types.ts +++ b/packages/core/client/src/collection-manager/types.ts @@ -4,6 +4,7 @@ export interface CollectionManagerOptions { service?: any; interfaces?: any; collections?: any[]; + templates?: any; refreshCM?: () => Promise; } diff --git a/packages/core/client/src/locale/en_US.ts b/packages/core/client/src/locale/en_US.ts index 7cb0482f1..916632e51 100644 --- a/packages/core/client/src/locale/en_US.ts +++ b/packages/core/client/src/locale/en_US.ts @@ -114,6 +114,15 @@ export default { "Collection display name": "Collection display name", "Collection name": "Collection name", "Inherits":"Inherits", + "AutoGenId":"Auto-generated ID field", + "CreatedBy":"Recording a row's created user", + "UpdatedBy":"Recording a row's last updated user", + "CreatedAt":"Recording a row's created time ", + "UpdatedAt":"Recording a row's last updated user", + "Records can be sorted": "Records can be sorted", + "Collection template":"Collection template", + "Calendar collection":"Calendar collection", + "General collection":"General collection", "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.", "Storage type": "Storage type", "Edit": "Edit", diff --git a/packages/core/client/src/locale/ja_JP.ts b/packages/core/client/src/locale/ja_JP.ts index 7604e0a55..4b9517ca9 100644 --- a/packages/core/client/src/locale/ja_JP.ts +++ b/packages/core/client/src/locale/ja_JP.ts @@ -107,6 +107,16 @@ export default { "Create collection": "コレクションの作成", "Collection display name": "コレクション名", "Collection name": "コレクション識別子", + "Inherits":"継承", + "AutoGenId":"IDフィールドの自動生成", + "CreatedBy":"レコード作成者", + "UpdatedBy":"レコード最終更新者", + "CreatedAt":"レコード作成時間", + "UpdatedAt":"レコード最終更新時間", + "Records can be sorted":"ソート可能", + "Collection template":"データテーブルテンプレート", + "Calendar collection":"カレンダデータテーブル", + "General collection":"一般データテーブル", "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "ランダムに生成され、変更可能です。 アルファベット、数字、アンダースコアをサポートし、アルファベットから始まる必要があります。", "Storage type": "ストレージタイプ", "Edit": "編集", @@ -503,6 +513,5 @@ export default { "Format": "フォーマット", "Error message": "エラーメッセージ", "Record picker": "レコードピッカー", - "Sortable": "ソート可能", "Search and select collection": "Search and select collection", } diff --git a/packages/core/client/src/locale/zh_CN.ts b/packages/core/client/src/locale/zh_CN.ts index 12aac6676..ce6798f4b 100644 --- a/packages/core/client/src/locale/zh_CN.ts +++ b/packages/core/client/src/locale/zh_CN.ts @@ -118,6 +118,15 @@ export default { "Collection display name": "数据表名称", "Collection name": "数据表标识", "Inherits":"继承", + "AutoGenId":"自动生成 ID 字段", + "CreatedBy":"记录创建人", + "UpdatedBy":"记录最后更新人", + "CreatedAt":"记录创建时间", + "UpdatedAt":"记录最后更新时间", + "Records can be sorted":"可以对行记录进行排序", + "Collection template":"数据表模板", + "Calendar collection":"日历数据表", + "General collection":"普通数据表", "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "随机生成,可修改。支持英文、数字和下划线,必须以英文字母开头。", "Storage type": "存储类型", "Edit": "编辑", @@ -228,7 +237,6 @@ export default { "Editable": "可编辑", "Readonly": "只读(禁止编辑)", "Easy-reading": "只读(阅读模式)", - "Sortable": "可排序", "Add filter": "添加筛选条件", "Add filter group": "添加筛选分组", "Comparision": "值比较", diff --git a/packages/core/client/src/schema-component/antd/table-v2/TableBlockDesigner.tsx b/packages/core/client/src/schema-component/antd/table-v2/TableBlockDesigner.tsx index 705adac2c..4c0aef8f7 100644 --- a/packages/core/client/src/schema-component/antd/table-v2/TableBlockDesigner.tsx +++ b/packages/core/client/src/schema-component/antd/table-v2/TableBlockDesigner.tsx @@ -37,7 +37,7 @@ export const TableBlockDesigner = () => { return ( - { @@ -51,7 +51,7 @@ export const TableBlockDesigner = () => { }, }); }} - /> + />} { const b = !value || selected.includes(item.name); if (item.inherit) { return false; + } else if (!item.fields.find((v) => v.primaryKey)) { + return false; } else { return b && !(item?.isThrough && item?.autoCreate); } diff --git a/packages/core/create-nocobase-app/src/generator.js b/packages/core/create-nocobase-app/src/generator.js index cb6fb67eb..adc4f3d97 100644 --- a/packages/core/create-nocobase-app/src/generator.js +++ b/packages/core/create-nocobase-app/src/generator.js @@ -105,6 +105,15 @@ class AppGenerator extends Generator { break; } + const keys = ['PLUGIN_PACKAGE_PREFIX', 'DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_USER', 'DB_PASSWORD', 'DB_STORAGE']; + + for (const key in env) { + if (keys.includes(key)) { + continue; + } + envs.push(`${key}=${env[key]}`); + } + return { ...this.context, dependencies: dependencies.join(`,\n `), diff --git a/packages/presets/nocobase/src/index.ts b/packages/presets/nocobase/src/index.ts index 8d63e6ade..a99fb9fd9 100644 --- a/packages/presets/nocobase/src/index.ts +++ b/packages/presets/nocobase/src/index.ts @@ -3,23 +3,25 @@ import path from 'path'; export class PresetNocoBase extends Plugin { async addBuiltInPlugins() { - const plugins = [ - 'error-handler', - 'collection-manager', - 'ui-schema-storage', - 'ui-routes-storage', - 'file-manager', - 'system-settings', - 'verification', - 'users', - 'acl', - 'china-region', - 'workflow', - 'client', - 'export', - 'import', - 'audit-logs', - ]; + const plugins = process.env.PRESET_NOCOBASE_PLUGINS + ? process.env.PRESET_NOCOBASE_PLUGINS.split(',') + : [ + 'error-handler', + 'collection-manager', + 'ui-schema-storage', + 'ui-routes-storage', + 'file-manager', + 'system-settings', + 'verification', + 'users', + 'acl', + 'china-region', + 'workflow', + 'client', + 'export', + 'import', + 'audit-logs', + ]; await this.app.pm.add(plugins, { enabled: true, builtIn: true, diff --git a/packages/pro-plugins b/packages/pro-plugins index 5a5fba41a..67f51c7fd 160000 --- a/packages/pro-plugins +++ b/packages/pro-plugins @@ -1 +1 @@ -Subproject commit 5a5fba41ae1cecaf3b073fcb610e9dc68dad0b85 +Subproject commit 67f51c7fdd132ab12821f31f737b6f0cfb70d212 diff --git a/packages/samples/custom-collection-template/README.md b/packages/samples/custom-collection-template/README.md new file mode 100644 index 000000000..3a67dc5a4 --- /dev/null +++ b/packages/samples/custom-collection-template/README.md @@ -0,0 +1,28 @@ +# custom-collection-template + +## Register + +```ts +yarn pm add sample-custom-collection-template +``` + +## Activate + +```bash +yarn pm enable sample-custom-collection-template +``` + +## Launch the app + +```bash +# for development +yarn dev + +# for production +yarn build +yarn start +``` + +## Demo + +[gif] diff --git a/packages/samples/custom-collection-template/client.d.ts b/packages/samples/custom-collection-template/client.d.ts new file mode 100755 index 000000000..765db9222 --- /dev/null +++ b/packages/samples/custom-collection-template/client.d.ts @@ -0,0 +1,4 @@ +// @ts-nocheck +export * from './lib/client'; +export { default } from './lib/client'; + diff --git a/packages/samples/custom-collection-template/client.js b/packages/samples/custom-collection-template/client.js new file mode 100755 index 000000000..238820257 --- /dev/null +++ b/packages/samples/custom-collection-template/client.js @@ -0,0 +1,30 @@ +"use strict"; + +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var _index = _interopRequireWildcard(require("./lib/client")); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var _exportNames = {}; +Object.defineProperty(exports, "default", { + enumerable: true, + get: function get() { + return _index.default; + } +}); + +Object.keys(_index).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function get() { + return _index[key]; + } + }); +}); diff --git a/packages/samples/custom-collection-template/package.json b/packages/samples/custom-collection-template/package.json new file mode 100644 index 000000000..a98409c41 --- /dev/null +++ b/packages/samples/custom-collection-template/package.json @@ -0,0 +1,11 @@ +{ + "name": "@nocobase/plugin-sample-custom-collection-template", + "version": "0.8.0-alpha.13", + "main": "lib/server/index.js", + "devDependencies": { + "@nocobase/client": "0.8.0-alpha.13", + "@nocobase/server": "0.8.0-alpha.13", + "@nocobase/test": "0.8.0-alpha.13" + }, + "gitHead": "ce588eefb0bfc50f7d5bbee575e0b5e843bf6644" +} diff --git a/packages/samples/custom-collection-template/src/client/index.tsx b/packages/samples/custom-collection-template/src/client/index.tsx new file mode 100644 index 000000000..74834215a --- /dev/null +++ b/packages/samples/custom-collection-template/src/client/index.tsx @@ -0,0 +1,31 @@ +import { getConfigurableProperties, ICollectionTemplate, registerTemplate } from '@nocobase/client'; +import React from 'react'; + +const myCollectionTemplate: ICollectionTemplate = { + name: 'myCollection', + title: '{{t("Custom template")}}', + order: 6, + color: 'blue', + default: { + fields: [ + { + name: 'uuid', + type: 'string', + primaryKey: true, + allowNull: false, + uiSchema: { type: 'number', title: '{{t("UUID")}}', 'x-component': 'Input', 'x-read-pretty': true }, + interface: 'input', + }, + ], + }, + configurableProperties: getConfigurableProperties('name', 'title', 'inherits', 'createdAt', 'updatedAt'), + availableFieldInterfaces: { + exclude: ['linkTo', 'o2o'], + }, +}; + +registerTemplate('myCollection', myCollectionTemplate); + +export default React.memo((props) => { + return <>{props.children}; +}); diff --git a/packages/samples/custom-collection-template/src/index.ts b/packages/samples/custom-collection-template/src/index.ts new file mode 100644 index 000000000..7ddad5814 --- /dev/null +++ b/packages/samples/custom-collection-template/src/index.ts @@ -0,0 +1 @@ +export { default } from './server'; diff --git a/packages/samples/custom-collection-template/src/server/index.ts b/packages/samples/custom-collection-template/src/server/index.ts new file mode 100644 index 000000000..75c6b5349 --- /dev/null +++ b/packages/samples/custom-collection-template/src/server/index.ts @@ -0,0 +1,16 @@ +import { InstallOptions, Plugin } from '@nocobase/server'; + +export class CustomCollectionTemplatePlugin extends Plugin { + + afterAdd() {} + + beforeLoad() {} + + async load() {} + + async install(options: InstallOptions) { + // TODO + } +} + +export default CustomCollectionTemplatePlugin; diff --git a/yarn.lock b/yarn.lock index cdd33bb78..1f7c9cdbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -329,23 +329,6 @@ csstype "^3.0.8" tslib "^2.0.3" -"@antv/x6-react-shape@^1.6.2": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@antv/x6-react-shape/-/x6-react-shape-1.6.3.tgz#053660bd555c4356e9719134e3e2a857b51301e2" - integrity sha512-iCsRVkvKCVs7HUUblF/ALg5XxeeEPXDLHuYzRvbvNlCKKLbXLbaz6vJQSgTTrk2i4lrD+7xl4riA76FyWA3k/g== - -"@antv/x6@^1.34.2": - version "1.34.6" - resolved "https://registry.yarnpkg.com/@antv/x6/-/x6-1.34.6.tgz#b802b09b52c8620acf01734397714ea5e3f715b6" - integrity sha512-cl8ywN7CTNVT94/ZEbq2mnZQTQe6FUgIlGOAjNOPL8sljZTBrpE6OsuGw4BDA2/XllwELfUfvVpgBvbdwRKrxw== - dependencies: - csstype "^3.0.3" - jquery "^3.5.1" - jquery-mousewheel "^3.1.13" - lodash-es "^4.17.15" - mousetrap "^1.6.5" - utility-types "^3.10.0" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": version "7.16.0" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" @@ -2969,15 +2952,6 @@ resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - "@dnd-kit/accessibility@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.0.0.tgz#b56e3750414fd907b7d6972b3116aa8f96d07fde" @@ -4383,153 +4357,6 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nocobase/acl@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/acl/-/acl-0.8.0-alpha.9.tgz#7ffab4a367befc74daa681b1d5c2c907126cb280" - integrity sha512-jEgpjO6gGi4GwSyWxlmcwd368/AQgmrdsODDTLhhrJJI9+ovj2mxO664lQgh3FkDGtmduKlBiZ+qcgK+/RWa1w== - dependencies: - "@nocobase/resourcer" "0.8.0-alpha.9" - json-templates "^4.2.0" - -"@nocobase/actions@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/actions/-/actions-0.8.0-alpha.9.tgz#3804bbf30f7c4e8aa205b9802ec4f56a58c18c72" - integrity sha512-EvdNjXa+TTMU2Xn+MnA7tSa5rooGFtzsvJsSYbkpODtsVQsmTDRIZYZsOYFk/XcezxjzTTsxxXMSA7sLq6wifQ== - dependencies: - "@nocobase/cache" "0.8.0-alpha.9" - "@nocobase/database" "0.8.0-alpha.9" - "@nocobase/resourcer" "0.8.0-alpha.9" - -"@nocobase/cache@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/cache/-/cache-0.8.0-alpha.9.tgz#99f7ca196dacd41b69ed7b7f179fcc1c4c5baa27" - integrity sha512-GCi7OE9nLrXKq/Og6SPtPcjtreUxxAL9x7CwmD2x3Zb7gNTc2GvQ9NWoAlO8KTLlWuzuNcJXegBhxaxV8Lt5ew== - dependencies: - cache-manager "^4.1.0" - -"@nocobase/client@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/client/-/client-0.8.0-alpha.9.tgz#03446b4c4160a7ebda9dfd8aa80e2203541eb72c" - integrity sha512-cvh01k8Ujhc9D7kDYQ7QKP5tnLF+wBOqixtisivti9aeklMBaOKj1oLmxKHZlB2IJzKpT+rUntpsxGxUS6co9A== - dependencies: - "@antv/g2plot" "^2.4.18" - "@dnd-kit/core" "^5.0.1" - "@dnd-kit/sortable" "^6.0.0" - "@emotion/css" "^11.7.1" - "@formily/antd" "2.0.20" - "@formily/core" "2.0.20" - "@formily/react" "2.0.20" - "@nocobase/sdk" "0.8.0-alpha.9" - "@nocobase/utils" "0.8.0-alpha.9" - ahooks "^3.0.5" - antd "~4.19.5" - axios "^0.26.1" - classnames "^2.3.1" - cron-parser "^4.6.0" - cronstrue "^2.11.0" - file-saver "^2.0.5" - i18next "^21.6.0" - json-templates "^4.2.0" - marked "^4.0.12" - mathjs "^10.6.0" - react-beautiful-dnd "^13.1.0" - react-big-calendar "^0.38.7" - react-contenteditable "^3.3.6" - react-drag-listview "^0.1.9" - react-helmet "^6.1.0" - react-hotkeys-hook "^3.4.7" - react-i18next "^11.15.1" - react-image-lightbox "^5.1.4" - react-js-cron "^1.4.0" - react-quill "^1.3.5" - react-router-dom "^5.2.0" - react-to-print "^2.14.7" - solarlunar-es "^1.0.9" - use-deep-compare-effect "^1.8.1" - -"@nocobase/database@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/database/-/database-0.8.0-alpha.9.tgz#9684b4ddcfc5396df2ef3d4ae9cd2ce59142df81" - integrity sha512-zkLTW2iFg1tlbSTlW40oEmM7O2GxHXmIzErnDR4it0GWoLqjDgzNHP5QjODOxiiB/+/unNFudfGTNCoXxu2ZvA== - dependencies: - "@nocobase/utils" "0.8.0-alpha.9" - async-mutex "^0.3.2" - cron-parser "4.4.0" - deepmerge "^4.2.2" - flat "^5.0.2" - glob "^7.1.6" - mathjs "^10.6.1" - moment "2.x" - semver "^7.3.7" - sequelize "^6.9.0" - umzug "^3.1.1" - -"@nocobase/resourcer@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/resourcer/-/resourcer-0.8.0-alpha.9.tgz#5415af5944b31293e5e2da73bf5c999866a90fab" - integrity sha512-6v9bfUex2RfT8C3xX+SUhj8/zECCY6pQA3ce8GV3xd9cu6ku8c7hIiNM3KwgPOD189aND3FxNwxqpECNaoWQ1A== - dependencies: - "@nocobase/utils" "0.8.0-alpha.9" - deepmerge "^4.2.2" - koa-compose "^4.1.0" - lodash "^4.17.21" - path-to-regexp "^6.1.0" - qs "^6.9.4" - -"@nocobase/sdk@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/sdk/-/sdk-0.8.0-alpha.9.tgz#5306e7bf4aabf00894a65036c584508d93bda379" - integrity sha512-v+GF4N5ldYwmoqQIukGWzz/eOm2TgxcUZq3uE+YeP/aiDa4XAfkLrpBNsvCS24k3s/U+84FYrvTWRRStJGSzBA== - dependencies: - axios "^0.26.1" - qs "^6.10.1" - -"@nocobase/server@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/server/-/server-0.8.0-alpha.9.tgz#bc1955e41b2ac9f6640fdf109516376604d4092c" - integrity sha512-/mHk2Uc8RS/3GcGvnMnFKlbf2aCufGuc+GOr5gEKuyWa50ibD4nZ7LKJx023uEO07rxWkFkhR6+ExuZ+BGRDGQ== - dependencies: - "@hapi/topo" "^6.0.0" - "@koa/cors" "^3.1.0" - "@koa/router" "^9.4.0" - "@nocobase/acl" "0.8.0-alpha.9" - "@nocobase/actions" "0.8.0-alpha.9" - "@nocobase/database" "0.8.0-alpha.9" - "@nocobase/resourcer" "0.8.0-alpha.9" - chalk "^4.1.1" - commander "^9.2.0" - find-package-json "^1.2.0" - i18next "^21.6.0" - koa "^2.13.4" - koa-bodyparser "^4.3.0" - koa-static "^5.0.0" - lodash "^4.17.21" - semver "^7.3.7" - xpipe "^1.0.5" - -"@nocobase/test@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/test/-/test-0.8.0-alpha.9.tgz#40aaed50af9b8fd23c0666156c806273c75b0a3f" - integrity sha512-bpzcogPKzfq8mjIsLDy0xlsd0dNAUgmju9kk+RPV5wNZfhvofaA7YduexawbL+dLJQC+iyjmhAhARxl8rVhKuA== - dependencies: - "@nocobase/server" "0.8.0-alpha.9" - "@types/supertest" "^2.0.11" - mockjs "^1.1.0" - mysql2 "^2.3.3" - pg "^8.7.3" - pg-hstore "^2.3.4" - sqlite3 "^5.0.8" - supertest "^6.1.6" - -"@nocobase/utils@0.8.0-alpha.9": - version "0.8.0-alpha.9" - resolved "https://registry.yarnpkg.com/@nocobase/utils/-/utils-0.8.0-alpha.9.tgz#fa7e203412e91ab7a6ebb12a6d53d83e09465591" - integrity sha512-oEqKs4+0sO4x0TFEtf+Tf1nIkb9q+9y9YmrqOn6MyMo/ejTSh6nlNt1rAYgs02gTP4uHkSOb2/4K4oDm0JXLdg== - dependencies: - "@hapi/topo" "^6.0.0" - deepmerge "^4.2.2" - flat-to-nested "^1.1.1" - "@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" @@ -6949,11 +6776,6 @@ async@^2.6.3, async@~2.6.1: dependencies: lodash "^4.17.14" -async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -8334,7 +8156,7 @@ color-support@^1.1.2, color-support@^1.1.3: resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^3.0.0, color@^3.1.3: +color@^3.0.0: version "3.2.1" resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== @@ -8357,14 +8179,6 @@ colors@~1.2.1: resolved "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - columnify@^1.5.4: version "1.5.4" resolved "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -9268,11 +9082,6 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== -csstype@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - csstype@^3.0.8: version "3.1.0" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" @@ -9322,14 +9131,6 @@ d3-timer@^1.0.9: resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== -dagre@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" - integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== - dependencies: - graphlib "^2.1.8" - lodash "^4.17.15" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -10049,11 +9850,6 @@ emojis-list@^3.0.0: resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - encodeurl@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -10942,7 +10738,7 @@ 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, fecha@~4.2.0: +fecha@~4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== @@ -10973,13 +10769,6 @@ file-saver@^2.0.5: resolved "https://registry.npmmirror.com/file-saver/download/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== -file-stream-rotator@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz#007019e735b262bb6c6f0197e58e5c87cb96cec3" - integrity sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ== - dependencies: - moment "^2.29.1" - file-type@^3.3.0: version "3.9.0" resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" @@ -11158,11 +10947,6 @@ fmin@^0.0.2: tape "^4.5.1" uglify-js "^2.6.2" -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - follow-redirects@^1.14.0, follow-redirects@^1.14.8: version "1.14.9" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" @@ -11794,13 +11578,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" - growly@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -14197,16 +13974,6 @@ jmespath@0.15.0: resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= -jquery-mousewheel@^3.1.13: - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== - -jquery@^3.5.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.1.tgz#fab0408f8b45fc19f956205773b62b292c147a16" - integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw== - js-base64@^2.5.2: version "2.6.4" resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" @@ -14674,11 +14441,6 @@ koa@^2.13.4: type-is "^1.6.16" vary "^1.1.2" -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - latest-version@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -14919,7 +14681,7 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash-es@^4.17.11, lodash-es@^4.17.15: +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== @@ -15086,17 +14848,6 @@ log-driver@^1.2.7: resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -logform@^2.3.2, logform@^2.4.0: - version "2.4.2" - resolved "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz#a617983ac0334d0c3b942c34945380062795b47c" - integrity sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw== - dependencies: - "@colors/colors" "1.5.0" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - long@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -15989,7 +15740,7 @@ moment-timezone@^0.5.31: dependencies: moment ">= 2.9.0" -moment@2.x, moment@^2.29.1: +moment@2.x: version "2.29.4" resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== @@ -16004,11 +15755,6 @@ moo@^0.5.0: resolved "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== -mousetrap@^1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9" - integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA== - mri@^1.1.5: version "1.2.0" resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -16689,11 +16435,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^2.0.1: - version "2.2.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" @@ -16814,13 +16555,6 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - onetime@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -19763,7 +19497,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.4.0, 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.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== @@ -20644,11 +20378,6 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -21337,11 +21066,6 @@ stable@^0.1.8: resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - stack-utils@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" @@ -21981,11 +21705,6 @@ text-extensions@^1.0.0: resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -22243,11 +21962,6 @@ trim-newlines@^3.0.0: resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - trough@^1.0.0: version "1.0.5" resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" @@ -23072,11 +22786,6 @@ util@^0.11.0: dependencies: inherits "2.0.3" -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - utility@0.1.11: version "0.1.11" resolved "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz#fde60cf9b4e4751947a0cf5d104ce29367226715" @@ -23469,42 +23178,6 @@ window-size@0.1.0: resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= -winston-daily-rotate-file@^4.7.1: - version "4.7.1" - resolved "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz#f60a643af87f8867f23170d8cd87dbe3603a625f" - integrity sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA== - dependencies: - file-stream-rotator "^0.6.1" - object-hash "^2.0.1" - triple-beam "^1.3.0" - winston-transport "^4.4.0" - -winston-transport@^4.4.0, winston-transport@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" - integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@^3.8.2: - version "3.8.2" - resolved "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz#56e16b34022eb4cff2638196d9646d7430fdad50" - integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== - dependencies: - "@colors/colors" "1.5.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.5.0" - wkx@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"