diff --git a/CHANGELOG.md b/CHANGELOG.md index de25d86c0a..c5cd19e823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [v1.2.35-alpha](https://github.com/nocobase/nocobase/compare/v1.2.34-alpha...v1.2.35-alpha) - 2024-08-16 + +### Merged + +- fix: the display of data source status [`#5069`](https://github.com/nocobase/nocobase/pull/5069) +- chore: upgrade mysql2 version [`#5070`](https://github.com/nocobase/nocobase/pull/5070) +- fix: filter form action bar stye improve [`#5054`](https://github.com/nocobase/nocobase/pull/5054) +- fix: quote table name in mysql query interface [`#5065`](https://github.com/nocobase/nocobase/pull/5065) +- fix: collection with non ID as the primary key will encounter an error when using gantt [`#5061`](https://github.com/nocobase/nocobase/pull/5061) +- fix: increase the upload file size limit of field-markdown-vditor [`#5063`](https://github.com/nocobase/nocobase/pull/5063) +- fix(data-vi): dependency typo [`#5060`](https://github.com/nocobase/nocobase/pull/5060) +- chore(deps): bump @babel/plugin-transform-modules-amd from 7.22.5 to 7.24.7 [`#5052`](https://github.com/nocobase/nocobase/pull/5052) +- chore(deps): bump xpipe from 1.0.5 to 1.0.7 [`#5050`](https://github.com/nocobase/nocobase/pull/5050) +- chore(deps): bump tsup from 7.2.0 to 8.2.4 [`#5046`](https://github.com/nocobase/nocobase/pull/5046) +- fix(inherit): correct title for inherited sub-collection association block [`#5048`](https://github.com/nocobase/nocobase/pull/5048) +- fix: load parent field in inherited collection [`#5044`](https://github.com/nocobase/nocobase/pull/5044) +- fix: disable edit and delete button for all records and own record in data scope configuration [`#5041`](https://github.com/nocobase/nocobase/pull/5041) +- fix(Collapse): fix issue with data scope settings being ineffective [`#4914`](https://github.com/nocobase/nocobase/pull/4914) +- fix(Table): should not error when open a popup by clicking a multi-level field [`#5038`](https://github.com/nocobase/nocobase/pull/5038) +- fix(linkageRules): fix an exception when the condition contains a association field [`#5037`](https://github.com/nocobase/nocobase/pull/5037) +- fix(client): missing sort parameter [`#5034`](https://github.com/nocobase/nocobase/pull/5034) +- fix(database): skip table doesn't exist [`#5023`](https://github.com/nocobase/nocobase/pull/5023) +- fix(variable): the chinaRegions field should not be a submenu [`#5030`](https://github.com/nocobase/nocobase/pull/5030) +- style: quick add button for association field in the form, compact theme style without adaptation [`#5024`](https://github.com/nocobase/nocobase/pull/5024) +- fix: correct foreign key value errors [`#5027`](https://github.com/nocobase/nocobase/pull/5027) +- fix: source field type filtering association fields in sql collection & view collection [`#5014`](https://github.com/nocobase/nocobase/pull/5014) +- fix: allowMultiple should not appear on read-only association fields [`#5017`](https://github.com/nocobase/nocobase/pull/5017) + +### Commits + +- chore(versions): 😊 publish v1.2.35-alpha [`39bc571`](https://github.com/nocobase/nocobase/commit/39bc5717881454cb1bf210673418e1be49f45614) +- chore: update changelog [`d37c71a`](https://github.com/nocobase/nocobase/commit/d37c71aaed459a1364a2b04bd478f529472a5ae0) +- Update LICENSE.txt [`28c2fff`](https://github.com/nocobase/nocobase/commit/28c2fff0e48ed135322839ae9f27d1740a351902) + ## [v1.2.34-alpha](https://github.com/nocobase/nocobase/compare/v1.2.33-alpha...v1.2.34-alpha) - 2024-08-08 ### Merged diff --git a/packages/core/client/src/application/hooks/index.ts b/packages/core/client/src/application/hooks/index.ts index 2f22a369a1..1a1ce63405 100644 --- a/packages/core/client/src/application/hooks/index.ts +++ b/packages/core/client/src/application/hooks/index.ts @@ -8,6 +8,7 @@ */ export * from './useApp'; +export * from './useAppSpin'; export * from './usePlugin'; export * from './useRouter'; -export * from './useAppSpin'; +export * from './useRouterBasename'; diff --git a/packages/core/client/src/application/hooks/useRouterBasename.ts b/packages/core/client/src/application/hooks/useRouterBasename.ts new file mode 100644 index 0000000000..9460f72b94 --- /dev/null +++ b/packages/core/client/src/application/hooks/useRouterBasename.ts @@ -0,0 +1,19 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { useHref } from 'react-router-dom'; + +/** + * see: https://stackoverflow.com/questions/50449423/accessing-basename-of-browserouter + * @returns {string} basename + */ +export const useRouterBasename = () => { + const basenameOfCurrentRouter = useHref('/'); + return basenameOfCurrentRouter; +}; diff --git a/packages/core/client/src/block-provider/hooks/index.ts b/packages/core/client/src/block-provider/hooks/index.ts index dde16aa802..e66d10fcb0 100644 --- a/packages/core/client/src/block-provider/hooks/index.ts +++ b/packages/core/client/src/block-provider/hooks/index.ts @@ -20,7 +20,7 @@ import omit from 'lodash/omit'; import qs from 'qs'; import { ChangeEvent, useCallback, useContext, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { NavigateFunction, useHref } from 'react-router-dom'; +import { NavigateFunction } from 'react-router-dom'; import { useReactToPrint } from 'react-to-print'; import { AssociationFilter, @@ -28,6 +28,7 @@ import { useCollectionRecord, useDataSourceHeaders, useFormActiveFields, + useRouterBasename, useTableBlockContext, } from '../..'; import { useAPIClient, useRequest } from '../../api-client'; @@ -1594,9 +1595,7 @@ export function useLinkActionProps(componentProps?: any) { const searchParams = componentPropsValue?.['params'] || []; const openInNewWindow = fieldSchema?.['x-component-props']?.['openInNewWindow']; const { parseURLAndParams } = useParseURLAndParams(); - - // see: https://stackoverflow.com/questions/50449423/accessing-basename-of-browserouter - const basenameOfCurrentRouter = useHref('/'); + const basenameOfCurrentRouter = useRouterBasename(); return { type: 'default', diff --git a/packages/core/client/src/collection-manager/collectionPlugin.ts b/packages/core/client/src/collection-manager/collectionPlugin.ts index 8d71266aaa..270393cf9d 100644 --- a/packages/core/client/src/collection-manager/collectionPlugin.ts +++ b/packages/core/client/src/collection-manager/collectionPlugin.ts @@ -52,6 +52,7 @@ import { UUIDFieldInterface, NanoidFieldInterface, UnixTimestampFieldInterface, + DateFieldInterface, } from './interfaces'; import { GeneralCollectionTemplate, @@ -173,6 +174,7 @@ export class CollectionPlugin extends Plugin { UUIDFieldInterface, NanoidFieldInterface, UnixTimestampFieldInterface, + DateFieldInterface, ]); } diff --git a/packages/core/client/src/collection-manager/interfaces/components/index.tsx b/packages/core/client/src/collection-manager/interfaces/components/index.tsx index ccb5915a60..2fbd571127 100644 --- a/packages/core/client/src/collection-manager/interfaces/components/index.tsx +++ b/packages/core/client/src/collection-manager/interfaces/components/index.tsx @@ -7,8 +7,8 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { Switch } from 'antd'; -import React from 'react'; +import { Switch, Radio, Input } from 'antd'; +import React, { useEffect, useState } from 'react'; export const TargetKey = () => { return
Target key
; @@ -50,3 +50,37 @@ export const ForeignKey2 = () => { ); }; + +// 自定义 Radio 组件 +export const CustomRadio = (props) => { + const { options, onChange } = props; + const [value, setValue] = useState(props.value); + useEffect(() => { + setValue(['server', 'client'].includes(props.value) ? props.value : 'custom'); + }, [props.value]); + const handleRadioChange = (e) => { + setValue(e.target.value); + if (e.target.value !== 'custom') { + onChange?.(e.target.value); + } + }; + + return ( + + {options.map((option) => ( + + {option.label} + {option.value === 'custom' && value === 'custom' ? ( + { + onChange?.(e.target.value); + }} + value={['server', 'client', 'custom'].includes(props.value) ? null : props.value} + /> + ) : null} + + ))} + + ); +}; diff --git a/packages/core/client/src/collection-manager/interfaces/date.ts b/packages/core/client/src/collection-manager/interfaces/date.ts new file mode 100644 index 0000000000..59d23be7fa --- /dev/null +++ b/packages/core/client/src/collection-manager/interfaces/date.ts @@ -0,0 +1,60 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { CollectionFieldInterface } from '../../data-source/collection-field-interface/CollectionFieldInterface'; +import { dateTimeProps, defaultProps, operators } from './properties'; + +export class DateFieldInterface extends CollectionFieldInterface { + name = 'date'; + type = 'object'; + group = 'datetime'; + order = 1; + title = '{{t("Date")}}'; + sortable = true; + default = { + type: 'dateOnly', + uiSchema: { + type: 'string', + 'x-component': 'DatePicker', + 'x-component-props': { + dateOnly: true, + }, + }, + }; + availableTypes = ['date', 'dateOnly', 'string']; + hasDefaultValue = true; + properties = { + ...defaultProps, + 'uiSchema.x-component-props.dateFormat': { + type: 'string', + title: '{{t("Date format")}}', + 'x-component': 'Radio.Group', + 'x-decorator': 'FormItem', + default: 'YYYY-MM-DD', + enum: [ + { + label: '{{t("Year/Month/Day")}}', + value: 'YYYY/MM/DD', + }, + { + label: '{{t("Year-Month-Day")}}', + value: 'YYYY-MM-DD', + }, + { + label: '{{t("Day/Month/Year")}}', + value: 'DD/MM/YYYY', + }, + ], + }, + }; + filterable = { + operators: operators.datetime, + }; + titleUsable = true; +} diff --git a/packages/core/client/src/collection-manager/interfaces/datetime.ts b/packages/core/client/src/collection-manager/interfaces/datetime.ts index 615d11e9ea..3492a87b6a 100644 --- a/packages/core/client/src/collection-manager/interfaces/datetime.ts +++ b/packages/core/client/src/collection-manager/interfaces/datetime.ts @@ -19,6 +19,9 @@ export class DatetimeFieldInterface extends CollectionFieldInterface { sortable = true; default = { type: 'date', + defaultToCurrentTime: false, + onUpdateToCurrentTime: false, + timezone: 'server', uiSchema: { type: 'string', 'x-component': 'DatePicker', diff --git a/packages/core/client/src/collection-manager/interfaces/index.ts b/packages/core/client/src/collection-manager/interfaces/index.ts index 6778d83413..663f55ac2d 100644 --- a/packages/core/client/src/collection-manager/interfaces/index.ts +++ b/packages/core/client/src/collection-manager/interfaces/index.ts @@ -46,3 +46,4 @@ export * from './sort'; export * from './uuid'; export * from './nanoid'; export * from './unixTimestamp'; +export * from './date'; 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 1ef36e4b61..df63fd215b 100644 --- a/packages/core/client/src/collection-manager/interfaces/properties/index.ts +++ b/packages/core/client/src/collection-manager/interfaces/properties/index.ts @@ -10,6 +10,7 @@ import { Field } from '@formily/core'; import { ISchema } from '@formily/react'; import { uid } from '@formily/shared'; +import { CustomRadio } from '../components'; export * as operators from './operators'; export const type: ISchema = { @@ -225,6 +226,29 @@ export const reverseFieldProperties: Record = { }; export const dateTimeProps: { [key: string]: ISchema } = { + timezone: { + type: 'string', + title: '{{t("Timezone")}}', + 'x-component': CustomRadio, + 'x-decorator': 'FormItem', + default: 'server', + 'x-component-props': { + options: [ + { + label: '{{t("None")}}', + value: 'server', + }, + { + label: '{{t("Client\'s time zone")}}', + value: 'client', + }, + { + label: '{{t("Custom")}}', + value: 'custom', + }, + ], + }, + }, 'uiSchema.x-component-props.dateFormat': { type: 'string', title: '{{t("Date format")}}', @@ -253,10 +277,10 @@ export const dateTimeProps: { [key: string]: ISchema } = { 'x-content': '{{t("Show time")}}', 'x-reactions': [ `{{(field) => { - field.query('..[].timeFormat').take(f => { - f.display = field.value ? 'visible' : 'none'; - }); - }}}`, + field.query('..[].timeFormat').take(f => { + f.display = field.value ? 'visible' : 'none'; + }); + }}}`, ], }, 'uiSchema.x-component-props.timeFormat': { @@ -276,6 +300,18 @@ export const dateTimeProps: { [key: string]: ISchema } = { }, ], }, + defaultToCurrentTime: { + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-content': '{{t("Default value to current time")}}', + }, + onUpdateToCurrentTime: { + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-content': '{{t("Automatically update timestamp on update")}}', + }, }; export const dataSource: ISchema = { diff --git a/packages/core/client/src/collection-manager/interfaces/unixTimestamp.tsx b/packages/core/client/src/collection-manager/interfaces/unixTimestamp.tsx index 47b3ebc2cf..8e9db2b6d1 100644 --- a/packages/core/client/src/collection-manager/interfaces/unixTimestamp.tsx +++ b/packages/core/client/src/collection-manager/interfaces/unixTimestamp.tsx @@ -8,8 +8,8 @@ */ import { CollectionFieldInterface } from '../../data-source/collection-field-interface/CollectionFieldInterface'; -import { dateTimeProps, defaultProps, operators } from './properties'; - +import { defaultProps, operators } from './properties'; +import { CustomRadio } from './components'; export class UnixTimestampFieldInterface extends CollectionFieldInterface { name = 'unixTimestamp'; type = 'object'; @@ -18,21 +18,47 @@ export class UnixTimestampFieldInterface extends CollectionFieldInterface { title = '{{t("Unix Timestamp")}}'; sortable = true; default = { - type: 'bigInt', + type: 'unixTimestamp', + accuracy: 'second', + timezone: 'server', + defaultToCurrentTime: false, + onUpdateToCurrentTime: false, uiSchema: { type: 'number', 'x-component': 'UnixTimestamp', 'x-component-props': { - accuracy: 'second', showTime: true, }, }, }; - availableTypes = ['integer', 'bigInt']; - hasDefaultValue = true; + availableTypes = ['integer', 'bigInt', 'unixTimestamp']; + hasDefaultValue = false; properties = { ...defaultProps, - 'uiSchema.x-component-props.accuracy': { + timezone: { + type: 'string', + title: '{{t("Timezone")}}', + 'x-component': CustomRadio, + 'x-decorator': 'FormItem', + default: 'server', + 'x-component-props': { + options: [ + { + label: '{{t("None")}}', + value: 'server', + }, + { + label: '{{t("Client\'s time zone")}}', + value: 'client', + }, + { + label: 'custom', + value: 'custom', + }, + ], + }, + }, + accuracy: { type: 'string', title: '{{t("Accuracy")}}', 'x-component': 'Radio.Group', @@ -43,6 +69,20 @@ export class UnixTimestampFieldInterface extends CollectionFieldInterface { { value: 'second', label: '{{t("Second")}}' }, ], }, + defaultToCurrentTime: { + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-content': '{{t("Default value to current time")}}', + default: true, + }, + onUpdateToCurrentTime: { + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + 'x-content': '{{t("Automatically update timestamp on update")}}', + default: true, + }, }; filterable = { operators: operators.number, diff --git a/packages/core/client/src/locale/zh-CN.json b/packages/core/client/src/locale/zh-CN.json index 9535a2dbf2..53b5c0fcb6 100644 --- a/packages/core/client/src/locale/zh-CN.json +++ b/packages/core/client/src/locale/zh-CN.json @@ -283,7 +283,7 @@ "Checkbox group": "复选框", "China region": "中国行政区", "Date & Time": "日期 & 时间", - "Datetime": "日期", + "Datetime": "日期时间", "Relation": "关系类型", "Link to": "关联", "Link to description": "用于快速创建表关系,可兼容大多数普通场景。适合非开发人员使用。作为字段存在时,它是一个下拉选择用于选择目标数据表的数据。创建后,将同时在目标数据表中生成当前数据表的关联字段。", @@ -967,5 +967,8 @@ "Clear default value": "清除默认值", "Open in new window": "新窗口打开", "Sorry, the page you visited does not exist.": "抱歉,你访问的页面不存在。", - "Set Template Engine": "设置模板引擎" + "Template engine": "模板引擎", + "Default value to current time":"设置字段默认值为当前时间", + "Automatically update timestamp on update":"当记录更新时自动设置字段值为当前时间", + "Client's time zone":"客户端时区" } diff --git a/packages/core/client/src/modules/blocks/data-blocks/table/hooks/useTableBlockProps.tsx b/packages/core/client/src/modules/blocks/data-blocks/table/hooks/useTableBlockProps.tsx index a27e78cd93..bd5dbad023 100644 --- a/packages/core/client/src/modules/blocks/data-blocks/table/hooks/useTableBlockProps.tsx +++ b/packages/core/client/src/modules/blocks/data-blocks/table/hooks/useTableBlockProps.tsx @@ -78,13 +78,11 @@ export const useTableBlockProps = () => { ), onChange: useCallback( ({ current, pageSize }, filters, sorter) => { - const sort = !ctx.dragSort - ? sorter.order - ? sorter.order === `ascend` - ? [sorter.field] - : [`-${sorter.field}`] - : globalSort || ctx.dragSortBy - : ctx.dragSortBy; + const sort = sorter.order + ? sorter.order === `ascend` + ? [sorter.field] + : [`-${sorter.field}`] + : globalSort || ctx.dragSortBy; const currentPageSize = pageSize || fieldSchema.parent?.['x-decorator-props']?.['params']?.pageSize; const args = { ...params?.[0], page: current || 1, pageSize: currentPageSize }; if (sort) { @@ -92,7 +90,7 @@ export const useTableBlockProps = () => { } ctx.service.run(args); }, - [globalSort, params], + [globalSort, params, ctx.dragSort], ), onClickRow: useCallback( (record, setSelectedRow, selectedRow) => { diff --git a/packages/core/client/src/modules/blocks/other-blocks/markdown/markdownBlockSettings.ts b/packages/core/client/src/modules/blocks/other-blocks/markdown/markdownBlockSettings.ts index dd49f15815..aecb5cd040 100644 --- a/packages/core/client/src/modules/blocks/other-blocks/markdown/markdownBlockSettings.ts +++ b/packages/core/client/src/modules/blocks/other-blocks/markdown/markdownBlockSettings.ts @@ -30,14 +30,14 @@ export const markdownBlockSettings = new SchemaSettings({ }; }, }, - { - name: 'setBlockTemplate', - Component: SchemaSettingsRenderEngine, - }, { name: 'setTheBlockHeight', Component: SchemaSettingsBlockHeightItem, }, + { + name: 'setBlockTemplate', + Component: SchemaSettingsRenderEngine, + }, { name: 'divider', type: 'divider', diff --git a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx index 990723f68a..7648c6da63 100644 --- a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx @@ -154,6 +154,7 @@ export const SubTable: any = observer( onClick() { selectedRows.map((v) => field.value.push(v)); field.onInput(field.value); + field.initialValue = field.value; setSelectedRows([]); setVisible(false); }, diff --git a/packages/core/client/src/schema-component/antd/date-picker/util.ts b/packages/core/client/src/schema-component/antd/date-picker/util.ts index 59026b3efb..9c80b91a28 100644 --- a/packages/core/client/src/schema-component/antd/date-picker/util.ts +++ b/packages/core/client/src/schema-component/antd/date-picker/util.ts @@ -78,17 +78,20 @@ export const mapDatePicker = function () { return (props: any) => { const format = getDefaultFormat(props) as any; const onChange = props.onChange; - return { ...props, format: format, value: str2moment(props.value, props), - onChange: (value: Dayjs | null) => { + onChange: (value: Dayjs | null, dateString) => { if (onChange) { if (!props.showTime && value) { value = value.startOf('day'); } - onChange(moment2str(value, props)); + if (props.dateOnly) { + onChange(dateString); + } else { + onChange(moment2str(value, props)); + } } }, }; diff --git a/packages/core/client/src/schema-component/antd/page/Page.tsx b/packages/core/client/src/schema-component/antd/page/Page.tsx index 28c93b84ee..0146258ff8 100644 --- a/packages/core/client/src/schema-component/antd/page/Page.tsx +++ b/packages/core/client/src/schema-component/antd/page/Page.tsx @@ -17,12 +17,13 @@ import classNames from 'classnames'; import React, { memo, useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; import { useTranslation } from 'react-i18next'; -import { Outlet, useOutletContext, useParams, useSearchParams } from 'react-router-dom'; +import { NavigateFunction, Outlet, useOutletContext, useParams, useSearchParams } from 'react-router-dom'; import { FormDialog } from '..'; import { useStyles as useAClStyles } from '../../../acl/style'; import { useRequest } from '../../../api-client'; import { useNavigateNoUpdate } from '../../../application/CustomRouterContextProvider'; import { useAppSpin } from '../../../application/hooks/useAppSpin'; +import { useRouterBasename } from '../../../application/hooks/useRouterBasename'; import { useDocumentTitle } from '../../../document-title'; import { useGlobalTheme } from '../../../global-theme'; import { Icon } from '../../../icon'; @@ -47,6 +48,7 @@ export const Page = (props) => { const { theme } = useGlobalTheme(); const { getAriaLabel } = useGetAriaLabelOfSchemaInitializer(); const { tabUid, name: pageUid } = useParams(); + const basenameOfCurrentRouter = useRouterBasename(); // react18 tab 动画会卡顿,所以第一个 tab 时,动画禁用,后面的 tab 才启用 const [hasMounted, setHasMounted] = useState(false); @@ -112,7 +114,7 @@ export const Page = (props) => { }} onChange={(activeKey) => { setLoading(true); - navigate(`/admin/${pageUid}/tabs/${activeKey}`, { replace: true }); + navigateToTab({ activeKey, navigate, basename: basenameOfCurrentRouter }); setTimeout(() => { setLoading(false); }, 50); @@ -319,3 +321,41 @@ const PageContent = memo( }, ); PageContent.displayName = 'PageContent'; + +export function navigateToTab({ + activeKey, + navigate, + basename, + pathname = window.location.pathname, +}: { + activeKey: string; + navigate: NavigateFunction; + /** the router basename */ + basename: string; + pathname?: string; +}) { + pathname = pathname.replace(basename, ''); + + if (pathname.endsWith('/')) { + pathname = pathname.slice(0, -1); + } + + if (!pathname.startsWith('/')) { + pathname = `/${pathname}`; + } + + if (isTabPage(pathname)) { + navigate(`${pathname.replace(/\/tabs\/[^/]+$/, `/tabs/${activeKey}`)}`, { replace: true }); + } else { + navigate(`${pathname}/tabs/${activeKey}`, { replace: true }); + } +} + +export function isTabPage(pathname: string) { + if (pathname.endsWith('/')) { + pathname = pathname.slice(0, -1); + } + + const list = pathname.split('/'); + return list[list.length - 2] === 'tabs'; +} diff --git a/packages/core/client/src/schema-component/antd/page/PagePopups.tsx b/packages/core/client/src/schema-component/antd/page/PagePopups.tsx index 0f850d0c39..c394dcba89 100644 --- a/packages/core/client/src/schema-component/antd/page/PagePopups.tsx +++ b/packages/core/client/src/schema-component/antd/page/PagePopups.tsx @@ -84,7 +84,8 @@ const PopupParamsProvider: FC> = (props) => { return {props.children}; }; -const PopupTabsPropsProvider: FC<{ params: PopupParams }> = ({ children, params }) => { +const PopupTabsPropsProvider: FC = ({ children }) => { + const { params } = useCurrentPopupContext(); const { changeTab } = usePagePopup(); const onChange = useCallback( (key: string) => { @@ -99,7 +100,7 @@ const PopupTabsPropsProvider: FC<{ params: PopupParams }> = ({ children, params } return ( - + {children} ); @@ -166,7 +167,7 @@ const PagePopupsItemProvider: FC<{ > {/* Pass the service of the block where the button is located down, to refresh the block's data when the popup is closed */} - +
{children}
diff --git a/packages/core/client/src/schema-component/antd/page/__tests__/page.test.tsx b/packages/core/client/src/schema-component/antd/page/__tests__/page.test.tsx index 22a338ebaf..ee7d344dea 100644 --- a/packages/core/client/src/schema-component/antd/page/__tests__/page.test.tsx +++ b/packages/core/client/src/schema-component/antd/page/__tests__/page.test.tsx @@ -7,11 +7,11 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { render, screen, waitFor, renderAppOptions, userEvent } from '@nocobase/test/client'; +import { DocumentTitleProvider, Form, FormItem, Grid, IconPicker, Input } from '@nocobase/client'; +import { render, renderAppOptions, screen, userEvent, waitFor } from '@nocobase/test/client'; import React from 'react'; import App1 from '../demos/demo1'; -import { Page } from '../Page'; -import { DocumentTitleProvider, Form, FormItem, Grid, IconPicker, Input } from '@nocobase/client'; +import { isTabPage, navigateToTab, Page } from '../Page'; describe('Page', () => { it('should render correctly', async () => { @@ -159,3 +159,196 @@ describe('Page', () => { }); }); }); + +describe('utils', () => { + it('isTabPage', () => { + expect(isTabPage('/admin')).toBe(false); + expect(isTabPage('/admin/test/tabs/tabId')).toBe(true); + expect(isTabPage('/admin/test/tabs/tabId/')).toBe(true); + }); + + it('navigateToTab with basename "/"', () => { + const navigate1 = vi.fn(); + const navigate2 = vi.fn(); + const navigate3 = vi.fn(); + const navigate4 = vi.fn(); + const navigate5 = vi.fn(); + const navigate6 = vi.fn(); + const navigate7 = vi.fn(); + const navigate8 = vi.fn(); + + navigateToTab({ activeKey: 'tabId', navigate: navigate1, pathname: '/admin/test', basename: '/' }); + expect(navigate1).toBeCalledWith('/admin/test/tabs/tabId', { replace: true }); + + navigateToTab({ activeKey: 'tabId', navigate: navigate2, pathname: '/admin/test/', basename: '/' }); + expect(navigate2).toBeCalledWith('/admin/test/tabs/tabId', { replace: true }); + + navigateToTab({ activeKey: 'tabId', navigate: navigate3, pathname: '/admin/test/tabs/oldTabId', basename: '/' }); + expect(navigate3).toBeCalledWith('/admin/test/tabs/tabId', { replace: true }); + + navigateToTab({ activeKey: 'tabId', navigate: navigate4, pathname: '/admin/test/tabs/oldTabId/', basename: '/' }); + expect(navigate4).toBeCalledWith('/admin/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate5, + pathname: '/admin/test/tabs/tab1/pages/pageId/tabs/tab2', + basename: '/', + }); + expect(navigate5).toBeCalledWith('/admin/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate6, + pathname: '/admin/test/tabs/tab1/pages/pageId/tabs/tab2/', + basename: '/', + }); + expect(navigate6).toBeCalledWith('/admin/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate7, + pathname: '/admin/test/tabs/tab1/pages/pageId', + basename: '/', + }); + expect(navigate7).toBeCalledWith('/admin/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate8, + pathname: '/admin/test/tabs/tab1/pages/pageId/', + basename: '/', + }); + expect(navigate8).toBeCalledWith('/admin/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + }); + + it('navigateToTab with basename "/apps/appId"', () => { + const navigate1 = vi.fn(); + const navigate2 = vi.fn(); + const navigate3 = vi.fn(); + const navigate4 = vi.fn(); + const navigate5 = vi.fn(); + const navigate6 = vi.fn(); + const navigate7 = vi.fn(); + const navigate8 = vi.fn(); + + navigateToTab({ activeKey: 'tabId', navigate: navigate1, pathname: '/apps/appId/test', basename: '/apps/appId' }); + expect(navigate1).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ activeKey: 'tabId', navigate: navigate2, pathname: '/apps/appId/test/', basename: '/apps/appId' }); + expect(navigate2).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate3, + pathname: '/apps/appId/test/tabs/oldTabId', + basename: '/apps/appId', + }); + expect(navigate3).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate4, + pathname: '/apps/appId/test/tabs/oldTabId/', + basename: '/apps/appId', + }); + expect(navigate4).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate5, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/tabs/tab2', + basename: '/apps/appId', + }); + expect(navigate5).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate6, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/tabs/tab2/', + basename: '/apps/appId', + }); + expect(navigate6).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate7, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId', + basename: '/apps/appId', + }); + expect(navigate7).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate8, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/', + basename: '/apps/appId', + }); + expect(navigate8).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + }); + + it('navigateToTab with basename "/apps/appId/"', () => { + const navigate1 = vi.fn(); + const navigate2 = vi.fn(); + const navigate3 = vi.fn(); + const navigate4 = vi.fn(); + const navigate5 = vi.fn(); + const navigate6 = vi.fn(); + const navigate7 = vi.fn(); + const navigate8 = vi.fn(); + + navigateToTab({ activeKey: 'tabId', navigate: navigate1, pathname: '/apps/appId/test', basename: '/apps/appId/' }); + expect(navigate1).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ activeKey: 'tabId', navigate: navigate2, pathname: '/apps/appId/test/', basename: '/apps/appId/' }); + expect(navigate2).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate3, + pathname: '/apps/appId/test/tabs/oldTabId', + basename: '/apps/appId/', + }); + expect(navigate3).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate4, + pathname: '/apps/appId/test/tabs/oldTabId/', + basename: '/apps/appId/', + }); + expect(navigate4).toBeCalledWith('/test/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate5, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/tabs/tab2', + basename: '/apps/appId/', + }); + expect(navigate5).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate6, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/tabs/tab2/', + basename: '/apps/appId/', + }); + expect(navigate6).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate7, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId', + basename: '/apps/appId/', + }); + expect(navigate7).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + + navigateToTab({ + activeKey: 'tabId', + navigate: navigate8, + pathname: '/apps/appId/test/tabs/tab1/pages/pageId/', + basename: '/apps/appId/', + }); + expect(navigate8).toBeCalledWith('/test/tabs/tab1/pages/pageId/tabs/tabId', { replace: true }); + }); +}); diff --git a/packages/core/client/src/schema-component/antd/unix-timestamp/UnixTimestamp.tsx b/packages/core/client/src/schema-component/antd/unix-timestamp/UnixTimestamp.tsx index 5d19a1e118..e83f9d00bc 100644 --- a/packages/core/client/src/schema-component/antd/unix-timestamp/UnixTimestamp.tsx +++ b/packages/core/client/src/schema-component/antd/unix-timestamp/UnixTimestamp.tsx @@ -8,57 +8,32 @@ */ import { connect, mapReadPretty } from '@formily/react'; -import React, { useMemo } from 'react'; +import React from 'react'; import { DatePicker } from '../date-picker'; -import dayjs from 'dayjs'; - -const toValue = (value: any, accuracy) => { - if (value) { - return timestampToDate(value, accuracy); - } - return null; -}; - -function timestampToDate(timestamp, accuracy = 'millisecond') { - if (accuracy === 'second') { - timestamp *= 1000; // 如果精确度是秒级,则将时间戳乘以1000转换为毫秒级 - } - return dayjs(timestamp); -} - -function getTimestamp(date, accuracy = 'millisecond') { - if (accuracy === 'second') { - return dayjs(date).unix(); - } else { - return dayjs(date).valueOf(); // 默认返回毫秒级时间戳 - } -} interface UnixTimestampProps { - value?: number; - accuracy?: 'millisecond' | 'second'; + value?: any; onChange?: (value: number) => void; } export const UnixTimestamp = connect( (props: UnixTimestampProps) => { - const { value, onChange, accuracy = 'second' } = props; - const v = useMemo(() => toValue(value, accuracy), [value, accuracy]); + const { value, onChange } = props; + return ( { if (onChange) { - onChange(getTimestamp(v, accuracy)); + onChange(v); } }} /> ); }, mapReadPretty((props) => { - const { value, accuracy = 'second' } = props; - const v = useMemo(() => toValue(value, accuracy), [value, accuracy]); - return ; + const { value } = props; + return ; }), ); diff --git a/packages/core/client/src/schema-component/antd/unix-timestamp/__tests__/UnixTimestamp.test.tsx b/packages/core/client/src/schema-component/antd/unix-timestamp/__tests__/UnixTimestamp.test.tsx index ba82c73147..c9c107f45c 100644 --- a/packages/core/client/src/schema-component/antd/unix-timestamp/__tests__/UnixTimestamp.test.tsx +++ b/packages/core/client/src/schema-component/antd/unix-timestamp/__tests__/UnixTimestamp.test.tsx @@ -13,11 +13,9 @@ import { UnixTimestamp } from '@nocobase/client'; describe('UnixTimestamp', () => { it('renders without errors', async () => { const { container } = await renderAppOptions({ - Component: UnixTimestamp, - props: { - accuracy: 'millisecond', - }, - value: 0, + Component: UnixTimestamp as any, + props: {}, + value: null, }); expect(container).toMatchInlineSnapshot(`
@@ -69,78 +67,10 @@ describe('UnixTimestamp', () => { `); }); - it('millisecond', async () => { - await renderAppOptions({ - Component: UnixTimestamp, - value: 1712819630000, - props: { - accuracy: 'millisecond', - }, - }); - await waitFor(() => { - expect(screen.getByRole('textbox')).toHaveValue('2024-04-11'); - }); - }); - - it('second', async () => { - await renderAppOptions({ - Component: UnixTimestamp, - value: 1712819630, - props: { - accuracy: 'second', - }, - }); - - await waitFor(() => { - expect(screen.getByRole('textbox')).toHaveValue('2024-04-11'); - }); - }); - - it('string', async () => { - await renderAppOptions({ - Component: UnixTimestamp, - value: '2024-04-11', - props: { - accuracy: 'millisecond', - }, - }); - - await waitFor(() => { - expect(screen.getByRole('textbox')).toHaveValue('2024-04-11'); - }); - }); - - it('change', async () => { - const onChange = vitest.fn(); - await renderAppOptions({ - Component: UnixTimestamp, - value: '2024-04-11', - onChange, - props: { - accuracy: 'millisecond', - }, - }); - await userEvent.click(screen.getByRole('textbox')); - - await waitFor(() => { - expect(screen.queryByRole('table')).toBeInTheDocument(); - }); - - await userEvent.click(document.querySelector('td[title="2024-04-12"]')); - - await waitFor(() => { - expect(screen.getByRole('textbox')).toHaveValue('2024-04-12'); - }); - expect(onChange).toBeCalledWith(1712880000000); - }); - it('read pretty', async () => { const { container } = await renderReadPrettyApp({ - Component: UnixTimestamp, + Component: UnixTimestamp as any, value: '2024-04-11', - props: { - accuracy: 'millisecond', - }, }); expect(screen.getByText('2024-04-11')).toBeInTheDocument(); diff --git a/packages/core/client/src/schema-settings/SchemaSettingsRenderEngine.tsx b/packages/core/client/src/schema-settings/SchemaSettingsRenderEngine.tsx index b0611841bd..602f6c54ae 100644 --- a/packages/core/client/src/schema-settings/SchemaSettingsRenderEngine.tsx +++ b/packages/core/client/src/schema-settings/SchemaSettingsRenderEngine.tsx @@ -34,7 +34,7 @@ export function SchemaSettingsRenderEngine() { return ( { diff --git a/packages/core/database/src/__tests__/fields/date-only.test.ts b/packages/core/database/src/__tests__/fields/date-only.test.ts new file mode 100644 index 0000000000..1b6d9a60f7 --- /dev/null +++ b/packages/core/database/src/__tests__/fields/date-only.test.ts @@ -0,0 +1,42 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { Database, mockDatabase } from '@nocobase/database'; + +describe('date only', () => { + let db: Database; + + beforeEach(async () => { + db = mockDatabase({ + timezone: '+08:00', + }); + await db.clean({ drop: true }); + }); + + afterEach(async () => { + await db.close(); + }); + + it('should set date field with dateOnly', async () => { + db.collection({ + name: 'tests', + fields: [{ name: 'date1', type: 'dateOnly' }], + }); + + await db.sync(); + + const item = await db.getRepository('tests').create({ + values: { + date1: '2023-03-24', + }, + }); + + expect(item.get('date1')).toBe('2023-03-24'); + }); +}); diff --git a/packages/core/database/src/__tests__/fields/date.test.ts b/packages/core/database/src/__tests__/fields/date.test.ts index e1a2ff189e..4c6b373721 100644 --- a/packages/core/database/src/__tests__/fields/date.test.ts +++ b/packages/core/database/src/__tests__/fields/date.test.ts @@ -11,6 +11,69 @@ import { mockDatabase } from '../'; import { Database } from '../../database'; import { Repository } from '../../repository'; +describe('timezone', () => { + let db: Database; + + beforeEach(async () => { + db = mockDatabase({ + timezone: '+08:00', + }); + await db.clean({ drop: true }); + }); + + afterEach(async () => { + await db.close(); + }); + + describe('timezone', () => { + test('custom', async () => { + db.collection({ + name: 'tests', + timestamps: false, + fields: [{ name: 'date1', type: 'date', timezone: '+06:00' }], + }); + + await db.sync(); + const repository = db.getRepository('tests'); + const instance = await repository.create({ values: { date1: '2023-03-24 00:00:00' } }); + const date1 = instance.get('date1'); + expect(date1.toISOString()).toEqual('2023-03-23T18:00:00.000Z'); + }); + + test('client', async () => { + db.collection({ + name: 'tests', + timestamps: false, + fields: [{ name: 'date1', type: 'date', timezone: 'client' }], + }); + + await db.sync(); + const repository = db.getRepository('tests'); + const instance = await repository.create({ + values: { date1: '2023-03-24 01:00:00' }, + context: { + timezone: '+01:00', + }, + }); + const date1 = instance.get('date1'); + expect(date1.toISOString()).toEqual('2023-03-24T00:00:00.000Z'); + }); + + test('server', async () => { + db.collection({ + name: 'tests', + fields: [{ name: 'date1', type: 'date', timezone: 'server' }], + }); + + await db.sync(); + const repository = db.getRepository('tests'); + const instance = await repository.create({ values: { date1: '2023-03-24 08:00:00' } }); + const date1 = instance.get('date1'); + expect(date1.toISOString()).toEqual('2023-03-24T00:00:00.000Z'); + }); + }); +}); + describe('date-field', () => { let db: Database; let repository: Repository; @@ -30,16 +93,80 @@ describe('date-field', () => { await db.close(); }); - const createExpectToBe = async (key, actual, expected) => { - const instance = await repository.create({ + it('should set default to current time', async () => { + const c1 = db.collection({ + name: 'test11', + fields: [ + { + name: 'date1', + type: 'date', + defaultToCurrentTime: true, + }, + ], + }); + + await db.sync(); + + const instance = await c1.repository.create({}); + const date1 = instance.get('date1'); + expect(date1).toBeDefined(); + }); + + it('should set to current time when update', async () => { + const c1 = db.collection({ + name: 'test11', + fields: [ + { + name: 'date1', + type: 'date', + onUpdateToCurrentTime: true, + }, + { + name: 'title', + type: 'string', + }, + ], + }); + + await db.sync(); + + const instance = await c1.repository.create({ values: { - [key]: actual, + title: 'test', }, }); - return expect(instance.get(key).toISOString()).toEqual(expected); - }; + + const date1Val = instance.get('date1'); + expect(date1Val).toBeDefined(); + + console.log('update'); + await c1.repository.update({ + values: { + title: 'test2', + }, + filter: { + id: instance.get('id'), + }, + }); + + await instance.reload(); + + const date1Val2 = instance.get('date1'); + expect(date1Val2).toBeDefined(); + + expect(date1Val2.getTime()).toBeGreaterThan(date1Val.getTime()); + }); test('create', async () => { + const createExpectToBe = async (key, actual, expected) => { + const instance = await repository.create({ + values: { + [key]: actual, + }, + }); + return expect(instance.get(key).toISOString()).toEqual(expected); + }; + // sqlite 时区不能自定义,只有 +00:00,postgres 和 mysql 可以自定义 DB_TIMEZONE await createExpectToBe('date1', '2023-03-24', '2023-03-24T00:00:00.000Z'); await createExpectToBe('date1', '2023-03-24T16:00:00.000Z', '2023-03-24T16:00:00.000Z'); diff --git a/packages/core/database/src/__tests__/fields/unix-timestamp-field.tests.ts b/packages/core/database/src/__tests__/fields/unix-timestamp-field.tests.ts new file mode 100644 index 0000000000..d590653811 --- /dev/null +++ b/packages/core/database/src/__tests__/fields/unix-timestamp-field.tests.ts @@ -0,0 +1,86 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { Database, mockDatabase } from '@nocobase/database'; +import moment from 'moment'; + +describe('unix timestamp field', () => { + let db: Database; + + beforeEach(async () => { + db = mockDatabase(); + await db.clean({ drop: true }); + }); + + afterEach(async () => { + await db.close(); + }); + + it('should set default to current time', async () => { + const c1 = db.collection({ + name: 'test11', + fields: [ + { + name: 'date1', + type: 'unixTimestamp', + defaultToCurrentTime: true, + }, + ], + }); + + await db.sync(); + + const instance = await c1.repository.create({}); + const date1 = instance.get('date1'); + expect(date1).toBeDefined(); + + console.log(instance.toJSON()); + }); + + it('should set date value', async () => { + const c1 = db.collection({ + name: 'test12', + fields: [ + { + name: 'date1', + type: 'unixTimestamp', + }, + ], + }); + + await db.sync(); + + await c1.repository.create({ + values: { + date1: '2021-01-01T00:00:00Z', + }, + }); + + const item = await c1.repository.findOne(); + const val = item.get('date1'); + const date = moment(val).utc().format('YYYY-MM-DD HH:mm:ss'); + expect(date).toBe('2021-01-01 00:00:00'); + }); + + describe('timezone', () => { + test('custom', async () => { + db.collection({ + name: 'tests', + timestamps: false, + fields: [{ name: 'date1', type: 'unixTimestamp', timezone: '+06:00' }], + }); + + await db.sync(); + const repository = db.getRepository('tests'); + const instance = await repository.create({ values: { date1: '2023-03-24 00:00:00' } }); + const date1 = instance.get('date1'); + expect(date1.toISOString()).toEqual('2023-03-23T18:00:00.000Z'); + }); + }); +}); diff --git a/packages/core/database/src/database.ts b/packages/core/database/src/database.ts index a3b813b96b..993f1be825 100644 --- a/packages/core/database/src/database.ts +++ b/packages/core/database/src/database.ts @@ -34,7 +34,6 @@ import { import { SequelizeStorage, Umzug } from 'umzug'; import { Collection, CollectionOptions, RepositoryType } from './collection'; import { CollectionFactory } from './collection-factory'; -import { CollectionGroupManager } from './collection-group-manager'; import { ImporterReader, ImportFileExtension } from './collection-importer'; import DatabaseUtils from './database-utils'; import ReferencesMap from './features/references-map'; @@ -42,7 +41,6 @@ import { referentialIntegrityCheck } from './features/referential-integrity-chec import { ArrayFieldRepository } from './field-repository/array-field-repository'; import * as FieldTypes from './fields'; import { Field, FieldContext, RelationField } from './fields'; -import { checkDatabaseVersion } from './helpers'; import { InheritedCollection } from './inherited-collection'; import InheritanceMap from './inherited-map'; import { InterfaceManager } from './interface-manager'; @@ -221,6 +219,9 @@ export class Database extends EventEmitter implements AsyncEmitter { } } + // @ts-ignore + opts.rawTimezone = opts.timezone; + if (options.dialect === 'sqlite') { delete opts.timezone; } else if (!opts.timezone) { @@ -851,7 +852,8 @@ export class Database extends EventEmitter implements AsyncEmitter { * @internal */ async checkVersion() { - return await checkDatabaseVersion(this); + return true; + // return await checkDatabaseVersion(this); } /** diff --git a/packages/core/database/src/fields/date-field.ts b/packages/core/database/src/fields/date-field.ts index f40b27de3e..8cae2221d5 100644 --- a/packages/core/database/src/fields/date-field.ts +++ b/packages/core/database/src/fields/date-field.ts @@ -10,8 +10,14 @@ import { DataTypes } from 'sequelize'; import { BaseColumnFieldOptions, Field } from './field'; +const datetimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; + +function isValidDatetime(str) { + return datetimeRegex.test(str); +} + export class DateField extends Field { - get dataType() { + get dataType(): any { return DataTypes.DATE(3); } @@ -33,6 +39,59 @@ export class DateField extends Field { return props.gmt; } + init() { + const { name, defaultToCurrentTime, onUpdateToCurrentTime, timezone } = this.options; + + this.resolveTimeZone = (context) => { + // @ts-ignore + const serverTimeZone = this.database.options.rawTimezone; + if (timezone === 'server') { + return serverTimeZone; + } + + if (timezone === 'client') { + return context?.timezone || serverTimeZone; + } + + if (timezone) { + return timezone; + } + + return serverTimeZone; + }; + + this.beforeSave = async (instance, options) => { + const value = instance.get(name); + + if (!value && instance.isNewRecord && defaultToCurrentTime) { + instance.set(name, new Date()); + return; + } + + if (onUpdateToCurrentTime) { + instance.set(name, new Date()); + return; + } + }; + } + + setter(value, options) { + if (value === null) { + return value; + } + if (value instanceof Date) { + return value; + } + + if (typeof value === 'string' && isValidDatetime(value)) { + const dateTimezone = this.resolveTimeZone(options?.context); + const dateString = `${value} ${dateTimezone}`; + return new Date(dateString); + } + + return value; + } + bind() { super.bind(); @@ -51,6 +110,13 @@ export class DateField extends Field { // @ts-ignore model.refreshAttributes(); } + + this.on('beforeSave', this.beforeSave); + } + + unbind() { + super.unbind(); + this.off('beforeSave', this.beforeSave); } } diff --git a/packages/core/database/src/fields/date-only-field.ts b/packages/core/database/src/fields/date-only-field.ts new file mode 100644 index 0000000000..5fce9d1b74 --- /dev/null +++ b/packages/core/database/src/fields/date-only-field.ts @@ -0,0 +1,21 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { BaseColumnFieldOptions, Field } from './field'; +import { DataTypes } from 'sequelize'; + +export class DateOnlyField extends Field { + get dataType(): any { + return DataTypes.DATEONLY; + } +} + +export interface DateOnlyFieldOptions extends BaseColumnFieldOptions { + type: 'dateOnly'; +} diff --git a/packages/core/database/src/fields/field.ts b/packages/core/database/src/fields/field.ts index b9f230dd4f..e4b0b70024 100644 --- a/packages/core/database/src/fields/field.ts +++ b/packages/core/database/src/fields/field.ts @@ -56,7 +56,7 @@ export abstract class Field { return this.options.type; } - abstract get dataType(); + abstract get dataType(): any; isRelationField() { return false; @@ -171,11 +171,13 @@ export abstract class Field { Object.assign(opts, { type: this.database.sequelize.normalizeDataType(this.dataType) }); } + Object.assign(opts, this.additionalSequelizeOptions()); + return opts; } - isSqlite() { - return this.database.sequelize.getDialect() === 'sqlite'; + additionalSequelizeOptions() { + return {}; } typeToString() { diff --git a/packages/core/database/src/fields/index.ts b/packages/core/database/src/fields/index.ts index 610b6f1ad1..d698e44cd6 100644 --- a/packages/core/database/src/fields/index.ts +++ b/packages/core/database/src/fields/index.ts @@ -36,6 +36,8 @@ import { UUIDFieldOptions } from './uuid-field'; import { VirtualFieldOptions } from './virtual-field'; import { NanoidFieldOptions } from './nanoid-field'; import { EncryptionField } from './encryption-field'; +import { UnixTimestampFieldOptions } from './unix-timestamp-field'; +import { DateOnlyFieldOptions } from './date-only-field'; export * from './array-field'; export * from './belongs-to-field'; @@ -43,6 +45,7 @@ export * from './belongs-to-many-field'; export * from './boolean-field'; export * from './context-field'; export * from './date-field'; +export * from './date-only-field'; export * from './field'; export * from './has-many-field'; export * from './has-one-field'; @@ -61,6 +64,7 @@ export * from './uuid-field'; export * from './virtual-field'; export * from './nanoid-field'; export * from './encryption-field'; +export * from './unix-timestamp-field'; export type FieldOptions = | BaseFieldOptions @@ -81,6 +85,8 @@ export type FieldOptions = | SetFieldOptions | TimeFieldOptions | DateFieldOptions + | DateOnlyFieldOptions + | UnixTimestampFieldOptions | UidFieldOptions | UUIDFieldOptions | NanoidFieldOptions diff --git a/packages/core/database/src/fields/unix-timestamp-field.ts b/packages/core/database/src/fields/unix-timestamp-field.ts new file mode 100644 index 0000000000..fc634ecde5 --- /dev/null +++ b/packages/core/database/src/fields/unix-timestamp-field.ts @@ -0,0 +1,60 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { DataTypes } from 'sequelize'; +import { DateField } from './date-field'; +import { BaseColumnFieldOptions } from './field'; + +export class UnixTimestampField extends DateField { + get dataType() { + return DataTypes.BIGINT; + } + + additionalSequelizeOptions(): {} { + const { name } = this.options; + let { accuracy } = this.options; + + if (this.options?.uiSchema['x-component-props']?.accuracy) { + accuracy = this.options?.uiSchema['x-component-props']?.accuracy; + } + + if (!accuracy) { + accuracy = 'second'; + } + + let rationalNumber = 1000; + + if (accuracy === 'millisecond') { + rationalNumber = 1; + } + + return { + get() { + const value = this.getDataValue(name); + if (value === null || value === undefined) { + return value; + } + + return new Date(value * rationalNumber); + }, + set(value) { + if (value === null || value === undefined) { + this.setDataValue(name, value); + } else { + // date to unix timestamp + this.setDataValue(name, Math.floor(new Date(value).getTime() / rationalNumber)); + } + }, + }; + } +} + +export interface UnixTimestampFieldOptions extends BaseColumnFieldOptions { + type: 'unix-timestamp'; +} diff --git a/packages/core/database/src/model.ts b/packages/core/database/src/model.ts index a7581dece3..9ec745fcca 100644 --- a/packages/core/database/src/model.ts +++ b/packages/core/database/src/model.ts @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import lodash, { isPlainObject } from 'lodash'; +import lodash from 'lodash'; import { Model as SequelizeModel, ModelStatic } from 'sequelize'; import { Collection } from './collection'; import { Database } from './database'; @@ -30,7 +30,8 @@ interface JSONTransformerOptions { export class Model extends SequelizeModel - implements IModel { + implements IModel +{ public static database: Database; public static collection: Collection; @@ -49,6 +50,21 @@ export class Model(values, { ...options, @@ -645,7 +645,7 @@ export class Repository exten * @internal */ public perfHistograms = new Map(); - protected plugins = new Map(); - protected _appSupervisor: AppSupervisor = AppSupervisor.getInstance(); - protected _started: Date | null = null; - private _authenticated = false; - private _maintaining = false; - private _maintainingCommandStatus: MaintainingCommandStatus; - private _maintainingStatusBeforeCommand: MaintainingCommandStatus | null; - private _actionCommand: Command; - /** * @internal */ public pubSubManager: PubSubManager; public syncMessageManager: SyncMessageManager; public requestLogger: Logger; + protected plugins = new Map(); + protected _appSupervisor: AppSupervisor = AppSupervisor.getInstance(); + private _authenticated = false; + private _maintaining = false; + private _maintainingCommandStatus: MaintainingCommandStatus; + private _maintainingStatusBeforeCommand: MaintainingCommandStatus | null; + private _actionCommand: Command; private sqlLogger: Logger; - protected _logger: SystemLogger; constructor(public options: ApplicationOptions) { super(); @@ -245,6 +242,8 @@ export class Application exten } } + protected _started: Date | null = null; + /** * @experimental */ @@ -252,6 +251,8 @@ export class Application exten return this._started; } + protected _logger: SystemLogger; + get logger() { return this._logger; } diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/BreadcumbTitle.tsx b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/BreadcumbTitle.tsx index 9391208a84..7c32fe3d0b 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/BreadcumbTitle.tsx +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/BreadcumbTitle.tsx @@ -23,7 +23,10 @@ export const BreadcumbTitle = () => { const dm = useDataSourceManager(); const { displayName } = dm.getDataSource(name) || {}; const { dataSource } = useContext(DataSourceContext); - const dataSourceValue = useMemo(() => dataSource || dm.getDataSource(name), [dataSource, name]); + const dataSourceValue = useMemo( + () => (dataSource && dataSource?.name === name ? dataSource : dm.getDataSource(name)), + [dataSource, name], + ); const items = useMemo(() => { const status = dataSourceValue?.status; const option = statusEnum.find((v) => v.value === status); diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/ConfigurationTable.tsx b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/ConfigurationTable.tsx index 832af9de63..03704b08c3 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/ConfigurationTable.tsx +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/ConfigurationTable.tsx @@ -134,7 +134,7 @@ export const ConfigurationTable = () => { method: 'post', }); field.data.loading = false; - setDataSource(data?.data); + setDataSource({ ...data?.data, name }); if (data?.data?.status === 'reloading') { message.warning(t('Data source synchronization in progress')); } else if (data?.data?.status === 'loaded') { diff --git a/packages/plugins/@nocobase/plugin-data-visualization/package.json b/packages/plugins/@nocobase/plugin-data-visualization/package.json index d5e253c3dc..5ff5033484 100644 --- a/packages/plugins/@nocobase/plugin-data-visualization/package.json +++ b/packages/plugins/@nocobase/plugin-data-visualization/package.json @@ -28,8 +28,8 @@ "@nocobase/actions": "1.x", "@nocobase/cache": "1.x", "@nocobase/client": "1.x", - "@nocobase/plugin-data-source-main": "1.x", "@nocobase/database": "1.x", + "@nocobase/plugin-data-source-main": "1.x", "@nocobase/server": "1.x", "@nocobase/test": "1.x", "@nocobase/utils": "1.x" diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/components/Statistic.tsx b/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/components/Statistic.tsx new file mode 100644 index 0000000000..f0ef40929f --- /dev/null +++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/components/Statistic.tsx @@ -0,0 +1,29 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import React from 'react'; +import { Statistic as AntdStatistic } from 'antd'; + +export const Statistic: React.FC = (props: any) => { + const { link, ...options } = props; + return ( +
{ + if (link) { + window.open(link, '__blank'); + } + }} + style={{ + cursor: link ? 'pointer' : 'auto', + }} + > + +
+ ); +}; diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/statistic.ts b/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/statistic.ts index 0e43338944..12eb95e32c 100644 --- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/statistic.ts +++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/chart/antd/statistic.ts @@ -8,16 +8,16 @@ */ import { AntdChart } from './antd'; -import { Statistic as AntdStatistic } from 'antd'; import { lang } from '../../locale'; import { ChartType, RenderProps } from '../chart'; +import { Statistic as C } from './components/Statistic'; export class Statistic extends AntdChart { constructor() { super({ name: 'statistic', title: 'Statistic', - Component: AntdStatistic, + Component: C, config: [ { property: 'field', @@ -33,6 +33,14 @@ export class Statistic extends AntdChart { 'x-component': 'Input', }, }, + { + link: { + title: lang('Link'), + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + }, ], }); } diff --git a/packages/plugins/@nocobase/plugin-kanban/src/client/KanbanBlockInitializer.tsx b/packages/plugins/@nocobase/plugin-kanban/src/client/KanbanBlockInitializer.tsx index d7f959f30e..6cee96190c 100644 --- a/packages/plugins/@nocobase/plugin-kanban/src/client/KanbanBlockInitializer.tsx +++ b/packages/plugins/@nocobase/plugin-kanban/src/client/KanbanBlockInitializer.tsx @@ -130,7 +130,7 @@ export const KanbanBlockInitializer = ({ return ( } onCreateBlockSchema={async (options) => { if (createBlockSchema) { diff --git a/packages/plugins/@nocobase/plugin-multi-app-manager/package.json b/packages/plugins/@nocobase/plugin-multi-app-manager/package.json index bf416e681d..f2ecbec54d 100644 --- a/packages/plugins/@nocobase/plugin-multi-app-manager/package.json +++ b/packages/plugins/@nocobase/plugin-multi-app-manager/package.json @@ -15,7 +15,7 @@ "antd": "5.x", "antd-style": "3.x", "async-mutex": "^0.3.2", - "mysql2": "^2.3.3", + "mysql2": "^3.11.0", "pg": "^8.7.3", "react": "18.x", "react-i18next": "^11.15.1", diff --git a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/client/DynamicCalculation.tsx b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/client/DynamicCalculation.tsx index a5569fd2b7..a5c0dc293f 100644 --- a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/client/DynamicCalculation.tsx +++ b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/client/DynamicCalculation.tsx @@ -43,9 +43,9 @@ function DynamicExpression({ value, onChange }) { } export default class extends Instruction { - title = `{{t("Dynamic Calculation", { ns: "${NAMESPACE}" })}}`; + title = `{{t("Dynamic expression calculation", { ns: "${NAMESPACE}" })}}`; type = 'dynamic-calculation'; - group = 'extended'; + group = 'calculation'; description = `{{t("Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression. The expression is dynamic one from an expression collections.", { ns: "${NAMESPACE}" })}}`; fieldset = { expression: { diff --git a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/zh-CN.json index 8c47d4fa51..a0ad3e030c 100644 --- a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/zh-CN.json @@ -1,6 +1,6 @@ { "Expression": "表达式", - "Dynamic Calculation": "动态表达式计算", + "Dynamic expression calculation": "动态表达式计算", "Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression. The expression is dynamic one from an expression collections.": "基于计算引擎计算表达式并获取值作为结果。可以在表达式中使用上游节点的变量。表达式是从表达式表中动态获取的。", "Select dynamic expression": "选择动态表达式", "Select the dynamic expression queried from the upstream node. You need to query it from an expression collection.": "从上游节点中选择查询出来的动态表达式。你需要从动态表达式类型的数据表中查询。", diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/AddButton.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/AddButton.tsx index 594ebca815..c3a6d6d657 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/client/AddButton.tsx +++ b/packages/plugins/@nocobase/plugin-workflow/src/client/AddButton.tsx @@ -38,6 +38,7 @@ export function AddButton(props: AddButtonProps) { const groups = useMemo(() => { return [ { key: 'control', label: `{{t("Control", { ns: "${NAMESPACE}" })}}` }, + { key: 'calculation', label: `{{t("Calculation", { ns: "${NAMESPACE}" })}}` }, { key: 'collection', label: `{{t("Collection operations", { ns: "${NAMESPACE}" })}}` }, { key: 'manual', label: `{{t("Manual", { ns: "${NAMESPACE}" })}}` }, { key: 'extended', label: `{{t("Extended types", { ns: "${NAMESPACE}" })}}` }, diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/calculation.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/calculation.tsx index e8636033eb..e083a69f43 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/calculation.tsx +++ b/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/calculation.tsx @@ -20,7 +20,7 @@ import { Instruction } from '.'; export default class extends Instruction { title = `{{t("Calculation", { ns: "${NAMESPACE}" })}}`; type = 'calculation'; - group = 'control'; + group = 'calculation'; description = `{{t("Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression.", { ns: "${NAMESPACE}" })}}`; fieldset = { engine: { diff --git a/yarn.lock b/yarn.lock index 62c531d2bb..87b6ee01bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,17 +21,6 @@ query-string "^6.9.0" tslib "^2.4.1" -"@alicloud/captcha20230305@^1.1.3": - version "1.1.3" - resolved "https://registry.npmmirror.com/@alicloud/captcha20230305/-/captcha20230305-1.1.3.tgz#e6f27c16a1dfb9e22689b867bbc1a3d5e91f82e7" - integrity sha512-AUyW7z6xgtC+Khp0BuzerirKLuxCQcovwcsvXPUib5kCxsrKvWuVWrGyTHP9rIpA1pE9ijOlDw8domtgPlY/KQ== - dependencies: - "@alicloud/endpoint-util" "^0.0.1" - "@alicloud/openapi-client" "^0.4.7" - "@alicloud/openapi-util" "^0.3.2" - "@alicloud/tea-typescript" "^1.7.1" - "@alicloud/tea-util" "^1.4.7" - "@alicloud/credentials@^2": version "2.3.0" resolved "https://registry.npmmirror.com/@alicloud/credentials/-/credentials-2.3.0.tgz#941233a07ba74cd2fdaa3f6a5d2a3cca5a10c184" @@ -42,19 +31,6 @@ ini "^1.3.5" kitx "^2.0.0" -"@alicloud/dingtalk@^2.1.23": - version "2.1.27" - resolved "https://registry.npmmirror.com/@alicloud/dingtalk/-/dingtalk-2.1.27.tgz#fc4785c8c8edde737d82620272fa8b6790724b4d" - integrity sha512-xmXFElqgZBbjH2Ct8UJLQut2TwX2OutPhtdIAjIOkOWM5F6w9MOe6xUv+k+7Jnl6O/35g41OVVMmIK8QJrDSMQ== - dependencies: - "@alicloud/endpoint-util" "^0.0.1" - "@alicloud/gateway-dingtalk" "^1.0.2" - "@alicloud/gateway-spi" "^0.0.8" - "@alicloud/openapi-client" "^0.4.9" - "@alicloud/openapi-util" "^0.3.2" - "@alicloud/tea-typescript" "^1.7.1" - "@alicloud/tea-util" "^1.4.8" - "@alicloud/dysmsapi20170525@2.0.17": version "2.0.17" resolved "https://registry.npmmirror.com/@alicloud/dysmsapi20170525/-/dysmsapi20170525-2.0.17.tgz#a350a443f52456b823772345dd57cc5fe2e6c8da" @@ -74,15 +50,6 @@ "@alicloud/tea-typescript" "^1.5.1" kitx "^2.0.0" -"@alicloud/gateway-dingtalk@^1.0.2": - version "1.0.2" - resolved "https://registry.npmmirror.com/@alicloud/gateway-dingtalk/-/gateway-dingtalk-1.0.2.tgz#3970f07324c59935892f5b9abce66e6c2ae29dfc" - integrity sha512-T8ml6kth/nCRthrtHIYnCYv7+q/41SnJaR8c99491azNSPcmMmgxis5ujYIl5irKm0cvoOCCjI9EWUFb2Tx7JA== - dependencies: - "@alicloud/gateway-spi" "^0.0.8" - "@alicloud/tea-typescript" "^1.7.1" - "@alicloud/tea-util" "^1.4.5" - "@alicloud/gateway-spi@^0.0.8": version "0.0.8" resolved "https://registry.npmmirror.com/@alicloud/gateway-spi/-/gateway-spi-0.0.8.tgz#1d251986ed40d8b98690dcac8128fec0c56f0f53" @@ -114,18 +81,6 @@ "@alicloud/tea-util" "^1.4.7" "@alicloud/tea-xml" "0.0.2" -"@alicloud/openapi-client@^0.4.7", "@alicloud/openapi-client@^0.4.8", "@alicloud/openapi-client@^0.4.9": - version "0.4.9" - resolved "https://registry.npmmirror.com/@alicloud/openapi-client/-/openapi-client-0.4.9.tgz#b5627a889e48ad5223bc6fe26e2361bbff1cace0" - integrity sha512-07LzSvIHrhFmk1yOtDQsrtFU8woj29s80TzG7Bv15b7Uo+Q/3EcyoCZU4phig1FM7B0e+2ZWnTnVnKG3FgXvig== - dependencies: - "@alicloud/credentials" "^2" - "@alicloud/gateway-spi" "^0.0.8" - "@alicloud/openapi-util" "^0.3.2" - "@alicloud/tea-typescript" "^1.7.1" - "@alicloud/tea-util" "^1.4.8" - "@alicloud/tea-xml" "0.0.3" - "@alicloud/openapi-util@^0.2.7", "@alicloud/openapi-util@^0.2.9": version "0.2.9" resolved "https://registry.npmmirror.com/@alicloud/openapi-util/-/openapi-util-0.2.9.tgz#2379cd81f993dcab32066a2b892ddcbdd266d51c" @@ -146,7 +101,7 @@ kitx "^2.1.0" sm3 "^1.0.3" -"@alicloud/tea-typescript@^1", "@alicloud/tea-typescript@^1.5.1", "@alicloud/tea-typescript@^1.5.3", "@alicloud/tea-typescript@^1.7.1", "@alicloud/tea-typescript@^1.8.0": +"@alicloud/tea-typescript@^1", "@alicloud/tea-typescript@^1.5.1", "@alicloud/tea-typescript@^1.5.3", "@alicloud/tea-typescript@^1.7.1": version "1.8.0" resolved "https://registry.npmmirror.com/@alicloud/tea-typescript/-/tea-typescript-1.8.0.tgz#aa9b04b6ee53e1b22aa51e224a950ea5bcd966e9" integrity sha512-CWXWaquauJf0sW30mgJRVu9aaXyBth5uMBCUc+5vKTK1zlgf3hIqRUjJZbjlwHwQ5y9anwcu18r48nOZb7l2QQ== @@ -170,14 +125,6 @@ "@alicloud/tea-typescript" "^1.5.1" kitx "^2.0.0" -"@alicloud/tea-util@^1.4.5", "@alicloud/tea-util@^1.4.8": - version "1.4.8" - resolved "https://registry.npmmirror.com/@alicloud/tea-util/-/tea-util-1.4.8.tgz#5948a9d14a64edeb244fcbbb065b1f3c018deca7" - integrity sha512-CPmRUAWhUMewZXLVZ8HTCrqRzzcT6F3o/1sB3IY27oU8RLjFj3FMpZe423pJoC/noNXo4Ja3FTTEFF5k8asQBw== - dependencies: - "@alicloud/tea-typescript" "^1.5.1" - kitx "^2.0.0" - "@alicloud/tea-xml@0.0.2": version "0.0.2" resolved "https://registry.npmmirror.com/@alicloud/tea-xml/-/tea-xml-0.0.2.tgz#7c97a38255d5e4f009c437facd3a2afc0ef17f45" @@ -187,15 +134,6 @@ "@types/xml2js" "^0.4.5" xml2js "^0.4.22" -"@alicloud/tea-xml@0.0.3": - version "0.0.3" - resolved "https://registry.npmmirror.com/@alicloud/tea-xml/-/tea-xml-0.0.3.tgz#14561d4dde59da1d5eaf87e898e26a68cea073c4" - integrity sha512-+/9GliugjrLglsXVrd1D80EqqKgGpyA0eQ6+1ZdUOYCaRguaSwz44trX3PaxPu/HhIPJg9PsGQQ3cSLXWZjbAA== - dependencies: - "@alicloud/tea-typescript" "^1" - "@types/xml2js" "^0.4.5" - xml2js "^0.6.0" - "@amap/amap-jsapi-loader@^1.0.1": version "1.0.1" resolved "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz#9ec4b4d5d2467eac451f6c852e35db69e9f9f0c0" @@ -4216,77 +4154,6 @@ methods "^1.1.2" path-to-regexp "^6.1.0" -"@ldapjs/asn1@2.0.0", "@ldapjs/asn1@^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@ldapjs/asn1/-/asn1-2.0.0.tgz#e25fa38fcf0b4310275d6a5a05fe4603efef5eb4" - integrity sha512-G9+DkEOirNgdPmD0I8nu57ygQJKOOgFEMKknEuQvIHbGLwP3ny1mY+OTUYLCbCaGJP4sox5eYgBJRuSUpnAddA== - -"@ldapjs/asn1@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@ldapjs/asn1/-/asn1-1.2.0.tgz#5e99338fb39ff518c205827bec0fd9a6bf6b42db" - integrity sha512-KX/qQJ2xxzvO2/WOvr1UdQ+8P5dVvuOLk/C9b1bIkXxZss8BaR28njXdPgFCpj5aHaf1t8PmuVnea+N9YG9YMw== - -"@ldapjs/attribute@1.0.0", "@ldapjs/attribute@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@ldapjs/attribute/-/attribute-1.0.0.tgz#d81d626080584c1c80ef300a214458f9f78a8abb" - integrity sha512-ptMl2d/5xJ0q+RgmnqOi3Zgwk/TMJYG7dYMC0Keko+yZU6n+oFM59MjQOUht5pxJeS4FWrImhu/LebX24vJNRQ== - dependencies: - "@ldapjs/asn1" "2.0.0" - "@ldapjs/protocol" "^1.2.1" - process-warning "^2.1.0" - -"@ldapjs/change@^1.0.0": - version "1.0.0" - resolved "https://registry.npmmirror.com/@ldapjs/change/-/change-1.0.0.tgz#34818a3a31cb337d3b90ab853bb7fa90517c2c4f" - integrity sha512-EOQNFH1RIku3M1s0OAJOzGfAohuFYXFY4s73wOhRm4KFGhmQQ7MChOh2YtYu9Kwgvuq1B0xKciXVzHCGkB5V+Q== - dependencies: - "@ldapjs/asn1" "2.0.0" - "@ldapjs/attribute" "1.0.0" - -"@ldapjs/controls@^2.1.0": - version "2.1.0" - resolved "https://registry.npmmirror.com/@ldapjs/controls/-/controls-2.1.0.tgz#28449cd4352f9389fb52fbf699cfa62f3e8762e6" - integrity sha512-2pFdD1yRC9V9hXfAWvCCO2RRWK9OdIEcJIos/9cCVP9O4k72BY1bLDQQ4KpUoJnl4y/JoD4iFgM+YWT3IfITWw== - dependencies: - "@ldapjs/asn1" "^1.2.0" - "@ldapjs/protocol" "^1.2.1" - -"@ldapjs/dn@^1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@ldapjs/dn/-/dn-1.1.0.tgz#3687c86d658d2e10aedc2c65a1ef40155dd7370b" - integrity sha512-R72zH5ZeBj/Fujf/yBu78YzpJjJXG46YHFo5E4W1EqfNpo1UsVPqdLrRMXeKIsJT3x9dJVIfR6OpzgINlKpi0A== - dependencies: - "@ldapjs/asn1" "2.0.0" - process-warning "^2.1.0" - -"@ldapjs/filter@^2.1.1": - version "2.1.1" - resolved "https://registry.npmmirror.com/@ldapjs/filter/-/filter-2.1.1.tgz#34f4774aa17086ed0186afe11c698f13dd586d56" - integrity sha512-TwPK5eEgNdUO1ABPBUQabcZ+h9heDORE4V9WNZqCtYLKc06+6+UAJ3IAbr0L0bYTnkkWC/JEQD2F+zAFsuikNw== - dependencies: - "@ldapjs/asn1" "2.0.0" - "@ldapjs/protocol" "^1.2.1" - process-warning "^2.1.0" - -"@ldapjs/messages@^1.3.0": - version "1.3.0" - resolved "https://registry.npmmirror.com/@ldapjs/messages/-/messages-1.3.0.tgz#dea3c35de6e768e54abd3c7fbaee151d3d01f386" - integrity sha512-K7xZpXJ21bj92jS35wtRbdcNrwmxAtPwy4myeh9duy/eR3xQKvikVycbdWVzkYEAVE5Ce520VXNOwCHjomjCZw== - dependencies: - "@ldapjs/asn1" "^2.0.0" - "@ldapjs/attribute" "^1.0.0" - "@ldapjs/change" "^1.0.0" - "@ldapjs/controls" "^2.1.0" - "@ldapjs/dn" "^1.1.0" - "@ldapjs/filter" "^2.1.1" - "@ldapjs/protocol" "^1.2.1" - process-warning "^2.2.0" - -"@ldapjs/protocol@^1.2.1": - version "1.2.1" - resolved "https://registry.npmmirror.com/@ldapjs/protocol/-/protocol-1.2.1.tgz#d58d371d6958f28095e8de23b35341bcaba55cf3" - integrity sha512-O89xFDLW2gBoZWNXuXpBSM32/KealKCTb3JGtJdtUQc7RjAk8XzrRgyz02cPAwGKwKPxy0ivuC7UP9bmN87egQ== - "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.npmmirror.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -5008,23 +4875,6 @@ dependencies: eslint-scope "5.1.1" -"@node-saml/node-saml@^4.0.2": - version "4.0.5" - resolved "https://registry.npmmirror.com/@node-saml/node-saml/-/node-saml-4.0.5.tgz#039e387095b54639b06df62b1b4a6d8941c6d907" - integrity sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw== - dependencies: - "@types/debug" "^4.1.7" - "@types/passport" "^1.0.11" - "@types/xml-crypto" "^1.4.2" - "@types/xml-encryption" "^1.2.1" - "@types/xml2js" "^0.4.11" - "@xmldom/xmldom" "^0.8.6" - debug "^4.3.4" - xml-crypto "^3.0.1" - xml-encryption "^3.0.2" - xml2js "^0.5.0" - xmlbuilder "^15.1.1" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -5264,15 +5114,6 @@ dependencies: "@opentelemetry/semantic-conventions" "1.19.0" -"@opentelemetry/exporter-prometheus@^0.46.0": - version "0.46.0" - resolved "https://registry.npmmirror.com/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.46.0.tgz#c411a1e8a5266f9f3ddc44a088a538c3c1ee4830" - integrity sha512-AXcoCHG31K2PLGizlJJWcfQqZsGfUZkT7ik6C8VJu7U2Cenk0Xhvd3rO+vVNSSjP1+LHkP4MQtqEXpIZttw5cw== - dependencies: - "@opentelemetry/core" "1.19.0" - "@opentelemetry/resources" "1.19.0" - "@opentelemetry/sdk-metrics" "1.19.0" - "@opentelemetry/instrumentation@^0.46.0": version "0.46.0" resolved "https://registry.npmmirror.com/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz#a8a252306f82e2eace489312798592a14eb9830e" @@ -5306,7 +5147,7 @@ "@opentelemetry/core" "1.19.0" "@opentelemetry/semantic-conventions" "1.19.0" -"@opentelemetry/sdk-metrics@1.19.0", "@opentelemetry/sdk-metrics@^1.19.0": +"@opentelemetry/sdk-metrics@^1.19.0": version "1.19.0" resolved "https://registry.npmmirror.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.19.0.tgz#fe8029af29402563eb8dba75a85fc02006ea92c4" integrity sha512-FiMii40zr0Fmys4F1i8gmuCvbinBnBsDeGBr4FQemOf0iPCLytYQm5AZJ/nn4xSc71IgKBQwTFQRAGJI7JvZ4Q== @@ -6826,7 +6667,7 @@ resolved "https://registry.npmmirror.com/@types/date-arithmetic/-/date-arithmetic-4.1.4.tgz#bdb441f61a916f11af1874a8c2cf787f77ffcb94" integrity sha512-p9eZ2X9B80iKiTW4ukVj8B4K6q9/+xFtQ5MGYA5HWToY9nL4EkhV9+6ftT2VHpVMEZb5Tv00Iel516bVdO+yRw== -"@types/debug@^4.0.0", "@types/debug@^4.1.7", "@types/debug@^4.1.8": +"@types/debug@^4.0.0", "@types/debug@^4.1.8": version "4.1.12" resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -6903,11 +6744,6 @@ resolved "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.13.tgz#e6e77ea9ecf36564980a861e24e62a095988775e" integrity sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ== -"@types/geojson@^7946.0.14": - version "7946.0.14" - resolved "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" - integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== - "@types/glob-stream@*": version "8.0.2" resolved "https://registry.npmmirror.com/@types/glob-stream/-/glob-stream-8.0.2.tgz#56234435cd20f9b7b08c993be9267d661f9b914d" @@ -7090,13 +6926,6 @@ "@types/koa-compose" "*" "@types/node" "*" -"@types/ldapjs@^3.0.6": - version "3.0.6" - resolved "https://registry.npmmirror.com/@types/ldapjs/-/ldapjs-3.0.6.tgz#63aec9036c2acfb0e0b7322df336cda2c37f8bbe" - integrity sha512-E2Tn1ltJDYBsidOT9QG4engaQeQzRQ9aYNxVmjCkD33F7cIeLPgrRDXAYs0O35mK2YDU20c/+ZkNjeAPRGLM0Q== - dependencies: - "@types/node" "*" - "@types/lerna__package@*": version "5.1.3" resolved "https://registry.npmmirror.com/@types/lerna__package/-/lerna__package-5.1.3.tgz#3604531e882229dee8e3f2bd8c819c405e2fcb43" @@ -7220,13 +7049,6 @@ resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^20.11.17": - version "20.14.8" - resolved "https://registry.npmmirror.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" - integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== - dependencies: - undici-types "~5.26.4" - "@types/nodemailer@6.4.4": version "6.4.4" resolved "https://registry.npmmirror.com/@types/nodemailer/-/nodemailer-6.4.4.tgz#c265f7e7a51df587597b3a49a023acaf0c741f4b" @@ -7254,22 +7076,6 @@ resolved "https://registry.npmmirror.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== -"@types/passport@^1.0.11": - version "1.0.16" - resolved "https://registry.npmmirror.com/@types/passport/-/passport-1.0.16.tgz#5a2918b180a16924c4d75c31254c31cdca5ce6cf" - integrity sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A== - dependencies: - "@types/express" "*" - -"@types/pg@^8.10.9": - version "8.11.6" - resolved "https://registry.npmmirror.com/@types/pg/-/pg-8.11.6.tgz#a2d0fb0a14b53951a17df5197401569fb9c0c54b" - integrity sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^4.0.1" - "@types/picomatch@*": version "2.3.3" resolved "https://registry.npmmirror.com/@types/picomatch/-/picomatch-2.3.3.tgz#be60498568c19e989e43fb39aa84be1ed3655e92" @@ -7510,22 +7316,7 @@ dependencies: "@types/node" "*" -"@types/xml-crypto@^1.4.2": - version "1.4.6" - resolved "https://registry.npmmirror.com/@types/xml-crypto/-/xml-crypto-1.4.6.tgz#6d1fd7d41c91554f2aed97c2ba273af0388fa5cf" - integrity sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q== - dependencies: - "@types/node" "*" - xpath "0.0.27" - -"@types/xml-encryption@^1.2.1": - version "1.2.4" - resolved "https://registry.npmmirror.com/@types/xml-encryption/-/xml-encryption-1.2.4.tgz#0eceea58c82a89f62c0a2dc383a6461dfc2fe1ba" - integrity sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q== - dependencies: - "@types/node" "*" - -"@types/xml2js@^0.4.11", "@types/xml2js@^0.4.5": +"@types/xml2js@^0.4.5": version "0.4.14" resolved "https://registry.npmmirror.com/@types/xml2js/-/xml2js-0.4.14.tgz#5d462a2a7330345e2309c6b549a183a376de8f9a" integrity sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ== @@ -8218,11 +8009,6 @@ loupe "^2.3.7" pretty-format "^29.7.0" -"@xmldom/xmldom@^0.8.5", "@xmldom/xmldom@^0.8.6", "@xmldom/xmldom@^0.8.8": - version "0.8.10" - resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - "@zeit/schemas@2.6.0": version "2.6.0" resolved "https://registry.npmmirror.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" @@ -8246,11 +8032,6 @@ abbrev@1: resolved "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abstract-logging@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" - integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== - accepts@^1.3.5, accepts@~1.3.5: version "1.3.8" resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -9287,6 +9068,11 @@ aws-sign2@~0.7.0: resolved "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== +aws-ssl-profiles@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.1.tgz#21ef8ad77d753927f6c01b144c5ef4cc4f150cdc" + integrity sha512-+H+kuK34PfMaI9PNU/NSjBKL5hh/KDM9J72kwYeYEm0A8B1AC4fuCy3qsjnA7lxklgyXsB68yn8Z2xoZEjgwCQ== + aws4@^1.8.0: version "1.12.0" resolved "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" @@ -9461,13 +9247,6 @@ bach@^1.0.0: async-settle "^1.0.0" now-and-later "^2.0.0" -backoff@^2.5.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== - dependencies: - precond "0.2" - bail@^2.0.0: version "2.0.2" resolved "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" @@ -11202,7 +10981,7 @@ copy-props@^2.0.1: each-props "^1.3.2" is-plain-object "^5.0.0" -copy-to-clipboard@3.3.3, copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.3: +copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.3: version "3.3.3" resolved "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== @@ -17053,16 +16832,6 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jmespath@^0.16.0: - version "0.16.0" - resolved "https://registry.npmmirror.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - -jose@^4.15.5: - version "4.15.7" - resolved "https://registry.npmmirror.com/jose/-/jose-4.15.7.tgz#96ad68d786632bd03c9068aa281810dbbe1b60d8" - integrity sha512-L7ioP+JAuZe8v+T5+zVI9Tx8LtU8BL7NxkyDFVMv+Qr3JW0jSoYDedLtodaXwfqMpeCyx4WXFNyu9tJt4WvC1A== - joycon@^3.1.1: version "3.1.1" resolved "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -17252,11 +17021,6 @@ json5@^2.1.2, json5@^2.2.3: resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonata@^2.0.3: - version "2.0.5" - resolved "https://registry.npmmirror.com/jsonata/-/jsonata-2.0.5.tgz#2b3b5098c019b264c4fae061a9cb24d59c7115a2" - integrity sha512-wEse9+QLIIU5IaCgtJCPsFi/H4F3qcikWzF4bAELZiRz08ohfx3Q6CjDRf4ZPF5P/92RI3KIHtb7u3jqPaHXdQ== - jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -17290,11 +17054,6 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonpath-plus@^7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz#7ad94e147b3ed42f7939c315d2b9ce490c5a3899" - integrity sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA== - jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" @@ -17559,26 +17318,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -ldapjs@^3.0.7: - version "3.0.7" - resolved "https://registry.npmmirror.com/ldapjs/-/ldapjs-3.0.7.tgz#c69fe2965bc50a747bce834f8183f1f77c3be75d" - integrity sha512-1ky+WrN+4CFMuoekUOv7Y1037XWdjKpu0xAPwSP+9KdvmV9PG+qOKlssDV6a+U32apwxdD3is/BZcWOYzN30cg== - dependencies: - "@ldapjs/asn1" "^2.0.0" - "@ldapjs/attribute" "^1.0.0" - "@ldapjs/change" "^1.0.0" - "@ldapjs/controls" "^2.1.0" - "@ldapjs/dn" "^1.1.0" - "@ldapjs/filter" "^2.1.1" - "@ldapjs/messages" "^1.3.0" - "@ldapjs/protocol" "^1.2.1" - abstract-logging "^2.0.1" - assert-plus "^1.0.0" - backoff "^2.5.0" - once "^1.4.0" - vasync "^2.2.1" - verror "^1.10.1" - leac@^0.6.0: version "0.6.0" resolved "https://registry.npmmirror.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" @@ -18358,17 +18097,6 @@ mariadb@^2.5.6: moment-timezone "^0.5.34" please-upgrade-node "^3.2.0" -mariadb@^3.3.0: - version "3.3.1" - resolved "https://registry.npmmirror.com/mariadb/-/mariadb-3.3.1.tgz#3ee361242411ba4cf4a80b06e304d1c68c97ad90" - integrity sha512-L8bh4iuZU3J8H7Co7rQ6OY9FDLItAN1rGy8kPA7Dyxo8AiHADuuONoypKKp1pE09drs6e5LR7UW9luLZ/A4znA== - dependencies: - "@types/geojson" "^7946.0.14" - "@types/node" "^20.11.17" - denque "^2.1.0" - iconv-lite "^0.6.3" - lru-cache "^10.2.0" - markdown-it-highlightjs@3.3.1: version "3.3.1" resolved "https://registry.npmmirror.com/markdown-it-highlightjs/-/markdown-it-highlightjs-3.3.1.tgz#38403610487292b8a1ae2d1acc7bb66e4ede6be8" @@ -19558,11 +19286,12 @@ mysql2@^2.3.3: seq-queue "^0.0.5" sqlstring "^2.3.2" -mysql2@^3.9.1: - version "3.10.1" - resolved "https://registry.npmmirror.com/mysql2/-/mysql2-3.10.1.tgz#c39b8faf24ef4fd56330ef269122471a22d19198" - integrity sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew== +mysql2@^3.11.0: + version "3.11.0" + resolved "https://registry.npmmirror.com/mysql2/-/mysql2-3.11.0.tgz#2a7bd7c615ab43f8167ed9922063b968f3e48f33" + integrity sha512-J9phbsXGvTOcRVPR95YedzVSxJecpW5A5+cQ57rhHIFXteTP10HCs+VBjS7DHIKfEaI1zQ5tlVrquCd64A6YvA== dependencies: + aws-ssl-profiles "^1.1.1" denque "^2.1.0" generate-function "^2.3.1" iconv-lite "^0.6.3" @@ -19823,7 +19552,7 @@ node-releases@^2.0.18: resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== -node-sql-parser@^4.11.0, node-sql-parser@^4.18.0: +node-sql-parser@^4.18.0: version "4.18.0" resolved "https://registry.npmmirror.com/node-sql-parser/-/node-sql-parser-4.18.0.tgz#516b6e633c55c5abbba1ca588ab372db81ae9318" integrity sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ== @@ -20144,11 +19873,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - object-hash@^3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" @@ -20303,16 +20027,11 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.0" es-abstract "^1.22.1" -obuf@^1.0.0, obuf@^1.1.2, obuf@~1.1.2: +obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -oidc-token-hash@^5.0.3: - version "5.0.3" - resolved "https://registry.npmmirror.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" - integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== - omit-deep@0.3.0: version "0.3.0" resolved "https://registry.npmmirror.com/omit-deep/-/omit-deep-0.3.0.tgz#21c8af3499bcadd29651a232cbcacbc52445ebec" @@ -20409,16 +20128,6 @@ open@^9.1.0: is-inside-container "^1.0.0" is-wsl "^2.2.0" -openid-client@^5.4.2: - version "5.6.5" - resolved "https://registry.npmmirror.com/openid-client/-/openid-client-5.6.5.tgz#c149ad07b9c399476dc347097e297bbe288b8b00" - integrity sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w== - dependencies: - jose "^4.15.5" - lru-cache "^6.0.0" - object-hash "^2.2.0" - oidc-token-hash "^5.0.3" - opt-cli@1.5.1: version "1.5.1" resolved "https://registry.npmmirror.com/opt-cli/-/opt-cli-1.5.1.tgz#04db447b13c96b992eb31685266f4ed0d9736dc2" @@ -21145,21 +20854,11 @@ pg-int8@1.0.1: resolved "https://registry.npmmirror.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-numeric@1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" - integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== - pg-pool@^3.6.1: version "3.6.1" resolved "https://registry.npmmirror.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== -pg-protocol@*: - version "1.6.1" - resolved "https://registry.npmmirror.com/pg-protocol/-/pg-protocol-1.6.1.tgz#21333e6d83b01faaebfe7a33a7ad6bfd9ed38cb3" - integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== - pg-protocol@^1.6.0: version "1.6.0" resolved "https://registry.npmmirror.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" @@ -21176,19 +20875,6 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg-types@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/pg-types/-/pg-types-4.0.2.tgz#399209a57c326f162461faa870145bb0f918b76d" - integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== - dependencies: - pg-int8 "1.0.1" - pg-numeric "1.0.2" - postgres-array "~3.0.1" - postgres-bytea "~3.0.0" - postgres-date "~2.1.0" - postgres-interval "^3.0.0" - postgres-range "^1.1.1" - pg@^8.11.3, pg@^8.7.3: version "8.11.3" resolved "https://registry.npmmirror.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" @@ -21786,33 +21472,16 @@ postgres-array@~2.0.0: resolved "https://registry.npmmirror.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== -postgres-array@~3.0.1: - version "3.0.2" - resolved "https://registry.npmmirror.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" - integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== - postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== -postgres-bytea@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" - integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== - dependencies: - obuf "~1.1.2" - postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.npmmirror.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== -postgres-date@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" - integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== - postgres-interval@^1.1.0: version "1.2.0" resolved "https://registry.npmmirror.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" @@ -21820,21 +21489,6 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -postgres-interval@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" - integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== - -postgres-range@^1.1.1: - version "1.1.4" - resolved "https://registry.npmmirror.com/postgres-range/-/postgres-range-1.1.4.tgz#a59c5f9520909bcec5e63e8cf913a92e4c952863" - integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== - -precond@0.2: - version "0.2.3" - resolved "https://registry.npmmirror.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -21963,11 +21617,6 @@ process-warning@^1.0.0: resolved "https://registry.npmmirror.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== -process-warning@^2.1.0, process-warning@^2.2.0: - version "2.3.2" - resolved "https://registry.npmmirror.com/process-warning/-/process-warning-2.3.2.tgz#70d8a3251aab0eafe3a595d8ae2c5d2277f096a5" - integrity sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA== - process@^0.11.10: version "0.11.10" resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -24130,28 +23779,6 @@ sequelize@^6.26.0: validator "^13.9.0" wkx "^0.5.0" -sequelize@^6.35.0: - version "6.37.3" - resolved "https://registry.npmmirror.com/sequelize/-/sequelize-6.37.3.tgz#ed6212029a52c59a18638d2a703da84bc2f81311" - integrity sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A== - dependencies: - "@types/debug" "^4.1.8" - "@types/validator" "^13.7.17" - debug "^4.3.4" - dottie "^2.0.6" - inflection "^1.13.4" - lodash "^4.17.21" - moment "^2.29.4" - moment-timezone "^0.5.43" - pg-connection-string "^2.6.1" - retry-as-promised "^7.0.4" - semver "^7.5.4" - sequelize-pool "^7.1.0" - toposort-class "^1.0.1" - uuid "^8.3.2" - validator "^13.9.0" - wkx "^0.5.0" - serve-handler@6.1.3: version "6.1.3" resolved "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" @@ -26861,13 +26488,6 @@ vary@^1, vary@^1.1.2, vary@~1.1.2: resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vasync@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/vasync/-/vasync-2.2.1.tgz#d881379ff3685e4affa8e775cf0fd369262a201b" - integrity sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ== - dependencies: - verror "1.10.0" - vditor@^3.10.3: version "3.10.4" resolved "https://registry.npmmirror.com/vditor/-/vditor-3.10.4.tgz#df7e5cdf8c737b588152b2119942ff0e0904c9cd" @@ -26884,15 +26504,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -verror@^1.10.1: - version "1.10.1" - resolved "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" - integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vfile-location@^4.0.0: version "4.1.0" resolved "https://registry.npmmirror.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" @@ -27501,23 +27112,6 @@ xlsx@^0.17.0: version "0.20.2" resolved "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz#0f64eeed3f1a46e64724620c3553f2dbd3cd2d7d" -xml-crypto@^3.0.1: - version "3.2.0" - resolved "https://registry.npmmirror.com/xml-crypto/-/xml-crypto-3.2.0.tgz#a9debab572c8e895cff5fb351a8d8be3f6e1962e" - integrity sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg== - dependencies: - "@xmldom/xmldom" "^0.8.8" - xpath "0.0.32" - -xml-encryption@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/xml-encryption/-/xml-encryption-3.0.2.tgz#d3cb67d97cdd9673313a42cc0d7fa43ff0886c21" - integrity sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg== - dependencies: - "@xmldom/xmldom" "^0.8.5" - escape-html "^1.0.3" - xpath "0.0.32" - xml-lexer@^0.2.2: version "0.2.2" resolved "https://registry.npmmirror.com/xml-lexer/-/xml-lexer-0.2.2.tgz#518193a4aa334d58fc7d248b549079b89907e046" @@ -27546,15 +27140,7 @@ xml2js@^0.4.22: sax ">=0.6.0" xmlbuilder "~11.0.0" -xml2js@^0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" - integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xml2js@^0.6.0, xml2js@^0.6.2: +xml2js@^0.6.2: version "0.6.2" resolved "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== @@ -27562,11 +27148,6 @@ xml2js@^0.6.0, xml2js@^0.6.2: sax ">=0.6.0" xmlbuilder "~11.0.0" -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" @@ -27577,16 +27158,6 @@ xmlchars@^2.2.0: resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xpath@0.0.27: - version "0.0.27" - resolved "https://registry.npmmirror.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" - integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== - -xpath@0.0.32: - version "0.0.32" - resolved "https://registry.npmmirror.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" - integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== - xpipe@^1.0.5: version "1.0.7" resolved "https://registry.npmmirror.com/xpipe/-/xpipe-1.0.7.tgz#d0aff00e080a44ffbdbe45dd7658ff6c483464c8"