diff --git a/client/VERSION b/client/VERSION index 62e64205b..48a6b508d 100644 --- a/client/VERSION +++ b/client/VERSION @@ -1 +1 @@ -2.4.6 \ No newline at end of file +2.4.7 \ No newline at end of file diff --git a/client/package.json b/client/package.json index 89ac1c8e3..03b822411 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-frontend", - "version": "2.4.6", + "version": "2.4.7", "type": "module", "private": true, "workspaces": [ @@ -24,7 +24,7 @@ "devDependencies": { "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.18.6", - "@rollup/plugin-typescript": "^8.5.0", + "@rollup/plugin-typescript": "^12.1.0", "@testing-library/jest-dom": "^5.16.5", "@types/file-saver": "^2.0.5", "@types/jest": "^29.2.2", @@ -84,7 +84,7 @@ "react-countup": "^6.5.3", "react-player": "^2.11.0", "resize-observer-polyfill": "^1.5.1", - "rollup": "^4.13.0", + "rollup": "^4.22.5", "simplebar": "^6.2.5", "tui-image-editor": "^3.15.3" } diff --git a/client/packages/lowcoder-cli/package.json b/client/packages/lowcoder-cli/package.json index c28e84cae..7dbb8e48d 100644 --- a/client/packages/lowcoder-cli/package.json +++ b/client/packages/lowcoder-cli/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@vitejs/plugin-react": "^2.2.0", - "axios": "^1.1.3", + "axios": "^1.7.4", "chalk": "4", "commander": "^9.4.1", "cross-spawn": "^7.0.3", diff --git a/client/packages/lowcoder-comps/package.json b/client/packages/lowcoder-comps/package.json index 93987693a..593c1346e 100644 --- a/client/packages/lowcoder-comps/package.json +++ b/client/packages/lowcoder-comps/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-comps", - "version": "2.4.16", + "version": "2.4.17", "type": "module", "license": "MIT", "dependencies": { diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx index 9a24ef242..bfdd73105 100644 --- a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx @@ -1,7 +1,8 @@ import { default as Form } from "antd/es/form"; import { default as Input } from "antd/es/input"; +import { default as ColorPicker } from "antd/es/color-picker"; import { trans, getCalendarLocale } from "../../i18n/comps"; -import { createRef, useContext, useRef, useState, useEffect } from "react"; +import { createRef, useContext, useRef, useState, useEffect, useCallback } from "react"; import dayjs from "dayjs"; import FullCalendar from "@fullcalendar/react"; import resourceTimelinePlugin from "@fullcalendar/resource-timeline"; @@ -49,7 +50,10 @@ import { EditorContext, CompNameContext, AnimationStyle, - EventModalStyle + EventModalStyle, + migrateOldData, + controlItem, + depsConfig, } from 'lowcoder-sdk'; import { @@ -60,7 +64,7 @@ import { Event, Remove, EventType, - defaultData, + defaultEvents, ViewType, buttonText, headerToolbar, @@ -71,18 +75,68 @@ import { viewClassNames, FormWrapper, resourcesDefaultData, - resourcesEventsDefaultData, resourceTimeLineHeaderToolbar, resourceTimeGridHeaderToolbar, } from "./calendarConstants"; +import { EventOptionControl } from "./eventOptionsControl"; + +function fixOldData(oldData: any) { + if(!Boolean(oldData)) return; + let {events, resourcesEvents, ...data } = oldData; + let allEvents: any[] = []; + + if (events && typeof events === 'string') { + let eventsList = JSON.parse(events); + if (eventsList && eventsList.length) { + eventsList = eventsList?.map(event => { + const {title, ...eventData} = event; + return { + ...eventData, + label: title, // replace title field with label + } + }); + allEvents = allEvents.concat(eventsList); + } + } + if (resourcesEvents && typeof resourcesEvents === 'string') { + let resourceEventsList = JSON.parse(resourcesEvents); + if (resourceEventsList && resourceEventsList.length) { + resourceEventsList = resourceEventsList?.map(event => { + const {title, ...eventData} = event; + return { + ...eventData, + label: title, // replace title field with label + } + }); + allEvents = allEvents.concat(resourceEventsList); + } + } + + if (allEvents.length) { + return { + ...data, + events: { + manual: { + manual: allEvents, + }, + mapData: { + data: JSON.stringify(allEvents, null, 2), + }, + optionType: "manual", + }, + }; + } + return { + ...data, + events, + }; +} let childrenMap: any = { - events: jsonValueExposingStateControl("events", defaultData), - resourcesEvents: jsonValueExposingStateControl("resourcesEvents", resourcesEventsDefaultData), + events: EventOptionControl, resources: jsonValueExposingStateControl("resources", resourcesDefaultData), resourceName: withDefault(StringControl, trans("calendar.resourcesDefault")), onEvent: CalendarEventHandlerControl ? CalendarEventHandlerControl : ChangeEventHandlerControl, - // onDropEvent: safeDragEventHandlerControl, editable: withDefault(BoolControl, true), showEventTime: withDefault(BoolControl, true), showWeekends: withDefault(BoolControl, true), @@ -96,7 +150,9 @@ let childrenMap: any = { currentFreeView: dropdownControl(DefaultWithFreeViewOptions, "timeGridWeek"), currentPremiumView: dropdownControl(DefaultWithPremiumViewOptions, "resourceTimelineDay"), animationStyle: styleControl(AnimationStyle, 'animationStyle'), + showVerticalScrollbar: withDefault(BoolControl, false), }; + // this should ensure backwards compatibility with older versions of the SDK if (DragEventHandlerControl) { childrenMap = { @@ -114,7 +170,6 @@ if (EventModalStyle) { let CalendarBasicComp = (function () { return new UICompBuilder(childrenMap, (props: { events: any; - resourcesEvents: any; resources: any; resourceName : string onEvent?: any; @@ -134,6 +189,7 @@ let CalendarBasicComp = (function () { currentPremiumView?: string; animationStyle?:any; modalStyle?:any + showVerticalScrollbar?:boolean }, dispatch: any) => { @@ -141,7 +197,6 @@ let CalendarBasicComp = (function () { useContext(CompNameContext) ); const onEventVal = comp?.toJsonValue()?.comp?.onEvent; - const theme = useContext(ThemeContext); const ref = createRef(); @@ -155,17 +210,20 @@ let CalendarBasicComp = (function () { }, [props.licenseKey]); let currentView = licensed ? props.currentPremiumView : props.currentFreeView; - let currentEvents = currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay" ? props.resourcesEvents : props.events; + let currentEvents = currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay" + ? props.events.filter((event: { resourceId: any; }) => Boolean(event.resourceId)) + : props.events.filter((event: { resourceId: any; }) => !Boolean(event.resourceId)); // we use one central stack of events for all views - let events = Array.isArray(currentEvents.value) ? currentEvents.value.map((item: EventType) => { + let events = Array.isArray(currentEvents) ? currentEvents.map((item: EventType) => { return { - title: item.title, + title: item.label, id: item.id, start: dayjs(item.start, DateParser).format(), end: dayjs(item.end, DateParser).format(), allDay: item.allDay, resourceId: item.resourceId ? item.resourceId : null, + groupId: item.groupId ? item.groupId : null, backgroundColor: item.backgroundColor, extendedProps: { color: isValidColor(item.color || "") ? item.color : theme?.theme?.primary, @@ -182,7 +240,7 @@ let CalendarBasicComp = (function () { animationDuration:item?.animationDuration, animationIterationCount:item?.animationIterationCount }} - }) : [currentEvents.value]; + }) : [currentEvents]; const resources = props.resources.value; @@ -261,8 +319,21 @@ let CalendarBasicComp = (function () { licenseKey, resourceName, modalStyle, + showVerticalScrollbar } = props; + const handleEventDataChange = useCallback((data: Array>) => { + comp.children?.comp.children.events.children.manual.children.manual.dispatch( + comp.children?.comp.children.events.children.manual.children.manual.setChildrensAction( + data + ) + ); + comp.children?.comp.children.events.children.mapData.children.data.dispatchChangeValueAction( + JSON.stringify(data) + ); + props.onEvent("change"); + }, [comp, props.onEvent]); + function renderEventContent(eventInfo: EventContentArg) { const isList = eventInfo.view.type === "listWeek"; let sizeClass = ""; @@ -304,11 +375,10 @@ let CalendarBasicComp = (function () { className="event-remove" onClick={(e) => { e.stopPropagation(); - props.onEvent("change"); - const event = events.filter( + const events = props.events.filter( (item: EventType) => item.id !== eventInfo.event.id ); - props.events.onChange(event); + handleEventDataChange(events); }} onMouseDown={(e) => { e.stopPropagation(); @@ -321,14 +391,23 @@ let CalendarBasicComp = (function () { ); } const handleDbClick = () => { - const event = props.events.value.find( + const event = props.events.find( (item: EventType) => item.id === editEvent.current?.id ) as EventType; if (!editable || !editEvent.current) { return; } if (event) { - const { title, groupId, color, id , backgroundColor,detail,titleColor,detailColor, + const { + id , + label, + detail, + groupId, + resourceId, + color, + backgroundColor, + titleColor, + detailColor, titleFontWeight, titleFontStyle, detailFontWeight, @@ -337,12 +416,11 @@ let CalendarBasicComp = (function () { animationDelay, animationDuration, animationIterationCount, - - } = event; const eventInfo = { - title, + label, groupId, + resourceId, color, id, backgroundColor, @@ -374,7 +452,7 @@ let CalendarBasicComp = (function () { allDay: info.allDay, start: info.startStr, end: info.endStr, - }; + } as EventType; const view = info.view.type as ViewType; const duration = dayjs(info.end).diff(dayjs(info.start), "minutes"); const singleClick = @@ -405,9 +483,9 @@ let CalendarBasicComp = (function () { customStyles: { backgroundColor:props?.modalStyle?.background, animationStyle:props?.animationStyle, - }, - width: "450px", - content: ( + }, + width: "450px", + content: ( @@ -426,7 +504,7 @@ let CalendarBasicComp = (function () { + + + @@ -453,25 +537,53 @@ let CalendarBasicComp = (function () { label={trans("calendar.eventTitleColor")} name="titleColor" > - + node.parentNode} + defaultValue={form.getFieldValue('titleColor')} + showText + allowClear + format="hex" + onChange={(_, hex) => form.setFieldValue('titleColor', hex)} + /> - + node.parentNode} + defaultValue={form.getFieldValue('detailColor')} + showText + allowClear + format="hex" + onChange={(_, hex) => form.setFieldValue('detailColor', hex)} + /> - + node.parentNode} + defaultValue={form.getFieldValue('color')} + showText + allowClear + format="hex" + onChange={(_, hex) => form.setFieldValue('color', hex)} + /> - + node.parentNode} + defaultValue={form.getFieldValue('backgroundColor')} + showText + allowClear + format="hex" + onChange={(_, hex) => form.setFieldValue('backgroundColor', hex)} + /> @@ -536,7 +648,17 @@ let CalendarBasicComp = (function () { onConfirm: () => { form.submit(); return form.validateFields().then(() => { - const { id, groupId, color, title = "", backgroundColor,detail,titleColor,detailColor , titleFontWeight, + const { + id, + label = "", + detail, + groupId, + resourceId, + color, + backgroundColor, + titleColor, + detailColor, + titleFontWeight, titleFontStyle, detailFontWeight, detailFontStyle, @@ -544,7 +666,7 @@ let CalendarBasicComp = (function () { animationDelay, animationDuration, animationIterationCount } = form.getFieldsValue(); - const idExist = props.events.value.findIndex( + const idExist = props.events.findIndex( (item: EventType) => item.id === id ); if (idExist > -1 && id !== eventId) { @@ -554,14 +676,15 @@ let CalendarBasicComp = (function () { throw new Error(); } if (ifEdit) { - const changeEvents = props.events.value.map((item: EventType) => { + const changeEvents = props.events.map((item: EventType) => { if (item.id === eventId) { return { ...item, - title, + label, detail, id, ...(groupId !== undefined ? { groupId } : null), + ...(resourceId !== undefined ? { resourceId } : null), ...(color !== undefined ? { color } : null), ...(backgroundColor !== undefined ? { backgroundColor } : null), ...(titleColor !== undefined ? { titleColor } : null), @@ -579,14 +702,14 @@ let CalendarBasicComp = (function () { return item; } }); - props.events.onChange(changeEvents); + handleEventDataChange(changeEvents); } else { const createInfo = { allDay: event.allDay, start: event.start, end: event.end, id, - title, + label, detail, titleFontWeight, titleFontStyle, @@ -597,14 +720,14 @@ let CalendarBasicComp = (function () { animationDuration, animationIterationCount, ...(groupId !== undefined ? { groupId } : null), + ...(resourceId !== undefined ? { resourceId } : null), ...(color !== undefined ? { color } : null), ...(backgroundColor !== undefined ? { backgroundColor } : null), ...(titleColor !== undefined ? { titleColor } : null), ...(detailColor !== undefined ? { detailColor } : null), }; - props.events.onChange([...props.events.value, createInfo]); + handleEventDataChange([...props.events, createInfo]); } - props.onEvent("change"); form.resetFields(); }); //small change }, @@ -620,12 +743,14 @@ let CalendarBasicComp = (function () { props.onDropEvent("dropEvent"); } }; + return ( { if (info.view) { - handleDrop + handleDrop(); } }} /> @@ -737,7 +862,6 @@ let CalendarBasicComp = (function () { }) .setPropertyViewFn((children: { events: { propertyView: (arg0: {}) => any; }; - resourcesEvents: { propertyView: (arg0: {}) => any; }; resources: { propertyView: (arg0: {}) => any; }; resourceName: { propertyView: (arg0: {}) => any; }; onEvent: { propertyView: ({title}?: {title?: string}) => any; }; @@ -756,21 +880,26 @@ let CalendarBasicComp = (function () { animationStyle: { getPropertyView: () => any; }; modalStyle: { getPropertyView: () => any; }; licenseKey: { getView: () => any; propertyView: (arg0: { label: string; }) => any; }; + showVerticalScrollbar: { propertyView: (arg0: { label: string; }) => any; }; }) => { - const license = children.licenseKey.getView(); return ( <>
{children.defaultDate.propertyView({ label: trans("calendar.defaultDate"), tooltip: trans("calendar.defaultDateTooltip"), })} - {children.events.propertyView({label: trans("calendar.events")})} - {license == "" ? null : children.resourcesEvents.propertyView({label: trans("calendar.resourcesEvents")})} + {controlItem({filterText: 'events'}, ( +

{trans("calendar.events")}

+ ))} + {children.events.propertyView({ + title: "Events", + newOptionLabel: "Event", + })}
{ license != "" &&
- {children.resources.propertyView({label: trans("calendar.resources")})} {children.resourceName.propertyView({label: trans("calendar.resourcesName")})} + {children.resources.propertyView({label: trans("calendar.resources")})}
}
@@ -796,6 +925,7 @@ let CalendarBasicComp = (function () { ? children.currentFreeView.propertyView({ label: trans("calendar.defaultView"), tooltip: trans("calendar.defaultViewTooltip"), }) : children.currentPremiumView.propertyView({ label: trans("calendar.defaultView"), tooltip: trans("calendar.defaultViewTooltip"), })} {children.firstDay.propertyView({ label: trans("calendar.startWeek"), })} + {children.showVerticalScrollbar.propertyView({ label: trans("calendar.showVerticalScrollbar")})}
{children.style.getPropertyView()} @@ -818,11 +948,35 @@ CalendarBasicComp = class extends CalendarBasicComp { } }; +CalendarBasicComp = migrateOldData(CalendarBasicComp, fixOldData) + const TmpCalendarComp = withExposingConfigs(CalendarBasicComp, [ - new NameConfig("events", trans("calendar.events")), - new NameConfig("resourcesEvents", trans("calendar.resourcesEvents")), - new NameConfig("resources", trans("calendar.resources")), NameConfigHidden, + new NameConfig("resources", trans("calendar.resources")), + depsConfig({ + name: "allEvents", + desc: trans("calendar.events"), + depKeys: ["events"], + func: (input: { events: any[]; }) => { + return input.events; + }, + }), + depsConfig({ + name: "events", + desc: trans("calendar.events"), + depKeys: ["events"], + func: (input: { events: any[]; }) => { + return input.events.filter(event => !Boolean(event.resourceId)); + }, + }), + depsConfig({ + name: "resourcesEvents", + desc: trans("calendar.resourcesEvents"), + depKeys: ["events"], + func: (input: { events: any[]; }) => { + return input.events.filter(event => Boolean(event.resourceId)); + }, + }), ]); let CalendarComp = withMethodExposing(TmpCalendarComp, [ diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx index 0b84dba58..e8602a8fe 100644 --- a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx @@ -32,6 +32,7 @@ export const Wrapper = styled.div<{ $style?: CalendarStyleType; $theme?: ThemeDetail; $left?: number; + $showVerticalScrollbar?:boolean; }>` position: relative; height: 100%; @@ -359,6 +360,9 @@ export const Wrapper = styled.div<{ .fc .fc-scrollgrid table { width: 100% !important; } + .fc-scroller.fc-scroller-liquid-absolute::-webkit-scrollbar { + display:${(props) => (props.$showVerticalScrollbar ? 'block' : 'none')}; + } // event .fc-timegrid-event .fc-event-main { @@ -765,8 +769,6 @@ export const Event = styled.div<{ } `; - - export const FormWrapper = styled(Form)<{ $modalStyle?: EventModalStyleType }>` @@ -934,10 +936,10 @@ export const FirstDayOptions = [ }, ]; -export const defaultData = [ +export const defaultEvents = [ { id: "1", - title: "Coding", + label: "Coding", start: dayjs().hour(10).minute(0).second(0).format(DATE_TIME_FORMAT), end: dayjs().hour(12).minute(30).second(0).format(DATE_TIME_FORMAT), color: "#079968", @@ -956,18 +958,42 @@ export const defaultData = [ }, { id: "2", - title: "Rest", + label: "Rest", start: dayjs().hour(24).format(DATE_FORMAT), end: dayjs().hour(48).format(DATE_FORMAT), color: "#079968", allDay: true, }, + { + id: "3", + resourceId: "d1", + label: "event 1", + start: dayjs().hour(10).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(17).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, + { + id: "4", + resourceId: "b", + label: "event 5", + start: dayjs().hour(8).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(16).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, + { + id: "5", + resourceId: "a", + label: "event 3", + start: dayjs().hour(12).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(21).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, ]; export const resourcesEventsDefaultData = [ { id: "1", resourceId: "d1", - title: "event 1", + label: "event 1", start: dayjs().hour(10).minute(0).second(0).format(DATE_TIME_FORMAT), end: dayjs().hour(17).minute(30).second(0).format(DATE_TIME_FORMAT), color: "#079968", @@ -975,7 +1001,7 @@ export const resourcesEventsDefaultData = [ { id: "2", resourceId: "b", - title: "event 5", + label: "event 5", start: dayjs().hour(8).minute(0).second(0).format(DATE_TIME_FORMAT), end: dayjs().hour(16).minute(30).second(0).format(DATE_TIME_FORMAT), color: "#079968", @@ -983,7 +1009,7 @@ export const resourcesEventsDefaultData = [ { id: "3", resourceId: "a", - title: "event 3", + label: "event 3", start: dayjs().hour(12).minute(0).second(0).format(DATE_TIME_FORMAT), end: dayjs().hour(21).minute(30).second(0).format(DATE_TIME_FORMAT), color: "#079968", diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/eventOptionsControl.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/eventOptionsControl.tsx new file mode 100644 index 000000000..5b74888c9 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/eventOptionsControl.tsx @@ -0,0 +1,169 @@ +import { + MultiCompBuilder, + StringControl, + BoolControl, + ColorControl, + optionsControl, + NewChildren, + RecordConstructorToComp, + controlItem +} from 'lowcoder-sdk'; +import { default as Divider } from "antd/es/divider"; +import { trans } from "../../i18n/comps"; +import styled from "styled-components"; +import { defaultEvents } from './calendarConstants'; + +const PropertyViewWrapper = styled.div` + max-height: 80vh; + height: 100%; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 8px; +`; + +type NewChildren = typeof NewChildren; +type RecordConstructorToComp = typeof RecordConstructorToComp; + +const eventChildrenMap = { + id: StringControl, + label: StringControl, + detail: StringControl, + groupId: StringControl, + resourceId: StringControl, + start: StringControl, // TODO: Create Date,Time & DateTime Controls + end: StringControl, + allDay: BoolControl, + color: ColorControl, + backgroundColor: ColorControl, + titleColor: ColorControl, + detailColor: ColorControl, + titleFontWeight: StringControl, + titleFontStyle: StringControl, + detailFontWeight: StringControl, + detailFontStyle: StringControl, + animation: StringControl, + animationDelay: StringControl, + animationDuration: StringControl, + animationIterationCount: StringControl, +}; + +type EventChildrenType = NewChildren>; + +const EventGeneral = ({ childrenMap }: { childrenMap: EventChildrenType }) => ( + <> + {controlItem({filterText: 'general'}, ( + <>{trans("calendar.general")} + ))} + {childrenMap.id.propertyView({ + label: trans("calendar.eventId"), + tooltip: trans("calendar.eventIdTooltip"), + })} + {childrenMap.label.propertyView({ + label: trans("calendar.eventName"), + })} + {childrenMap.detail.propertyView({ + label: trans("calendar.eventdetail"), + })} + {childrenMap.groupId.propertyView({ + label: trans("calendar.eventGroupId"), + tooltip: trans("calendar.groupIdTooltip"), + })} + {childrenMap.resourceId.propertyView({ + label: trans("calendar.eventResourceId"), + })} + {childrenMap.start.propertyView({ + label: trans("calendar.eventStartTime"), + })} + {childrenMap.end.propertyView({ + label: trans("calendar.eventEndTime"), + })} + {childrenMap.allDay.propertyView({ + label: trans("calendar.eventAllDay"), + })} + +); + +const EventColorStyles = ({ childrenMap }: { childrenMap: EventChildrenType }) => ( + <> + {controlItem({filterText: 'colorStyles'}, ( + <>{trans("calendar.colorStyles")} + ))} + {childrenMap.titleColor.propertyView({ + label: trans("calendar.eventTitleColor"), + })} + {childrenMap.detailColor.propertyView({ + label: trans("calendar.eventdetailColor"), + })} + {childrenMap.color.propertyView({ + label: trans("calendar.eventColor"), + })} + {childrenMap.backgroundColor.propertyView({ + label: trans("calendar.eventBackgroundColor"), + })} + +); + +const EventFontStyles = ({ childrenMap }: { childrenMap: EventChildrenType }) => ( + <> + {controlItem({filterText: 'fontStyles'}, ( + <>{trans("calendar.fontStyles")} + ))} + {childrenMap.titleFontWeight.propertyView({ + label: trans("calendar.eventTitleFontWeight"), + })} + {childrenMap.titleFontStyle.propertyView({ + label: trans("calendar.eventTitleFontStyle"), + })} + {childrenMap.detailFontWeight.propertyView({ + label: trans("calendar.eventdetailFontWeight"), + })} + {childrenMap.detailFontStyle.propertyView({ + label: trans("calendar.eventdetailFontStyle"), + })} + +); + +const EventAnimations = ({ childrenMap }: { childrenMap: EventChildrenType }) => ( + <> + {controlItem({filterText: 'animations'}, ( + <>{trans("calendar.animations")} + ))} + {childrenMap.animation.propertyView({ + label: trans("calendar.animationType"), + })} + {childrenMap.animationDelay.propertyView({ + label: trans("calendar.animationDelay"), + })} + {childrenMap.animationDuration.propertyView({ + label: trans("calendar.animationDuration"), + })} + {childrenMap.animationIterationCount.propertyView({ + label: trans("calendar.animationIterationCount"), + })} + +); + +let EventOption = new MultiCompBuilder(eventChildrenMap, + (props: any) => props +) +.setPropertyViewFn((children: EventChildrenType) => ( + + + + + + + + + +)) +.build(); + +export const EventOptionControl = optionsControl( + EventOption, + { + initOptions: defaultEvents, + uniqField: "id", + } +); diff --git a/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts b/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts index c421bb60e..f6261b84f 100644 --- a/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts +++ b/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts @@ -329,6 +329,10 @@ export const en = { eventIdRequire: "Enter Event ID", eventIdTooltip: "Unique ID for each event", eventIdExist: "ID Exists", + eventStartTime: "Start Time", + eventEndTime: "End Time", + eventAllDay: "All Day", + eventResourceId: "Resource ID", dragDropEventHandlers: "Drag/Drop Event Handlers", general: "General", colorStyles:"Color Styles", @@ -341,7 +345,8 @@ export const en = { animationType:"Type", animationDelay:"Delay", animationDuration:"Duration", - animationIterationCount:"IterationCount" + animationIterationCount:"IterationCount", + showVerticalScrollbar:"Show Vertical ScrollBar" }, }; diff --git a/client/packages/lowcoder-design/src/components/Dropdown.tsx b/client/packages/lowcoder-design/src/components/Dropdown.tsx index adc5465d9..c20733c0f 100644 --- a/client/packages/lowcoder-design/src/components/Dropdown.tsx +++ b/client/packages/lowcoder-design/src/components/Dropdown.tsx @@ -6,6 +6,7 @@ import { ReactNode } from "react"; import styled from "styled-components"; import { CustomSelect } from "./customSelect"; import { EllipsisTextCss } from "./Label"; +import { useEffect } from "react"; import { TacoMarkDown } from "./markdown"; import { Tooltip, ToolTipLabel } from "./toolTip"; @@ -157,6 +158,19 @@ interface DropdownProps extends Omit(props: DropdownProps) { const { placement = "right" } = props; const valueInfoMap = _.fromPairs(props.options.map((option) => [option.value, option])); + + useEffect(() => { + const dropdownElems = document.querySelectorAll("div.ant-dropdown ul.ant-dropdown-menu"); + for (let index = 0; index < dropdownElems.length; index++) { + const element = dropdownElems[index]; + console.log(element); + element.style.maxHeight = "300px"; + element.style.overflowY = "scroll"; + element.style.minWidth = "150px"; + element.style.paddingRight = "10px"; + } + }, []); + return ( {props.label && ( diff --git a/client/packages/lowcoder-sdk/package.json b/client/packages/lowcoder-sdk/package.json index 8da0fa8cb..62b9576a9 100644 --- a/client/packages/lowcoder-sdk/package.json +++ b/client/packages/lowcoder-sdk/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-sdk", - "version": "2.4.13", + "version": "2.4.14", "type": "module", "files": [ "src", diff --git a/client/packages/lowcoder/package.json b/client/packages/lowcoder/package.json index fe334d756..7605839cf 100644 --- a/client/packages/lowcoder/package.json +++ b/client/packages/lowcoder/package.json @@ -38,7 +38,7 @@ "@types/react-virtualized": "^9.21.21", "animate.css": "^4.1.1", "antd": "^5.20.0", - "axios": "^1.6.2", + "axios": "^1.7.4", "buffer": "^6.0.3", "clsx": "^2.0.0", "cnchar": "^3.2.4", diff --git a/client/packages/lowcoder/src/app.tsx b/client/packages/lowcoder/src/app.tsx index 5c85e716a..f6cbdac58 100644 --- a/client/packages/lowcoder/src/app.tsx +++ b/client/packages/lowcoder/src/app.tsx @@ -56,6 +56,8 @@ import { buildMaterialPreviewURL } from "./util/materialUtils"; import GlobalInstances from 'components/GlobalInstances'; // import posthog from 'posthog-js' import { fetchHomeData } from "./redux/reduxActions/applicationActions"; +import { getNpmPackageMeta } from "./comps/utils/remote"; +import { packageMetaReadyAction, setLowcoderCompsLoading } from "./redux/reduxActions/npmPluginActions"; const LazyUserAuthComp = React.lazy(() => import("pages/userAuth")); const LazyInviteLanding = React.lazy(() => import("pages/common/inviteLanding")); @@ -90,6 +92,7 @@ type AppIndexProps = { fetchHomeDataFinished: boolean; fetchConfig: (orgId?: string) => void; fetchHomeData: (currentUserAnonymous?: boolean | undefined) => void; + fetchLowcoderCompVersions: () => void; getCurrentUser: () => void; favicon: string; brandName: string; @@ -112,6 +115,7 @@ class AppIndex extends React.Component { this.props.fetchConfig(this.props.currentOrgId); if (!this.props.currentUserAnonymous) { this.props.fetchHomeData(this.props.currentUserAnonymous); + this.props.fetchLowcoderCompVersions(); } } } @@ -418,10 +422,21 @@ const mapDispatchToProps = (dispatch: any) => ({ dispatch(fetchUserAction()); }, fetchConfig: (orgId?: string) => dispatch(fetchConfigAction(orgId)), - fetchHomeData: (currentUserAnonymous: boolean | undefined) => { dispatch(fetchHomeData({})); - } + }, + fetchLowcoderCompVersions: async () => { + try { + dispatch(setLowcoderCompsLoading(true)); + const packageMeta = await getNpmPackageMeta('lowcoder-comps'); + if (packageMeta?.versions) { + dispatch(packageMetaReadyAction('lowcoder-comps', packageMeta)); + } + dispatch(setLowcoderCompsLoading(false)); + } catch (_) { + dispatch(setLowcoderCompsLoading(false)); + } + }, }); const AppIndexWithProps = connect(mapStateToProps, mapDispatchToProps)(AppIndex); diff --git a/client/packages/lowcoder/src/components/ThemeSettingsSelector.tsx b/client/packages/lowcoder/src/components/ThemeSettingsSelector.tsx index 91aa91d1d..54469195a 100644 --- a/client/packages/lowcoder/src/components/ThemeSettingsSelector.tsx +++ b/client/packages/lowcoder/src/components/ThemeSettingsSelector.tsx @@ -428,7 +428,6 @@ export default function ThemeSettingsSelector(props: ColorConfigProps) { size="small" checked={showComponentLoaders} onChange={(value) => { - debugger; setComponentLoaders(value) configChange({ themeSettingKey, showComponentLoadingIndicators: value}); }} diff --git a/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx b/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx index a471dea7c..bec7edb67 100644 --- a/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx @@ -21,6 +21,7 @@ import { ApplicationCategoriesEnum } from "constants/applicationConstants"; import { BoolControl } from "../controls/boolControl"; import { getNpmPackageMeta } from "../utils/remote"; import { getPromiseAfterDispatch } from "@lowcoder-ee/util/promiseUtils"; +import type { AppState } from "@lowcoder-ee/redux/reducers"; const TITLE = trans("appSetting.title"); const USER_DEFINE = "__USER_DEFINE"; @@ -195,6 +196,7 @@ type ChildrenInstance = RecordConstructorToComp & { }; function AppSettingsModal(props: ChildrenInstance) { + const lowcoderCompsMeta = useSelector((state: AppState) => state.npmPlugin.packageMeta['lowcoder-comps']); const [lowcoderCompVersions, setLowcoderCompVersions] = useState(['latest']); const { themeList, @@ -209,7 +211,7 @@ function AppSettingsModal(props: ChildrenInstance) { preventAppStylesOverwriting, lowcoderCompVersion, } = props; - + const THEME_OPTIONS = themeList?.map((theme) => ({ label: theme.name, value: theme.id + "", @@ -230,14 +232,11 @@ function AppSettingsModal(props: ChildrenInstance) { }, [themeWithDefault]); useEffect(() => { - const fetchCompsPackageMeta = async () => { - const packageMeta = await getNpmPackageMeta('lowcoder-comps'); - if (packageMeta?.versions) { - setLowcoderCompVersions(Object.keys(packageMeta.versions).reverse()) - } - } - fetchCompsPackageMeta(); - }, []) + setLowcoderCompVersions([ + 'latest', + ...Object.keys(lowcoderCompsMeta?.versions || []).reverse() + ]) + }, [lowcoderCompsMeta]) const DropdownItem = (params: { value: string }) => { diff --git a/client/packages/lowcoder/src/comps/comps/columnLayout/columnLayout.tsx b/client/packages/lowcoder/src/comps/comps/columnLayout/columnLayout.tsx index a271f3972..df3fe5011 100644 --- a/client/packages/lowcoder/src/comps/comps/columnLayout/columnLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/columnLayout/columnLayout.tsx @@ -17,7 +17,7 @@ import { sameTypeMap, UICompBuilder, withDefault } from "comps/generators"; import { addMapChildAction } from "comps/generators/sameTypeMap"; import { NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; import { NameGenerator } from "comps/utils"; -import { Section, controlItem, sectionNames } from "lowcoder-design"; +import { ScrollBar, Section, controlItem, sectionNames } from "lowcoder-design"; import { HintPlaceHolder } from "lowcoder-design"; import _ from "lodash"; import styled from "styled-components"; @@ -96,6 +96,7 @@ const childrenMap = { templateRows: withDefault(StringControl, "1fr"), rowGap: withDefault(StringControl, "20px"), templateColumns: withDefault(StringControl, "1fr 1fr"), + mainScrollbar: withDefault(BoolControl, false), columnGap: withDefault(StringControl, "20px"), style: styleControl(ContainerStyle, 'style'), columnStyle: styleControl(ResponsiveLayoutColStyle , 'columnStyle') @@ -133,48 +134,53 @@ const ColumnLayout = (props: ColumnLayoutProps) => { columnGap, columnStyle, horizontalGridCells, + mainScrollbar } = props; return ( - - {columns.map(column => { - const id = String(column.id); - const childDispatch = wrapDispatch(wrapDispatch(dispatch, "containers"), id); - if(!containers[id]) return null - const containerProps = containers[id].children; - const noOfColumns = columns.length; - return ( - - - - - - ) - }) - } - +
+ + + {columns.map(column => { + const id = String(column.id); + const childDispatch = wrapDispatch(wrapDispatch(dispatch, "containers"), id); + if(!containers[id]) return null + const containerProps = containers[id].children; + const noOfColumns = columns.length; + return ( + + + + + + ) + }) + } + + +
); @@ -207,6 +213,9 @@ export const ResponsiveLayoutBaseComp = (function () { <>
{children.autoHeight.getPropertyView()} + {(!children.autoHeight.getView()) && children.mainScrollbar.propertyView({ + label: trans("prop.mainScrollbar") + })} {children.horizontalGridCells.propertyView({ label: trans('prop.horizontalGridCells'), })} diff --git a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx index d57ff2bba..9a14ba22d 100644 --- a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx @@ -96,10 +96,7 @@ const childrenMap = { name: "{{currentUser.name}}", email: "{{currentUser.email}}", }), - mentionList: jsonControl(checkMentionListData, { - "@": ["Li Lei", "Han Meimei"], - "#": ["123", "456", "789"], - }), + mentionList: jsonControl(checkMentionListData, {"@":["John Doe","Jane Doe","Michael Smith","Emily Davis","Robert Johnson","Patricia Brown","William Jones","Jennifer Miller","David Wilson","Linda Moore"],"#":["#lowcode","#automation","#appbuilder","#nocode","#workflow","#draganddrop","#rapiddevelopment","#digitaltransformation","#integration","#api"]}), onEvent: eventHandlerControl(EventOptions), style: styleControl(CommentStyle , 'style'), animationStyle: styleControl(AnimationStyle , 'animationStyle'), diff --git a/client/packages/lowcoder/src/comps/comps/commentComp/commentConstants.tsx b/client/packages/lowcoder/src/comps/comps/commentComp/commentConstants.tsx index ab4a71f40..94225eb72 100644 --- a/client/packages/lowcoder/src/comps/comps/commentComp/commentConstants.tsx +++ b/client/packages/lowcoder/src/comps/comps/commentComp/commentConstants.tsx @@ -45,32 +45,7 @@ export const CommentUserDataTooltip = ( ) -export const commentDate = [ - { - user: { - name: "Li Lei", - avatar: - "https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png", - }, - value: "What is the use of this component?", - createdAt: "2023-06-15T08:40:41.658Z", - }, - { - user: { name: "mou" }, - value: "This component allows you to post or delete comments, as well as mention people who appear in the chat.", - createdAt: "2023-06-16T08:43:42.658Z", - }, - { - user: { name: "Han Meimei", displayName: "Han" }, - value: "I want to give it a try", - createdAt: "2023-06-17T08:49:01.658Z", - }, - { - user: { name: "mou" }, - value: "Enter the content in the input box below and press shift+enter to send it immediately", - createdAt: "2023-06-18T08:50:11.658Z", - }, -]; +export const commentDate = [{"user":{"name":"John Doe","avatar":"https://ui-avatars.com/api/?name=John+Doe"},"value":"Has anyone tried using Lowcode for our new internal tool yet?","createdAt":"2024-09-20T10:15:41.658Z"},{"user":{"name":"Jane Smith","avatar":"https://ui-avatars.com/api/?name=Jane+Smith"},"value":"Yes, I’ve been experimenting with it for automating our workflows. It's super quick to set up.","createdAt":"2024-09-20T10:17:12.658Z"},{"user":{"name":"Michael Brown","displayName":"Michael","avatar":"https://ui-avatars.com/api/?name=Michael+Brown"},"value":"That sounds interesting! What kind of automation are you building?","createdAt":"2024-09-20T10:18:45.658Z"},{"user":{"name":"Jane Smith","avatar":"https://ui-avatars.com/api/?name=Jane+Smith"},"value":"Mostly automating form submissions and integrating them with our CRM. It's easy to drag-and-drop components.","createdAt":"2024-09-20T10:20:30.658Z"},{"user":{"name":"John Doe","avatar":"https://ui-avatars.com/api/?name=John+Doe"},"value":"We should look into using it for API integrations as well. Lowcode could save a lot of development time.","createdAt":"2024-09-20T10:22:05.658Z"},{"user":{"name":"Michael Brown","displayName":"Michael","avatar":"https://ui-avatars.com/api/?name=Michael+Brown"},"value":"I agree. Let’s plan a session next week to dive deeper into the possibilities.","createdAt":"2024-09-20T10:23:55.658Z"}]; export function convertCommentData(data: any) { return data === "" ? [] : checkDataNodes(data) ?? []; diff --git a/client/packages/lowcoder/src/comps/comps/fileViewerComp.tsx b/client/packages/lowcoder/src/comps/comps/fileViewerComp.tsx index cb0c689bc..4b53dea3a 100644 --- a/client/packages/lowcoder/src/comps/comps/fileViewerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/fileViewerComp.tsx @@ -6,11 +6,11 @@ import { DocumentViewer } from "react-documents"; import styled, { css } from "styled-components"; import { Section, sectionNames } from "lowcoder-design"; import { StringControl } from "../controls/codeControl"; -import { UICompBuilder } from "../generators"; +import { UICompBuilder, withDefault } from "../generators"; import { NameConfig, NameConfigHidden, withExposingConfigs } from "../generators/withExposing"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; - +import { AutoHeightControl, BoolControl } from "@lowcoder-ee/index.sdk"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; @@ -42,12 +42,18 @@ const StyledDiv = styled.div<{$style: FileViewerStyleType;}>` ${(props) => props.$style && getStyle(props.$style)} `; -const DraggableFileViewer = (props: { src: string; style: FileViewerStyleType,animationStyle:AnimationStyleType }) => { +const DraggableFileViewer = (props: { + src: string; + style: FileViewerStyleType, + animationStyle:AnimationStyleType, + showVerticalScrollbar: boolean, +}) => { const [isActive, setActive] = useState(false); return ( setActive(true)} onMouseLeave={(e) => setActive(false)} > @@ -67,6 +73,8 @@ const DraggableFileViewer = (props: { src: string; style: FileViewerStyleType,an let FileViewerBasicComp = (function () { const childrenMap = { src: StringControl, + autoHeight: withDefault(AutoHeightControl,'auto'), + showVerticalScrollbar: withDefault(BoolControl, false), style: styleControl(FileViewerStyle , 'style'), animationStyle: styleControl(AnimationStyle , 'animationStyle'), }; @@ -81,7 +89,12 @@ let FileViewerBasicComp = (function () { ); } - return ; + return ; }) .setPropertyViewFn((children) => { return ( @@ -100,6 +113,14 @@ let FileViewerBasicComp = (function () { {hiddenPropertyView(children)}
)} +
+ {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && ( + children.showVerticalScrollbar.propertyView({ + label: trans("prop.showVerticalScrollbar"), + }) + )} +
{["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <> @@ -119,7 +140,7 @@ let FileViewerBasicComp = (function () { FileViewerBasicComp = class extends FileViewerBasicComp { override autoHeight(): boolean { - return false; + return this.children.autoHeight.getView(); } }; diff --git a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx index a8ddfc99d..298d34970 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx @@ -14,15 +14,15 @@ import { i18nObjs, trans } from "i18n"; import type { JSONSchema7 } from "json-schema"; import styled from "styled-components"; import { toBoolean, toNumber, toString } from "util/convertUtils"; -import { Section, sectionNames } from "lowcoder-design"; +import { Section, sectionNames, ScrollBar } from "lowcoder-design"; import { jsonObjectControl } from "../../controls/codeControl"; import { eventHandlerControl, submitEvent } from "../../controls/eventHandlerControl"; -import { UICompBuilder } from "../../generators"; +import { UICompBuilder, withDefault } from "../../generators"; import DateWidget from "./dateWidget"; import ErrorBoundary from "./errorBoundary"; import { Theme } from "@rjsf/antd"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; - +import { AutoHeightControl } from "../../controls/autoHeightControl"; import { useContext, useEffect } from "react"; import { EditorContext } from "comps/editorState"; @@ -49,6 +49,11 @@ const Container = styled.div<{ font-size: 18px; } + .ant-row { + margin-left: 0 !important; + margin-right: 0 !important; + } + #root-description { font-size: 12px; display: inline-block; @@ -188,7 +193,9 @@ let FormBasicComp = (function () { const childrenMap = { resetAfterSubmit: BoolControl, schema: jsonObjectControl(i18nObjs.jsonForm.defaultSchema), + showVerticalScrollbar: withDefault(BoolControl, false), uiSchema: jsonObjectControl(i18nObjs.jsonForm.defaultUiSchema), + autoHeight: AutoHeightControl, data: jsonObjectExposingStateControl("data", i18nObjs.jsonForm.defaultFormData), onEvent: eventHandlerControl(EventOptions), style: styleControl(JsonSchemaFormStyle , 'style'), @@ -202,6 +209,15 @@ let FormBasicComp = (function () { return ( +
+ ); }) @@ -325,9 +342,16 @@ let FormBasicComp = (function () { })}
)} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( <> +
+ {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && ( + children.showVerticalScrollbar.propertyView({ + label: trans("prop.showVerticalScrollbar"), + }) + )} +
{children.style.getPropertyView()}
@@ -343,6 +367,13 @@ let FormBasicComp = (function () { .build(); })(); +FormBasicComp = class extends FormBasicComp { + override autoHeight(): boolean { + return this.children.autoHeight.getView(); + } +}; + + let FormTmpComp = withExposingConfigs(FormBasicComp, [ depsConfig({ name: "data", diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx index b501e3cab..105164b0d 100644 --- a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx @@ -39,7 +39,7 @@ const getStyle = (style: ContainerStyleType) => { `; }; -const Wrapper = styled.div<{ $style: ContainerStyleType,$animationStyle:AnimationStyleType }>` +const Wrapper = styled.div<{ $style: ContainerStyleType,$animationStyle:AnimationStyleType, $mainScrollbars: boolean }>` display: flex; flex-flow: column; height: 100%; @@ -47,6 +47,10 @@ const Wrapper = styled.div<{ $style: ContainerStyleType,$animationStyle:Animatio border-radius: 4px; ${(props) => props.$style && getStyle(props.$style)} ${props=>props.$animationStyle} + + #pageLayout::-webkit-scrollbar { + display: ${(props) => props.$mainScrollbars ? "block" : "none"}; + } `; const HeaderInnerGrid = styled(InnerGrid)<{ @@ -142,7 +146,7 @@ export function PageLayout(props: LayoutProps & { siderCollapsed: boolean; setSi } useEffect(() => {setSiderCollapsed(container.siderCollapsed)} , [container.siderCollapsed]); - + return (
- - + + {showSider && !container.innerSider && !container.siderRight && ( <> Promise; loadingElement?: () => React.ReactNode; errorElement?: (error: any) => React.ReactNode; + source?: RemoteCompSource; } const RemoteCompView = React.memo((props: React.PropsWithChildren) => { - const { loadComp, loadingElement, errorElement, isLowcoderComp } = props; + const { loadComp, loadingElement, errorElement, isLowcoderComp, source } = props; const [error, setError] = useState(""); const editorState = useContext(EditorContext); const compState = useContext(CompContext); const lowcoderCompPackageVersion = editorState?.getAppSettings().lowcoderCompVersion || 'latest'; + const latestLowcoderCompsVersion = useSelector((state: AppState) => state.npmPlugin.packageVersion['lowcoder-comps']); let packageVersion = 'latest'; // lowcoder-comps's package version - if (isLowcoderComp) { - packageVersion = lowcoderCompPackageVersion; + if (isLowcoderComp && source !== 'bundle') { + packageVersion = lowcoderCompPackageVersion === 'latest' && Boolean(latestLowcoderCompsVersion) + ? latestLowcoderCompsVersion + : lowcoderCompPackageVersion; } // component plugin's package version else if (compState.comp?.comp?.version) { @@ -155,6 +161,7 @@ export function remoteComp( isLowcoderComp={remoteInfo?.packageName === 'lowcoder-comps'} loadComp={(packageVersion?: string) => this.load(packageVersion)} loadingElement={loadingElement} + source={remoteInfo?.source} /> ); } diff --git a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx index d52054f17..c51ffb073 100644 --- a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx @@ -47,6 +47,7 @@ import SliderControl from "@lowcoder-ee/comps/controls/sliderControl"; const RowWrapper = styled(Row)<{ $style: ResponsiveLayoutRowStyleType; $animationStyle: AnimationStyleType; + $showScrollbar:boolean }>` ${(props) => props.$animationStyle} height: 100%; @@ -56,8 +57,12 @@ const RowWrapper = styled(Row)<{ border-style: ${(props) => props.$style?.borderStyle}; padding: ${(props) => props.$style.padding}; background-color: ${(props) => props.$style.background}; - overflow-x: auto; rotate: ${props=> props.$style.rotation} + overflow: ${(props) => (props.$showScrollbar ? 'auto' : 'hidden')}; + ::-webkit-scrollbar { + display: ${(props) => (props.$showScrollbar ? 'block' : 'none')}; + } + `; const ColWrapper = styled(Col)<{ @@ -95,6 +100,7 @@ const childrenMap = { matchColumnsHeight: withDefault(BoolControl, true), style: styleControl(ResponsiveLayoutRowStyle , 'style'), columnStyle: styleControl(ResponsiveLayoutColStyle , 'columnStyle'), + mainScrollbar: withDefault(BoolControl, false), animationStyle:styleControl(AnimationStyle , 'animationStyle'), columnPerRowLG: withDefault(NumberControl, 4), columnPerRowMD: withDefault(NumberControl, 2), @@ -138,6 +144,8 @@ const ResponsiveLayout = (props: ResponsiveLayoutProps) => { horizontalSpacing, animationStyle, horizontalGridCells, + mainScrollbar, + autoHeight } = props; return ( @@ -147,6 +155,7 @@ const ResponsiveLayout = (props: ResponsiveLayoutProps) => { @@ -214,6 +223,9 @@ export const ResponsiveLayoutBaseComp = (function () { <>
{children.autoHeight.getPropertyView()} + {(!children.autoHeight.getView()) && children.mainScrollbar.propertyView({ + label: trans("prop.mainScrollbar") + })} {children.horizontalGridCells.propertyView({ label: trans('prop.horizontalGridCells'), })} diff --git a/client/packages/lowcoder/src/comps/comps/richTextEditorComp.tsx b/client/packages/lowcoder/src/comps/comps/richTextEditorComp.tsx index b39c3879c..c0f25aad2 100644 --- a/client/packages/lowcoder/src/comps/comps/richTextEditorComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/richTextEditorComp.tsx @@ -79,9 +79,13 @@ const localizeStyle = css` } `; -const commonStyle = (style: RichTextEditorStyleType) => css` +const commonStyle = (style: RichTextEditorStyleType, contentScrollBar: boolean) => css` height: 100%; + .ql-editor::-webkit-scrollbar { + display: ${contentScrollBar ? "block" : "none"}; + } + & .ql-editor { min-height: 85px; } @@ -126,11 +130,12 @@ const hideToolbarStyle = (style: RichTextEditorStyleType) => css` interface Props { $hideToolbar: boolean; $style: RichTextEditorStyleType; + $contentScrollBar: boolean; } const AutoHeightReactQuill = styled.div` ${localizeStyle} - ${(props) => commonStyle(props.$style)} + ${(props) => commonStyle(props.$style, props.$contentScrollBar)} & .ql-container .ql-editor { min-height: 125px; } @@ -139,7 +144,7 @@ const AutoHeightReactQuill = styled.div` const FixHeightReactQuill = styled.div` ${localizeStyle} - ${(props) => commonStyle(props.$style)} + ${(props) => commonStyle(props.$style, props.$contentScrollBar)} & .quill { display: flex; flex-direction: column; @@ -169,6 +174,7 @@ const childrenMap = { hideToolbar: BoolControl, readOnly: BoolControl, autoHeight: withDefault(AutoHeightControl, "fixed"), + contentScrollBar: withDefault(BoolControl, false), placeholder: withDefault(StringControl, trans("richTextEditor.placeholder")), toolbar: withDefault(StringControl, JSON.stringify(toolbarOptions)), onEvent: ChangeEventHandlerControl, @@ -188,6 +194,7 @@ interface IProps { autoHeight: boolean; onChange: (value: string) => void; $style: RichTextEditorStyleType; + contentScrollBar: boolean; } const ReactQuillEditor = React.lazy(() => import("react-quill")); @@ -264,6 +271,7 @@ function RichTextEditor(props: IProps) { ref={wrapperRef} $hideToolbar={props.hideToolbar} $style={props.$style} + $contentScrollBar={props.contentScrollBar} > }> { placeholder={props.placeholder} onChange={handleChange} $style={props.style} + contentScrollBar={props.contentScrollBar} /> ); }) @@ -325,6 +334,9 @@ const RichTextEditorCompBase = new UICompBuilder(childrenMap, (props) => { <>
{children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && children.contentScrollBar.propertyView({ + label: trans("prop.textAreaScrollBar"), + })} {children.toolbar.propertyView({ label: trans("richTextEditor.toolbar"), tooltip: trans("richTextEditor.toolbarDescription") })} {children.hideToolbar.propertyView({ label: trans("richTextEditor.hideToolbar") })}
diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx index f06e5a231..572ba4a60 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx @@ -1,5 +1,5 @@ import { ConfigProvider, Steps} from "antd"; -import { BoolCodeControl } from "comps/controls/codeControl"; +import { BoolCodeControl, RadiusControl } from "comps/controls/codeControl"; import { BoolControl } from "comps/controls/boolControl"; import { stringExposingStateControl, numberExposingStateControl } from "comps/controls/codeStateControl"; import { ChangeEventHandlerControl } from "comps/controls/eventHandlerControl"; @@ -10,7 +10,7 @@ import styled, { css } from "styled-components"; import { UICompBuilder, withDefault } from "../../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; import { selectDivRefMethods, } from "./selectInputConstants"; -import { Section, sectionNames } from "lowcoder-design"; +import { ScrollBar, Section, sectionNames } from "lowcoder-design"; import { hiddenPropertyView, disabledPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { hasIcon } from "comps/utils"; @@ -18,6 +18,7 @@ import { RefControl } from "comps/controls/refControl"; import { dropdownControl } from "comps/controls/dropdownControl"; import { useContext, useState, useEffect } from "react"; import { EditorContext } from "comps/editorState"; +import { AutoHeightControl } from "@lowcoder-ee/index.sdk"; const sizeOptions = [ { @@ -76,6 +77,7 @@ const statusOptions = [ ] const StepsChildrenMap = { + autoHeight: AutoHeightControl, initialValue: numberExposingStateControl("1"), value: stringExposingStateControl("value"), stepStatus : stringExposingStateControl("process"), @@ -92,13 +94,17 @@ const StepsChildrenMap = { options: StepOptionControl, style: styleControl(StepsStyle , 'style'), viewRef: RefControl, - animationStyle: styleControl(AnimationStyle ,'animationStyle' ) + animationStyle: styleControl(AnimationStyle ,'animationStyle' ), + showVerticalScrollbar: withDefault(BoolControl, false), + minHorizontalWidth: withDefault(RadiusControl, ''), }; let StepControlBasicComp = (function () { return new UICompBuilder(StepsChildrenMap, (props) => { const StyledWrapper = styled.div<{ style: StepsStyleType, $animationStyle: AnimationStyleType }>` ${props=>props.$animationStyle} + height: 100%; + overflow-y: scroll; min-height: 24px; max-width: ${widthCalculator(props.style.margin)}; max-height: ${heightCalculator(props.style.margin)}; @@ -168,6 +174,15 @@ let StepControlBasicComp = (function () { }} > + ))} + ); @@ -217,6 +233,16 @@ let StepControlBasicComp = (function () { {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (
+ {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && ( + children.showVerticalScrollbar.propertyView({ + label: trans("prop.showVerticalScrollbar"), + }) + )} + {children.minHorizontalWidth.propertyView({ + label: trans("prop.minHorizontalWidth"), + placeholder: '100px', + })} {children.size.propertyView({ label: trans("step.size"), radioButton: true, @@ -241,6 +267,9 @@ let StepControlBasicComp = (function () { { children.displayType.getView() != "inline" && !children.showDots.getView() && ( children.showIcons.propertyView({label: trans("step.showIcons")} ))} + {!children.autoHeight.getView() && ( + children.showVerticalScrollbar.propertyView({label: trans("prop.showVerticalScrollbar")}) + )}
)} @@ -260,6 +289,12 @@ let StepControlBasicComp = (function () { .build(); })(); +StepControlBasicComp = class extends StepControlBasicComp { + override autoHeight(): boolean { + return this.children.autoHeight.getView(); + } +}; + export const StepComp = withExposingConfigs(StepControlBasicComp, [ new NameConfig("value", trans("step.valueDesc")), new NameConfig("stepStatus", trans("step.status") ), diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx index 0e1e89d56..e6182a269 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx @@ -465,8 +465,8 @@ export function genSelectionParams( filterData: RecordType[], selection: string ): Record | undefined { - const idx = filterData.findIndex((row) => row[OB_ROW_ORI_INDEX] === selection); - if (idx < 0) { + const idx = filterData?.findIndex((row) => row[OB_ROW_ORI_INDEX] === selection); + if (!Boolean(filterData) || idx < 0) { return undefined; } const currentRow = filterData[idx]; diff --git a/client/packages/lowcoder/src/comps/comps/textComp.tsx b/client/packages/lowcoder/src/comps/comps/textComp.tsx index ec3acbd9c..e8a695164 100644 --- a/client/packages/lowcoder/src/comps/comps/textComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textComp.tsx @@ -1,7 +1,7 @@ import { dropdownControl } from "comps/controls/dropdownControl"; import { stringExposingStateControl } from "comps/controls/codeStateControl"; import { AutoHeightControl } from "comps/controls/autoHeightControl"; -import { Section, sectionNames } from "lowcoder-design"; +import { ScrollBar, Section, sectionNames } from "lowcoder-design"; import styled, { css } from "styled-components"; import { AlignCenter } from "lowcoder-design"; import { AlignLeft } from "lowcoder-design"; @@ -24,6 +24,7 @@ import { clickEvent, eventHandlerControl } from "../controls/eventHandlerControl import { NewChildren } from "../generators/uiCompBuilder"; import { RecordConstructorToComp } from "lowcoder-core"; import { ToViewReturn } from "../generators/multi"; +import { BoolControl } from "@lowcoder-ee/index.sdk"; const EventOptions = [clickEvent] as const; @@ -142,6 +143,7 @@ const childrenMap = { autoHeight: AutoHeightControl, type: dropdownControl(typeOptions, "markdown"), horizontalAlignment: alignWithJustifyControl(), + contentScrollBar: withDefault(BoolControl, true), verticalAlignment: dropdownControl(VerticalAlignmentOptions, "center"), style: styleControl(TextStyle, 'style'), animationStyle: styleControl(AnimationStyle, 'animationStyle'), @@ -176,6 +178,10 @@ const TextPropertyView = React.memo((props: { <>
{props.children.autoHeight.getPropertyView()} + {!props.children.autoHeight.getView() && + props.children.contentScrollBar.propertyView({ + label: trans("prop.contentScrollbar"), + })} {!props.children.autoHeight.getView() && props.children.verticalAlignment.propertyView({ label: trans("textShow.verticalAlignment"), @@ -214,7 +220,9 @@ const TextView = React.memo((props: ToViewReturn) => { }} onClick={() => props.onEvent("click")} > - {props.type === "markdown" ? {value} : value} + + {props.type === "markdown" ? {value} : value} + ); }, (prev, next) => JSON.stringify(prev) === JSON.stringify(next)); diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx index 83d4fdf8f..da307ce76 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx @@ -98,10 +98,7 @@ let MentionTmpComp = (function () { autoHeight: AutoHeightControl, style: styleControl(InputLikeStyle , 'style'), animationStyle: styleControl(AnimationStyle , 'animationStyle'), - mentionList: jsonControl(checkMentionListData, { - "@": ["Li Lei", "Han Meimei"], - "#": ["123", "456", "789"], - }), + mentionList: jsonControl(checkMentionListData, {"@":["John Doe","Jane Doe","Michael Smith","Emily Davis","Robert Johnson","Patricia Brown","William Jones","Jennifer Miller","David Wilson","Linda Moore"],"#":["#lowcode","#automation","#appbuilder","#nocode","#workflow","#draganddrop","#rapiddevelopment","#digitaltransformation","#integration","#api"]}), onEvent: eventHandlerControl(EventOptions), invalid: booleanExposingStateControl("invalid"), }; diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx index 4b34ba614..2a559dee3 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx @@ -75,6 +75,7 @@ let TextAreaTmpComp = (function () { autoHeight: withDefault(AutoHeightControl, "fixed"), style: styleControl(InputFieldStyle, 'style') , labelStyle: styleControl(LabelStyle ,'labelStyle' ), + textAreaScrollBar: withDefault(BoolControl, false), inputFieldStyle: styleControl(InputLikeStyle , 'inputFieldStyle'), animationStyle: styleControl(AnimationStyle, 'animationStyle') }; @@ -114,6 +115,10 @@ let TextAreaTmpComp = (function () { <>
{children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && + children.textAreaScrollBar.propertyView({ + label: trans("prop.textAreaScrollBar"), + })} {hiddenPropertyView(children)}
diff --git a/client/packages/lowcoder/src/comps/comps/timelineComp/timelineComp.tsx b/client/packages/lowcoder/src/comps/comps/timelineComp/timelineComp.tsx index f7c877c90..5854058af 100644 --- a/client/packages/lowcoder/src/comps/comps/timelineComp/timelineComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/timelineComp/timelineComp.tsx @@ -8,7 +8,7 @@ import { } from "lowcoder-core"; import { trans } from "i18n"; import { UICompBuilder, withDefault } from "../../generators"; -import { Section, sectionNames } from "lowcoder-design"; +import { ScrollBar, Section, sectionNames } from "lowcoder-design"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { BoolControl } from "comps/controls/boolControl"; import { stringExposingStateControl } from "comps/controls/codeStateControl"; @@ -62,6 +62,8 @@ const childrenMap = { value: jsonControl(convertTimeLineData, timelineDate), mode: dropdownControl(modeOptions, "alternate"), reverse: BoolControl, + autoHeight: AutoHeightControl, + verticalScrollbar: withDefault(BoolControl, false), pending: withDefault(StringControl, trans("timeLine.defaultPending")), onEvent: eventHandlerControl(EventOptions), style: styleControl(TimeLineStyle, 'style'), @@ -136,31 +138,33 @@ const TimelineComp = ( })); return ( -
- - {props?.pending || ""} - - ) - } - items={timelineItems} - /> -
+ +
+ + {props?.pending || ""} + + ) + } + items={timelineItems} + /> +
+
); }; @@ -187,6 +191,11 @@ let TimeLineBasicComp = (function () { {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <>
+ {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && + children.verticalScrollbar.propertyView({ + label: trans("prop.showVerticalScrollbar") + })} {children.mode.propertyView({ label: trans("timeLine.mode"), tooltip: trans("timeLine.modeTooltip"), @@ -211,7 +220,7 @@ let TimeLineBasicComp = (function () { TimeLineBasicComp = class extends TimeLineBasicComp { override autoHeight(): boolean { - return false; + return this.children.autoHeight.getView(); } }; diff --git a/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx b/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx index b6ebf264c..aa117ff5c 100644 --- a/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx @@ -1,11 +1,10 @@ import { RecordConstructorToView } from "lowcoder-core"; import { UICompBuilder } from "comps/generators/uiCompBuilder"; import { withExposingConfigs } from "comps/generators/withExposing"; -import { Section, sectionNames } from "lowcoder-design"; +import { ScrollBar, Section, sectionNames } from "lowcoder-design"; import { default as Tree } from "antd/es/tree"; import { useEffect, useState } from "react"; import styled from "styled-components"; -import ReactResizeDetector from "react-resize-detector"; import { StyleConfigType, styleControl } from "comps/controls/styleControl"; import { InputFieldStyle, LabelStyle, TreeStyle } from "comps/controls/styleControlConstants"; import { LabelControl } from "comps/controls/labelControl"; @@ -13,8 +12,6 @@ import { withDefault } from "comps/generators"; import { dropdownControl } from "comps/controls/dropdownControl"; import { BoolControl } from "comps/controls/boolControl"; import { - advancedSection, - expandSection, formSection, // intersectSection, treeCommonChildren, @@ -24,8 +21,6 @@ import { valuePropertyView, } from "./treeUtils"; import { - SelectInputInvalidConfig, - SelectInputValidationChildren, SelectInputValidationSection, } from "../selectInputComp/selectInputConstants"; import { selectInputValidate } from "../selectInputComp/selectInputConstants"; @@ -33,10 +28,11 @@ import { SelectEventHandlerControl } from "comps/controls/eventHandlerControl"; import { trans } from "i18n"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; +import { AutoHeightControl } from "@lowcoder-ee/index.sdk"; type TreeStyleType = StyleConfigType; -const Container = styled.div` +const Container = styled.div` height: 100%; padding: 4px; background: ${(props) => props.background}; @@ -45,18 +41,8 @@ const Container = styled.div` .ant-tree-show-line .ant-tree-switcher { background: ${(props) => props.background}; } - .ant-tree:hover .ant-tree-list-scrollbar-show { - display: block !important; - } - .ant-tree-list-scrollbar { - width: 6px !important; - } - .ant-tree-list-scrollbar-thumb { - border-radius: 9999px !important; - background: rgba(139, 143, 163, 0.2) !important; - } - .ant-tree-list-scrollbar-thumb:hover { - background: rgba(139, 143, 163, 0.5) !important; + .simplebar-vertical { + display: ${(props) => props.verticalScrollbar ? 'block' : 'none'}; } `; @@ -74,6 +60,8 @@ const childrenMap = { checkStrictly: BoolControl, autoExpandParent: BoolControl, label: withDefault(LabelControl, { position: "column" }), + autoHeight: AutoHeightControl, + verticalScrollbar: withDefault(BoolControl, false), // TODO: more event onEvent: SelectEventHandlerControl, style: styleControl(InputFieldStyle , 'style'), @@ -101,50 +89,46 @@ const TreeCompView = (props: RecordConstructorToView) => { labelStyle, inputFieldStyle:props.inputFieldStyle, children: ( - setHeight(h)} - render={() => ( - - { - value.onChange(keys as (string | number)[]); - props.onEvent("change"); - }} - onCheck={(keys) => { - value.onChange(Array.isArray(keys) ? keys as (string | number)[] : keys.checked as (string | number)[]); - props.onEvent("change"); - }} - onExpand={(keys) => { - expanded.onChange(keys as (string | number)[]); - }} - onFocus={() => props.onEvent("focus")} - onBlur={() => props.onEvent("blur")} - /> - - )} - > - + + + { + value.onChange(keys as (string | number)[]); + props.onEvent("change"); + }} + onCheck={(keys) => { + value.onChange(Array.isArray(keys) ? keys as (string | number)[] : keys.checked as (string | number)[]); + props.onEvent("change"); + }} + onExpand={(keys) => { + expanded.onChange(keys as (string | number)[]); + }} + onFocus={() => props.onEvent("focus")} + onBlur={() => props.onEvent("blur")} + /> + + ), }); }; @@ -179,6 +163,11 @@ let TreeBasicComp = (function () { {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (
+ {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && + children.verticalScrollbar.propertyView({ + label: trans("prop.showVerticalScrollbar") + })} {children.expanded.propertyView({ label: trans("tree.expanded") })} {children.defaultExpandAll.propertyView({ label: trans("tree.defaultExpandAll") })} {children.showLine.propertyView({ label: trans("tree.showLine") })} @@ -202,7 +191,7 @@ let TreeBasicComp = (function () { TreeBasicComp = class extends TreeBasicComp { override autoHeight(): boolean { - return false; + return this.children.autoHeight.getView(); } }; diff --git a/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx b/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx index 096757b34..ee1fa3248 100644 --- a/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx +++ b/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx @@ -7,7 +7,7 @@ import { } from "comps/controls/styleControlConstants"; import { EditorContext } from "comps/editorState"; import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; -import { HintPlaceHolder, TacoMarkDown } from "lowcoder-design"; +import { HintPlaceHolder, ScrollBar, TacoMarkDown } from "lowcoder-design"; import { ReactNode, useContext } from "react"; import styled, { css } from "styled-components"; import { checkIsMobile } from "util/commonUtils"; @@ -76,6 +76,7 @@ ${props=>props.$animationStyle&&props.$animationStyle} display: flex; flex-flow: column; height: 100%; + overflow-y: scroll; border: ${(props) => props.$style.borderWidth} ${(props) => (props.$style.borderStyle ? props.$style.borderStyle : "solid")} ${(props) => props.$style.border}; border-radius: ${(props) => props.$style.radius}; background-color: ${(props) => props.$style.background}; @@ -194,45 +195,42 @@ export function TriContainer(props: TriContainerProps) { )} {showBody && ( -
- - -

- {props.type === "markdown" ? ( - {text.value} - ) : ( - text.value - )} -

-
-
+ +
+ + +

+ {props.type === "markdown" ? ( + {text.value} + ) : ( + text.value + )} +

+
+
+
)} {showFooter && ( diff --git a/client/packages/lowcoder/src/comps/generators/withSelectedMultiContext.tsx b/client/packages/lowcoder/src/comps/generators/withSelectedMultiContext.tsx index 2743ae166..68b41a59b 100644 --- a/client/packages/lowcoder/src/comps/generators/withSelectedMultiContext.tsx +++ b/client/packages/lowcoder/src/comps/generators/withSelectedMultiContext.tsx @@ -87,10 +87,6 @@ export function withSelectedMultiContext( || isCustomAction(action, "LazyCompReady") || isCustomAction(action, "moduleReady") ) && action.path[1] === SELECTED_KEY) { - if (action.path[0] === MAP_KEY && action.path[1] === SELECTED_KEY) { - action.path[1] = this.selection; - comp = super.reduce(action); - } // broadcast const newAction = { ...action, diff --git a/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx b/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx index 8270d23e7..43fa3e5b7 100644 --- a/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx @@ -41,11 +41,14 @@ const DrawerWrapper = styled.div` } `; -const StyledDrawer = styled(Drawer)<{$titleAlign?: string}>` +const StyledDrawer = styled(Drawer)<{$titleAlign?: string, $drawerScrollbar: boolean}>` .ant-drawer-header-title { margin: 0px 20px !important; text-align: ${(props) => props.$titleAlign || "center"}; } + div.ant-drawer-body div.react-grid-layout::-webkit-scrollbar { + display: ${(props) => props.$drawerScrollbar ? "block" : "none"}; + } `; const ButtonStyle = styled(Button)<{$closePosition?: string, $title? :string}>` @@ -93,6 +96,7 @@ let TmpDrawerComp = (function () { titleAlign: HorizontalAlignmentControl, horizontalGridCells: SliderControl, autoHeight: AutoHeightControl, + drawerScrollbar: withDefault(BoolControl, true), style: styleControl(DrawerStyle), placement: PositionControl, closePosition: withDefault(LeftRightControl, "left"), @@ -137,6 +141,7 @@ let TmpDrawerComp = (function () { }} title={props.title} $titleAlign={props.titleAlign} + $drawerScrollbar={props.drawerScrollbar} closable={false} placement={props.placement} open={props.visible.value} @@ -209,6 +214,7 @@ let TmpDrawerComp = (function () { {children.horizontalGridCells.propertyView({ label: trans('prop.horizontalGridCells'), })} + {children.drawerScrollbar.propertyView({ label: trans("prop.drawerScrollbar") })} {children.maskClosable.propertyView({ label: trans("prop.maskClosable"), })} diff --git a/client/packages/lowcoder/src/comps/hooks/modalComp.tsx b/client/packages/lowcoder/src/comps/hooks/modalComp.tsx index 0d7ea6be8..ed2710ed5 100644 --- a/client/packages/lowcoder/src/comps/hooks/modalComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/modalComp.tsx @@ -29,7 +29,7 @@ const EventOptions = [ { label: trans("modalComp.close"), value: "close", description: trans("modalComp.closeDesc") }, ] as const; -const getStyle = (style: ModalStyleType) => { +const getStyle = (style: ModalStyleType, modalScrollbar: boolean) => { return css` .ant-modal-content { border-radius: ${style.radius}; @@ -49,6 +49,9 @@ const getStyle = (style: ModalStyleType) => { background-color: ${style.background}; } } + div.ant-modal-body div.react-grid-layout::-webkit-scrollbar { + display: ${modalScrollbar ? "block" : "none"}; + } .ant-modal-close { inset-inline-end: 10px !important; top: 10px; @@ -80,8 +83,8 @@ function extractMarginValues(style: ModalStyleType) { return valuesarray; } -const ModalStyled = styled.div<{ $style: ModalStyleType }>` - ${(props) => props.$style && getStyle(props.$style)} +const ModalStyled = styled.div<{ $style: ModalStyleType, $modalScrollbar: boolean }>` + ${(props) => props.$style && getStyle(props.$style, props.$modalScrollbar)} `; const ModalWrapper = styled.div` @@ -105,6 +108,7 @@ let TmpModalComp = (function () { autoHeight: AutoHeightControl, title: StringControl, titleAlign: HorizontalAlignmentControl, + modalScrollbar: withDefault(BoolControl, false), style: styleControl(ModalStyle), maskClosable: withDefault(BoolControl, true), showMask: withDefault(BoolControl, true), @@ -174,7 +178,7 @@ let TmpModalComp = (function () { if (open) props.onEvent("open"); }} zIndex={Layers.modal} - modalRender={(node) => {node}} + modalRender={(node) => {node}} mask={props.showMask} className={props.className as string} data-testid={props.dataTestId as string} @@ -203,6 +207,10 @@ let TmpModalComp = (function () { label: trans('prop.horizontalGridCells'), })} {children.autoHeight.getPropertyView()} + {!children.autoHeight.getView() && + children.modalScrollbar.propertyView({ + label: trans("prop.modalScrollbar") + })} {!children.autoHeight.getView() && children.height.propertyView({ label: trans("modalComp.modalHeight"), diff --git a/client/packages/lowcoder/src/comps/utils/themeUtil.ts b/client/packages/lowcoder/src/comps/utils/themeUtil.ts index f5e574bab..b3fc1d52b 100644 --- a/client/packages/lowcoder/src/comps/utils/themeUtil.ts +++ b/client/packages/lowcoder/src/comps/utils/themeUtil.ts @@ -41,7 +41,7 @@ export function setInitialCompStyles({ styleKeys.forEach(styleKey => { actions[styleKey] = changeValueAction({ ...(compTheme?.[styleKey] as object || {}), - ...styleProps[styleKey], + // ...styleProps[styleKey], }, true); }) diff --git a/client/packages/lowcoder/src/constants/orgConstants.ts b/client/packages/lowcoder/src/constants/orgConstants.ts index 8c4d0da57..a79608b92 100644 --- a/client/packages/lowcoder/src/constants/orgConstants.ts +++ b/client/packages/lowcoder/src/constants/orgConstants.ts @@ -1,21 +1,24 @@ import { CommonSettingResponseData } from "api/commonSettingApi"; import { trans } from "i18n"; -export const ADMIN_ROLE = "admin" || "super_admin"; +export const ADMIN_ROLE = "admin"; +export const SUPER_ADMIN_ROLE = "super_admin"; export const MEMBER_ROLE = "member"; export const NEW_ORG_PREFIX = trans("orgSettings.newOrg"); export const TacoRoles = [ADMIN_ROLE, MEMBER_ROLE] as const; -export type RoleIdType = typeof TacoRoles[number]; +export type RoleIdType = typeof TacoRoles[number] | "super_admin"; type RoleInfoType = Record; export const GroupRoleInfo: RoleInfoType = { + super_admin: { name: trans("memberSettings.superAdmin"), desc: trans("memberSettings.adminGroupRoleInfo") }, admin: { name: trans("memberSettings.admin"), desc: trans("memberSettings.adminGroupRoleInfo") }, member: { name: trans("memberSettings.member"), desc: trans("memberSettings.memberGroupRoleInfo"), }, }; export const OrgRoleInfo: RoleInfoType = { + super_admin: { name: trans("memberSettings.superAdmin"), desc: trans("memberSettings.adminGroupRoleInfo") }, admin: { name: trans("memberSettings.admin"), desc: trans("memberSettings.adminOrgRoleInfo") }, member: { name: trans("memberSettings.member"), desc: trans("memberSettings.memberOrgRoleInfo") }, }; diff --git a/client/packages/lowcoder/src/constants/reduxActionConstants.ts b/client/packages/lowcoder/src/constants/reduxActionConstants.ts index 66178633c..316103c3d 100644 --- a/client/packages/lowcoder/src/constants/reduxActionConstants.ts +++ b/client/packages/lowcoder/src/constants/reduxActionConstants.ts @@ -185,6 +185,7 @@ export const ReduxActionTypes = { /* npm plugin */ PACKAGE_META_READY: "PACKAGE_META_READY", SELECT_PACKAGE_VERSION: "SELECT_PACKAGE_VERSION", + LOWCODER_COMPS_LOADING: "LOWCODER_COMPS_LOADING", /* js library */ FETCH_JS_LIB_METAS: "FETCH_JS_LIB_METAS", diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index 4cb2afd30..c8aa8a3bd 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -2270,6 +2270,7 @@ export const de = { ...en.memberSettings, "admin": "Verwaltung", + "superAdmin": "Super Admin", "adminGroupRoleInfo": "Admin kann Gruppenmitglieder und Ressourcen verwalten", "adminOrgRoleInfo": "Admins besitzen alle Ressourcen und können Gruppen verwalten.", "member": "Mitglied", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 533ad2089..108d3f8d4 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -203,6 +203,10 @@ export const en = { "showVerticalScrollbar" : "Show Vertical Scrollbar", "showHorizontalScrollbar" : "Show Horizontal Scrollbar", "siderScrollbar" : "Show Scrollbars in Sider", + "mainScrollbar": "Show Scrollbars in main content", + "modalScrollbar": "Show Scrollbars in Modal", + "drawerScrollbar": "Show Scrollbars in Drawer", + "textAreaScrollBar": "Show Scrollbars in Text Area", "siderRight" : "Show sider on the Right", "siderWidth" : "Sider Width", "siderWidthTooltip" : "Sider width supports percentages (%) and pixels (px).", @@ -2259,6 +2263,7 @@ export const en = { "memberSettings": { "admin": "Admin", + "superAdmin": "Super Admin", "adminGroupRoleInfo": "Admin Can Manage Group Members and Resources", "adminOrgRoleInfo": "Admins Own All Resources and Can Manage Groups.", "member": "Member", diff --git a/client/packages/lowcoder/src/i18n/locales/es.ts b/client/packages/lowcoder/src/i18n/locales/es.ts index eb95a9252..cc34f4b10 100644 --- a/client/packages/lowcoder/src/i18n/locales/es.ts +++ b/client/packages/lowcoder/src/i18n/locales/es.ts @@ -2270,6 +2270,7 @@ export const es = { ...en.memberSettings, "admin": "Admin", + "superAdmin": "Súper administrador", "adminGroupRoleInfo": "El administrador puede gestionar los miembros y recursos del grupo", "adminOrgRoleInfo": "Los administradores son propietarios de todos los recursos y pueden gestionar grupos.", "member": "Miembro", diff --git a/client/packages/lowcoder/src/i18n/locales/it.ts b/client/packages/lowcoder/src/i18n/locales/it.ts index b707dd66f..0701a2c36 100644 --- a/client/packages/lowcoder/src/i18n/locales/it.ts +++ b/client/packages/lowcoder/src/i18n/locales/it.ts @@ -2270,6 +2270,7 @@ export const it = { ...en.memberSettings, "admin": "Admin", + "superAdmin": "Super amministratore", "adminGroupRoleInfo": "L'amministratore può gestire i membri e le risorse del gruppo", "adminOrgRoleInfo": "Gli amministratori possiedono tutte le risorse e possono gestire i gruppi.", "member": "Membro", diff --git a/client/packages/lowcoder/src/i18n/locales/pt.ts b/client/packages/lowcoder/src/i18n/locales/pt.ts index f13bf1341..44952a10a 100644 --- a/client/packages/lowcoder/src/i18n/locales/pt.ts +++ b/client/packages/lowcoder/src/i18n/locales/pt.ts @@ -2270,6 +2270,7 @@ export const pt = { ...en.memberSettings, "admin": "Administrador", + "superAdmin": "Superadministrador", "adminGroupRoleInfo": "O administrador pode gerenciar membros do grupo e recursos", "adminOrgRoleInfo": "Os administradores possuem todos os recursos e podem gerenciar grupos.", "member": "Membro", diff --git a/client/packages/lowcoder/src/i18n/locales/ru.ts b/client/packages/lowcoder/src/i18n/locales/ru.ts index 937e84e04..fb93fb140 100644 --- a/client/packages/lowcoder/src/i18n/locales/ru.ts +++ b/client/packages/lowcoder/src/i18n/locales/ru.ts @@ -2270,6 +2270,7 @@ export const ru = { ...en.memberSettings, "admin": "Администратор", + "superAdmin": "Суперадминистратор", "adminGroupRoleInfo": "Администратор может управлять членами группы и ресурсами", "adminOrgRoleInfo": "Администраторы владеют всеми ресурсами и могут управлять группами.", "member": "Член", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 2f8ee9944..69c2808fd 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1738,6 +1738,7 @@ export const zh: typeof en = { memberSettings: { ...en.memberSettings, admin: "管理员", + superAdmin: "超级管理员", adminGroupRoleInfo: "管理员可以管理群组成员和资源", adminOrgRoleInfo: "拥有所有资源并可以管理群组.", member: "成员", diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx index fd5c2df16..e69792bbd 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx @@ -307,8 +307,6 @@ export function HomeLayout(props: HomeLayoutProps) { const { breadcrumb = [], elements = [], localMarketplaceApps = [], globalMarketplaceApps = [], mode } = props; - console.log("HomeLayout props: ", props); - const categoryOptions = [ { label: {trans("home.allCategories")}, value: 'All' }, ...Object.entries(ApplicationCategoriesEnum).map(([key, value]) => ({ diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx index 26853306e..49031cf7c 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx @@ -35,7 +35,7 @@ import { EnterpriseIcon, UserIcon, } from "lowcoder-design"; -import React, { useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { fetchAllApplications, fetchHomeData } from "redux/reduxActions/applicationActions"; import { fetchSubscriptionsAction } from "redux/reduxActions/subscriptionActions"; import { getHomeOrg, normalAppListSelector } from "redux/selectors/applicationSelector"; diff --git a/client/packages/lowcoder/src/pages/editor/AppEditor.tsx b/client/packages/lowcoder/src/pages/editor/AppEditor.tsx index 75c2f8b73..f73d3f511 100644 --- a/client/packages/lowcoder/src/pages/editor/AppEditor.tsx +++ b/client/packages/lowcoder/src/pages/editor/AppEditor.tsx @@ -35,6 +35,7 @@ import React from "react"; import dayjs from "dayjs"; import { currentApplication } from "@lowcoder-ee/redux/selectors/applicationSelector"; import { notificationInstance } from "components/GlobalInstances"; +import { AppState } from "@lowcoder-ee/redux/reducers"; const AppSnapshot = lazy(() => { return import("pages/editor/appSnapshot") @@ -55,6 +56,7 @@ const AppEditor = React.memo(() => { const fetchOrgGroupsFinished = useSelector(getFetchOrgGroupsFinished); const isCommonSettingsFetching = useSelector(getIsCommonSettingFetching); const application = useSelector(currentApplication); + const isLowcoderCompLoading = useSelector((state: AppState) => state.npmPlugin.loading.lowcoderComps); const isUserViewMode = useMemo( () => params.viewMode ? isUserViewModeCheck : true, @@ -184,8 +186,10 @@ const AppEditor = React.memo(() => { }, [viewMode, applicationId, dispatch, fetchJSDataSourceByApp]); useEffect(() => { - fetchApplication(); - }, [fetchApplication]); + if(!isLowcoderCompLoading) { + fetchApplication(); + } + }, [isLowcoderCompLoading, fetchApplication]); const fallbackUI = useMemo(() => ( user.orgRoleMap.get(org.id) === ADMIN_ROLE); + const adminOrgs = orgs.filter((org) => { + const role = user.orgRoleMap.get(org.id); + return role === ADMIN_ROLE || role === SUPER_ADMIN_ROLE; + }); const orgCreateStatus = useSelector(getOrgCreateStatus); const dispatch = useDispatch(); const sysConfig = useSelector(selectSystemConfig); diff --git a/client/packages/lowcoder/src/pages/setting/permission/groupUsersPermission.tsx b/client/packages/lowcoder/src/pages/setting/permission/groupUsersPermission.tsx index 4bf28dde5..c0f7c79d8 100644 --- a/client/packages/lowcoder/src/pages/setting/permission/groupUsersPermission.tsx +++ b/client/packages/lowcoder/src/pages/setting/permission/groupUsersPermission.tsx @@ -128,7 +128,7 @@ function GroupUsersPermission(props: GroupPermissionProp) { key="role" render={(value, record: GroupUser) => ( user.role === ADMIN_ROLE).length; + const adminCount = orgUsers.filter( + (user) => user.role === ADMIN_ROLE || user.role === SUPER_ADMIN_ROLE, + ).length; const sysConfig = useSelector(selectSystemConfig); const dispatch = useDispatch(); const sortedOrgUsers = useMemo(() => { return [...orgUsers].sort((a, b) => { - if (a.role === ADMIN_ROLE) { + if (a.role === ADMIN_ROLE || a.role === SUPER_ADMIN_ROLE) { return -1; - } else if (b.role === ADMIN_ROLE) { + } else if (b.role === ADMIN_ROLE || a.role === SUPER_ADMIN_ROLE) { return 1; } else { return b.joinTime - a.joinTime; @@ -178,7 +180,7 @@ function OrgUsersPermission(props: UsersPermissionProp) { className="role-table-cell" render={(value, record: OrgUser) => ( ; packageVersion: Record; + loading: { + lowcoderComps: boolean, + }, } const initialState: NPMPluginState = { packageMeta: {}, packageVersion: {}, + loading: { + lowcoderComps: false, + } }; const npmPluginReducer = createReducer(initialState, { @@ -45,7 +51,6 @@ const npmPluginReducer = createReducer(initialState, { } selectVersions[i] = defaultVersion; }); - return { ...state, packageMeta: { @@ -58,6 +63,17 @@ const npmPluginReducer = createReducer(initialState, { }, }; }, + [ReduxActionTypes.LOWCODER_COMPS_LOADING]: ( + state: NPMPluginState, + action: ReduxAction<{loading: boolean}> + ): NPMPluginState => { + return { + ...state, + loading: { + lowcoderComps: action.payload.loading, + }, + }; + }, }); export default npmPluginReducer; diff --git a/client/packages/lowcoder/src/redux/reduxActions/npmPluginActions.ts b/client/packages/lowcoder/src/redux/reduxActions/npmPluginActions.ts index a84c58a4a..413ced4e4 100644 --- a/client/packages/lowcoder/src/redux/reduxActions/npmPluginActions.ts +++ b/client/packages/lowcoder/src/redux/reduxActions/npmPluginActions.ts @@ -14,3 +14,10 @@ export const selectNpmPluginVersionAction = (packageName: string, version: strin [packageName]: version, }, }); + +export const setLowcoderCompsLoading = (loading: boolean) => ({ + type: ReduxActionTypes.LOWCODER_COMPS_LOADING, + payload: { + loading, + }, +}); diff --git a/client/packages/lowcoder/src/util/hooks.ts b/client/packages/lowcoder/src/util/hooks.ts index 1a265320f..76065e5fa 100644 --- a/client/packages/lowcoder/src/util/hooks.ts +++ b/client/packages/lowcoder/src/util/hooks.ts @@ -172,10 +172,14 @@ export function useMergeCompStyles( props: Record, dispatch: (action: CompAction) => void ) { + const editorState = useContext(EditorContext); const theme = useContext(ThemeContext); const compType = useContext(CompTypeContext); const compTheme = theme?.theme?.components?.[compType]; const themeId = theme?.themeId; + const appSettingsComp = editorState?.getAppSettingsComp(); + const preventAppStylesOverwriting = appSettingsComp?.getView()?.preventAppStylesOverwriting; + const { preventStyleOverwriting } = props; const styleKeys = Object.keys(props).filter(key => key.toLowerCase().endsWith('style' || 'styles')); const styleProps: Record = {}; @@ -184,6 +188,7 @@ export function useMergeCompStyles( }); useEffect(() => { + if (preventAppStylesOverwriting || preventStyleOverwriting) return; setInitialCompStyles({ dispatch, compTheme, @@ -194,6 +199,8 @@ export function useMergeCompStyles( themeId, JSON.stringify(styleProps), JSON.stringify(compTheme), - setInitialCompStyles + setInitialCompStyles, + preventAppStylesOverwriting, + preventStyleOverwriting, ]); } \ No newline at end of file diff --git a/client/packages/lowcoder/src/util/permissionUtils.ts b/client/packages/lowcoder/src/util/permissionUtils.ts index dd02745a6..112708e85 100644 --- a/client/packages/lowcoder/src/util/permissionUtils.ts +++ b/client/packages/lowcoder/src/util/permissionUtils.ts @@ -1,10 +1,11 @@ -import { ADMIN_ROLE} from "constants/orgConstants"; +import { ADMIN_ROLE, SUPER_ADMIN_ROLE} from "constants/orgConstants"; import { ApplicationMeta } from "constants/applicationConstants"; import { User } from "constants/userConstants"; -export function currentOrgAdmin(user: User) { - return user.orgRoleMap.get(user.currentOrgId) === ADMIN_ROLE; +export function currentOrgAdmin(user: User) { + const role = user.orgRoleMap.get(user.currentOrgId); + return role === ADMIN_ROLE || role === SUPER_ADMIN_ROLE; } export function currentOrgAdminOrDev(user: User) { @@ -12,7 +13,7 @@ export function currentOrgAdminOrDev(user: User) { } export function isGroupAdmin(userGroupRole: string | undefined) { - return userGroupRole === ADMIN_ROLE; + return userGroupRole === ADMIN_ROLE || userGroupRole === SUPER_ADMIN_ROLE; } export function canManageApp(user: User, application?: ApplicationMeta) { diff --git a/client/yarn.lock b/client/yarn.lock index 884537f57..e2db86147 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -3643,6 +3643,25 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-typescript@npm:^12.1.0": + version: 12.1.0 + resolution: "@rollup/plugin-typescript@npm:12.1.0" + dependencies: + "@rollup/pluginutils": ^5.1.0 + resolve: ^1.22.1 + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: "*" + typescript: ">=3.7.0" + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + checksum: fb002f1cf93d780126ef873f907c7f490448bfe3f649c201e8dc944ab56bb2d0664940119ca40ee0051c6db361bae803513b00831a74e9e4459b4ad91f052ad5 + languageName: node + linkType: hard + "@rollup/plugin-typescript@npm:^8.5.0": version: 8.5.0 resolution: "@rollup/plugin-typescript@npm:8.5.0" @@ -3747,114 +3766,130 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.17.0" +"@rollup/pluginutils@npm:^5.1.0": + version: 5.1.2 + resolution: "@rollup/pluginutils@npm:5.1.2" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^2.3.1 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 16c8c154fef9a32c513b52bd79c92ac427edccd05a8dc3994f10c296063940c57bf809d05903b473d9d408aa5977d75b98c701f481dd1856d5ffc37187ac0060 + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-android-arm64@npm:4.17.0" +"@rollup/rollup-android-arm64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-android-arm64@npm:4.22.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.17.0" +"@rollup/rollup-darwin-arm64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-darwin-arm64@npm:4.22.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.17.0" +"@rollup/rollup-darwin-x64@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-darwin-x64@npm:4.22.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.17.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.17.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.5" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.17.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.5" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.17.0" +"@rollup/rollup-linux-arm64-musl@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.5" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.17.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.5" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.17.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.5" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.17.0" +"@rollup/rollup-linux-x64-gnu@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.5" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.17.0" +"@rollup/rollup-linux-x64-musl@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.5" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.17.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.17.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.17.0": - version: 4.17.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.17.0" +"@rollup/rollup-win32-x64-msvc@npm:4.22.5": + version: 4.22.5 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4525,7 +4560,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a @@ -4539,6 +4574,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.0 resolution: "@types/express-serve-static-core@npm:4.19.0" @@ -6370,7 +6412,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:*, axios@npm:^1.1.3, axios@npm:^1.6.2, axios@npm:^1.6.7": +"axios@npm:*, axios@npm:^1.6.7": version: 1.6.8 resolution: "axios@npm:1.6.8" dependencies: @@ -6381,6 +6423,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.7.4": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + languageName: node + linkType: hard + "axobject-query@npm:^3.2.1": version: 3.2.1 resolution: "axobject-query@npm:3.2.1" @@ -13628,7 +13681,7 @@ coolshapes-react@lowcoder-org/coolshapes-react: dependencies: "@types/axios": ^0.14.0 "@vitejs/plugin-react": ^2.2.0 - axios: ^1.1.3 + axios: ^1.7.4 chalk: 4 commander: ^9.4.1 cross-spawn: ^7.0.3 @@ -13750,7 +13803,7 @@ coolshapes-react@lowcoder-org/coolshapes-react: "@babel/preset-typescript": ^7.18.6 "@lottiefiles/react-lottie-player": ^3.5.3 "@remixicon/react": ^4.1.1 - "@rollup/plugin-typescript": ^8.5.0 + "@rollup/plugin-typescript": ^12.1.0 "@supabase/supabase-js": ^2.45.4 "@testing-library/jest-dom": ^5.16.5 "@testing-library/react": ^14.1.2 @@ -13789,7 +13842,7 @@ coolshapes-react@lowcoder-org/coolshapes-react: react-player: ^2.11.0 resize-observer-polyfill: ^1.5.1 rimraf: ^3.0.2 - rollup: ^4.13.0 + rollup: ^4.22.5 shelljs: ^0.8.5 simplebar: ^6.2.5 svgo: ^3.0.0 @@ -13916,7 +13969,7 @@ coolshapes-react@lowcoder-org/coolshapes-react: "@vitejs/plugin-react": ^2.2.0 animate.css: ^4.1.1 antd: ^5.20.0 - axios: ^1.6.2 + axios: ^1.7.4 buffer: ^6.0.3 clsx: ^2.0.0 cnchar: ^3.2.4 @@ -18753,27 +18806,27 @@ coolshapes-react@lowcoder-org/coolshapes-react: languageName: node linkType: hard -"rollup@npm:^4.13.0": - version: 4.17.0 - resolution: "rollup@npm:4.17.0" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.17.0 - "@rollup/rollup-android-arm64": 4.17.0 - "@rollup/rollup-darwin-arm64": 4.17.0 - "@rollup/rollup-darwin-x64": 4.17.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.17.0 - "@rollup/rollup-linux-arm-musleabihf": 4.17.0 - "@rollup/rollup-linux-arm64-gnu": 4.17.0 - "@rollup/rollup-linux-arm64-musl": 4.17.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.17.0 - "@rollup/rollup-linux-riscv64-gnu": 4.17.0 - "@rollup/rollup-linux-s390x-gnu": 4.17.0 - "@rollup/rollup-linux-x64-gnu": 4.17.0 - "@rollup/rollup-linux-x64-musl": 4.17.0 - "@rollup/rollup-win32-arm64-msvc": 4.17.0 - "@rollup/rollup-win32-ia32-msvc": 4.17.0 - "@rollup/rollup-win32-x64-msvc": 4.17.0 - "@types/estree": 1.0.5 +"rollup@npm:^4.22.5": + version: 4.22.5 + resolution: "rollup@npm:4.22.5" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.22.5 + "@rollup/rollup-android-arm64": 4.22.5 + "@rollup/rollup-darwin-arm64": 4.22.5 + "@rollup/rollup-darwin-x64": 4.22.5 + "@rollup/rollup-linux-arm-gnueabihf": 4.22.5 + "@rollup/rollup-linux-arm-musleabihf": 4.22.5 + "@rollup/rollup-linux-arm64-gnu": 4.22.5 + "@rollup/rollup-linux-arm64-musl": 4.22.5 + "@rollup/rollup-linux-powerpc64le-gnu": 4.22.5 + "@rollup/rollup-linux-riscv64-gnu": 4.22.5 + "@rollup/rollup-linux-s390x-gnu": 4.22.5 + "@rollup/rollup-linux-x64-gnu": 4.22.5 + "@rollup/rollup-linux-x64-musl": 4.22.5 + "@rollup/rollup-win32-arm64-msvc": 4.22.5 + "@rollup/rollup-win32-ia32-msvc": 4.22.5 + "@rollup/rollup-win32-x64-msvc": 4.22.5 + "@types/estree": 1.0.6 fsevents: ~2.3.2 dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -18812,7 +18865,7 @@ coolshapes-react@lowcoder-org/coolshapes-react: optional: true bin: rollup: dist/bin/rollup - checksum: 71d489c3e8f547cea656a1176642637e4b89e5ef2c29a9de5b3658e8d2559c5d5dcef7a084cfaa87e2f148ccc1484920f5a177f71bf5cdaddb9f58525f3012bc + checksum: 894b3d428b5a7f1db2245f50622ce65a3ad8f754265dd1da7dce133e39b315516dbcbac51e4fe100b44d59b168bac3f36ebaeb836fc9f7057d4972f44497d046 languageName: node linkType: hard diff --git a/deploy/docker/README.md b/deploy/docker/README.md index 16986c25d..dd42643ce 100644 --- a/deploy/docker/README.md +++ b/deploy/docker/README.md @@ -39,6 +39,7 @@ Image can be configured by setting environment variables. | `LOWCODER_PUBLIC_URL` | The URL of the public User Interface | `localhost:3000` | | `LOWCODER_MAX_REQUEST_SIZE` | Lowcoder max request size | `20m` | | `LOWCODER_MAX_QUERY_TIMEOUT` | Lowcoder max query timeout (in seconds) | `120` | +| `LOWCODER_DEFAULT_QUERY_TIMEOUT` | Lowcoder default query timeout (in seconds) | `10` | | `LOWCODER_API_RATE_LIMIT` | Number of max Request per Second | `100` | | `LOWCODER_API_SERVICE_URL` | Lowcoder API service URL | `http://localhost:8080` | | `LOWCODER_NODE_SERVICE_URL` | Lowcoder Node service (js executor) URL | `http://localhost:6060` | @@ -109,8 +110,9 @@ Image can be configured by setting environment variables. | `LOWCODER_MAX_GROUPS_PER_ORG` | Default maximum groups per organization | `100` | | `LOWCODER_MAX_APPS_PER_ORG` | Default maximum applications per organization | `1000` | | `LOWCODER_MAX_DEVELOPERS` | Default maximum developers | `100` | -| `LOWCODER_MAX_QUERY_TIMEOUT` | Lowcoder max query timeout (in seconds) | `120` | | `LOWCODER_MAX_REQUEST_SIZE` | Lowcoder max request size | `20m` | +| `LOWCODER_MAX_QUERY_TIMEOUT` | Lowcoder max query timeout (in seconds) | `120` | +| `LOWCODER_DEFAULT_QUERY_TIMEOUT`| Lowcoder default query timeout (in seconds) | `10` | | `LOWCODER_WORKSPACE_MODE` | SAAS to activate, ENTERPRISE to switch off - Workspaces | `SAAS` | | `LOWCODER_EMAIL_SIGNUP_ENABLED` | Control is users can create their own Workspace when Sign Up | `true` | | `LOWCODER_CREATE_WORKSPACE_ON_SIGNUP` | IF LOWCODER_WORKSPACE_MODE = SAAS, controls if a own workspace is created for the user after sign up | `true` | diff --git a/deploy/docker/all-in-one/entrypoint.sh b/deploy/docker/all-in-one/entrypoint.sh index 03a1a9eb1..74403a08d 100644 --- a/deploy/docker/all-in-one/entrypoint.sh +++ b/deploy/docker/all-in-one/entrypoint.sh @@ -25,6 +25,11 @@ else export MONGO_LISTEN_HOST="127.0.0.1" fi; +# Set the default mongodb connection string if not set explicitly +if [ -z "${LOWCODER_MONGODB_URL}" ]; then + export LOWCODER_MONGODB_URL="mongodb://localhost:27017/lowcoder?authSource=admin" +fi; + LOGS="/lowcoder-stacks/logs" DATA="/lowcoder-stacks/data" CERT="/lowcoder-stacks/ssl" diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/util/QueryTimeoutUtils.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/util/QueryTimeoutUtils.java index cb4d08310..4c6f90881 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/util/QueryTimeoutUtils.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/util/QueryTimeoutUtils.java @@ -13,10 +13,18 @@ import org.lowcoder.sdk.exception.PluginException; import com.google.common.annotations.VisibleForTesting; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +@Component public final class QueryTimeoutUtils { - private static final int DEFAULT_QUERY_TIMEOUT_MILLIS = 10000; + private static int defaultQueryTimeout = 10; + + @Value("${default.query-timeout}") + public void setDefaultQueryTimeoutMillis(int defaultQueryTimeout) { + QueryTimeoutUtils.defaultQueryTimeout = defaultQueryTimeout; + } public static int parseQueryTimeoutMs(String timeoutStr, Map paramMap, int maxQueryTimeout) { return parseQueryTimeoutMs(renderMustacheString(timeoutStr, paramMap), maxQueryTimeout); @@ -25,7 +33,7 @@ public static int parseQueryTimeoutMs(String timeoutStr, Map par @VisibleForTesting public static int parseQueryTimeoutMs(String timeoutStr, int maxQueryTimeout) { if (StringUtils.isBlank(timeoutStr)) { - return DEFAULT_QUERY_TIMEOUT_MILLIS; + return Math.min(defaultQueryTimeout * 1000, (int)Duration.ofSeconds(maxQueryTimeout).toMillis()); } Pair unitInfo = getUnitInfo(timeoutStr); diff --git a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java index 2348cbbd2..a5cba98f3 100644 --- a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java +++ b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java @@ -232,7 +232,9 @@ private List getGeneratedIds(ResultSet generatedKeys) throws SQLExceptio private void bindParam(int bindIndex, Object value, PreparedStatement preparedStatement, String bindKeyName) throws SQLException { if (value == null) { - preparedStatement.setNull(bindIndex, Types.NULL); + ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData(); + int paramType = parameterMetaData.getParameterType(bindIndex); + preparedStatement.setNull(bindIndex, paramType); return; } if (value instanceof Integer intValue) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java index 37f76bef0..589aae782 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java @@ -19,10 +19,13 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; import java.time.Instant; +import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -63,7 +66,7 @@ public Mono filter(@Nonnull ServerWebExchange exchange, WebFilterChain cha .map(user -> { Connection activeConnection = null; - String orgId = null; + List orgIds = List.of(); Optional activeConnectionOptional = user.getConnections() .stream() @@ -71,27 +74,27 @@ public Mono filter(@Nonnull ServerWebExchange exchange, WebFilterChain cha .findFirst(); if(!activeConnectionOptional.isPresent()) { - return Triple.of(user, activeConnection, orgId); + return Triple.of(user, activeConnection, orgIds); } activeConnection = activeConnectionOptional.get(); if(!activeConnection.getAuthId().equals(DEFAULT_AUTH_CONFIG.getId())) { if(activeConnection.getAuthConnectionAuthToken().getExpireAt() == 0) { - return Triple.of(user, activeConnection, orgId); + return Triple.of(user, activeConnection, orgIds); } boolean isAccessTokenExpired = (activeConnection.getAuthConnectionAuthToken().getExpireAt()*1000) < Instant.now().toEpochMilli(); if(isAccessTokenExpired) { - Optional orgIdOptional = activeConnection.getOrgIds().stream().findFirst(); - if(!orgIdOptional.isPresent()) { - return Triple.of(user, activeConnection, orgId); + List activeOrgIds = activeConnection.getOrgIds().stream().toList(); + if(!activeOrgIds.isEmpty()) { + return Triple.of(user, activeConnection, activeOrgIds); } - orgId = orgIdOptional.get(); + orgIds = activeOrgIds; } } - return Triple.of(user, activeConnection, orgId); + return Triple.of(user, activeConnection, orgIds); }).flatMap(this::refreshOauthToken) .flatMap(user -> chain.filter(exchange).contextWrite(withAuthentication(toAuthentication(user))) @@ -99,59 +102,61 @@ public Mono filter(@Nonnull ServerWebExchange exchange, WebFilterChain cha ); } - private Mono refreshOauthToken(Triple triple) { + private Mono refreshOauthToken(Triple> triple) { User user = triple.getLeft(); Connection connection = triple.getMiddle(); - String orgId = triple.getRight(); + Collection orgIds = triple.getRight(); - if (connection == null || orgId == null) { + if (connection == null || orgIds == null || orgIds.isEmpty()) { return Mono.just(user); } - OAuth2RequestContext oAuth2RequestContext = new OAuth2RequestContext(triple.getRight(), null, null); + return Flux.fromIterable(orgIds).flatMap(orgId -> { + OAuth2RequestContext oAuth2RequestContext = new OAuth2RequestContext(orgId, null, null); - log.info("Refreshing token for user: [ name: {}, id: {} ], orgId: {}, activeConnection: [ authId: {}, name: {}, orgIds: ({})]", - user.getName(), user.getId(), - orgId, - connection.getAuthId(), connection.getName(), StringUtils.join(connection.getOrgIds(), ", ")); + log.info("Refreshing token for user: [ name: {}, id: {} ], orgIds: {}, activeConnection: [ authId: {}, name: {}, orgIds: ({})]", + user.getName(), user.getId(), + orgIds, + connection.getAuthId(), connection.getName(), StringUtils.join(connection.getOrgIds(), ", ")); - return authenticationService - .findAuthConfigByAuthId(orgId, connection.getAuthId()) - .switchIfEmpty(Mono.empty()) - .flatMap(findAuthConfig -> { + return authenticationService + .findAllAuthConfigs(orgId, true) + .filter(findAuthConfig -> findAuthConfig.authConfig().getId().equals(connection.getAuthId())) + .switchIfEmpty(Mono.empty()) + .flatMap(findAuthConfig -> { - Mono authRequestMono = Mono.empty(); + Mono authRequestMono = Mono.empty(); - if(findAuthConfig == null) { - return authRequestMono; - } - oAuth2RequestContext.setAuthConfig(findAuthConfig.authConfig()); - - return authRequestFactory.build(oAuth2RequestContext); - }) - .publishOn(Schedulers.boundedElastic()).flatMap(authRequest -> { - if(authRequest == null) { - return Mono.just(user); - } - try { - if (StringUtils.isEmpty(connection.getAuthConnectionAuthToken().getRefreshToken())) { - log.error("Refresh token is empty"); - throw new Exception("Refresh token is empty"); + if (findAuthConfig == null) { + return authRequestMono; } - AuthUser authUser = authRequest.refresh(connection.getAuthConnectionAuthToken().getRefreshToken()).block(); - authUser.setAuthContext(oAuth2RequestContext); - authenticationApiService.updateConnection(authUser, user); - return userService.update(user.getId(), user); - } catch (Exception e) { - log.error("Failed to refresh access token. Removing user sessions/tokens."); - connection.getTokens().forEach(token -> { - service.removeUserSession(token).block(); - }); - } - return Mono.just(user); - }); + oAuth2RequestContext.setAuthConfig(findAuthConfig.authConfig()); + return authRequestFactory.build(oAuth2RequestContext); + }) + .publishOn(Schedulers.boundedElastic()).flatMap(authRequest -> { + if (authRequest == null) { + return Mono.just(user); + } + try { + if (StringUtils.isEmpty(connection.getAuthConnectionAuthToken().getRefreshToken())) { + log.error("Refresh token is empty"); + throw new Exception("Refresh token is empty"); + } + AuthUser authUser = authRequest.refresh(connection.getAuthConnectionAuthToken().getRefreshToken()).block(); + authUser.setAuthContext(oAuth2RequestContext); + authenticationApiService.updateConnection(authUser, user); + return userService.update(user.getId(), user); + } catch (Exception e) { + log.error("Failed to refresh access token. Removing user sessions/tokens."); + connection.getTokens().forEach(token -> { + service.removeUserSession(token).block(); + }); + } + return Mono.just(user); + }); + }).next(); } } diff --git a/server/api-service/lowcoder-server/src/main/resources/application-debug.yaml b/server/api-service/lowcoder-server/src/main/resources/application-debug.yaml index 56e6a0e67..b6faa2025 100644 --- a/server/api-service/lowcoder-server/src/main/resources/application-debug.yaml +++ b/server/api-service/lowcoder-server/src/main/resources/application-debug.yaml @@ -52,3 +52,6 @@ logging: level: root: debug org.lowcoder: debug + +default: + query-timeout: ${LOWCODER_DEFAULT_QUERY_TIMEOUT:10s} \ No newline at end of file diff --git a/server/api-service/lowcoder-server/src/main/resources/application.yaml b/server/api-service/lowcoder-server/src/main/resources/application.yaml index 2c7c5bbf1..988c45200 100644 --- a/server/api-service/lowcoder-server/src/main/resources/application.yaml +++ b/server/api-service/lowcoder-server/src/main/resources/application.yaml @@ -53,6 +53,7 @@ default: org-app-count: ${LOWCODER_MAX_APPS_PER_ORG:1000} developer-count: ${LOWCODER_MAX_DEVELOPERS:50} api-rate-limit: ${LOWCODER_API_RATE_LIMIT:50} + query-timeout: ${LOWCODER_DEFAULT_QUERY_TIMEOUT:10} common: cookie-name: LOWCODER_CE_SELFHOST_TOKEN diff --git a/server/api-service/pom.xml b/server/api-service/pom.xml index 8a0a83819..d61cbd19e 100644 --- a/server/api-service/pom.xml +++ b/server/api-service/pom.xml @@ -12,7 +12,7 @@ - 2.4.6 + 2.4.7 17 ${java.version} ${java.version} diff --git a/server/node-service/package.json b/server/node-service/package.json index 6fc720ea9..58d167ea5 100644 --- a/server/node-service/package.json +++ b/server/node-service/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-node-server", - "version": "2.4.6", + "version": "2.4.7", "private": true, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -16,6 +16,7 @@ "build": "rm -rf build/ && yarn test && tsc && yarn copy" }, "devDependencies": { + "@types/ali-oss": "^6.16.11", "@types/jest": "^29.2.4", "commander": "^10.0.0", "copyfiles": "^2.4.1", @@ -46,6 +47,7 @@ "@types/morgan": "^1.9.3", "@types/node": "^20.1.1", "@types/node-fetch": "^2.6.2", + "ali-oss": "^6.20.0", "axios": "^1.7.7", "base64-arraybuffer": "^1.0.2", "bluebird": "^3.7.2", diff --git a/server/node-service/src/plugins/aliyunOss/dataSourceConfig.ts b/server/node-service/src/plugins/aliyunOss/dataSourceConfig.ts new file mode 100644 index 000000000..e58754335 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/dataSourceConfig.ts @@ -0,0 +1,52 @@ +import { ConfigToType } from "lowcoder-sdk/dataSource"; +import { AliyunOssI18nTranslator } from "./i18n"; + +const getDataSourceConfig = (i18n: AliyunOssI18nTranslator) => { + const dataSourceConfig = { + type: "dataSource", + params: [ + { + key: "accessKeyId", + label: "Access key ID", + type: "textInput", + placeholder: "", + rules: [{ required: true, message: i18n.trans("akRequiredMessage") }], + }, + { + key: "accessKeySecret", + label: "Secret key", + type: "password", + placeholder: "", + rules: [{ required: true, message: i18n.trans("skRequiredMessage") }], + }, + { + key: "arn", + label: "ARN", + type: "password", + tooltip: i18n.trans("arnTooltip"), + placeholder: "", + rules: [{ required: true, message: i18n.trans("arnRequiredMessage") }], + }, + { + key: "endpointUrl", + label: "STS Endpoint", + type: "textInput", + tooltip: i18n.trans("endpointUrlTooltip"), + default: "sts.cn-hangzhou.aliyuncs.com", + rules: [{ required: true }], + }, + { + key: "region", + type: "textInput", + label: i18n.trans("region"), + defaultValue: "oss-cn-hangzhou", + rules: [{ required: true }], + }, + ], + } as const; + return dataSourceConfig; +}; + +export default getDataSourceConfig; + +export type DataSourceDataType = ConfigToType>; diff --git a/server/node-service/src/plugins/aliyunOss/i18n/en.ts b/server/node-service/src/plugins/aliyunOss/i18n/en.ts new file mode 100644 index 000000000..28101e730 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/i18n/en.ts @@ -0,0 +1,30 @@ +export const en = { + name: "OSS", + description: "Supports Aliyun Object Storage Service (Based on STS)", + skRequiredMessage: "Please input the SecretKey", + akRequiredMessage: "Please input the AccessKey", + arnRequiredMessage: "Please input the ARN", + endpointUrlTooltip: "Endpoint url of STS service", + arnTooltip: "The global resource descriptor for the role", + bucket: "Bucket", + returnSignedUrl: "Return signed url", + actions: "Actions", + prefix: "Prefix to filter", + delimiter: "Delimiter", + limit: "Limit", + fileName: "File name", + dataType: "Data type", + data: "Data", + dataTooltip:"The content of the data only supports BASE64 encoding, for example: window.btoa(xxx).", + region: "OSS Region", + messages: { + bucketRequired: "Bucket is required", + }, + actionName: { + listBuckets: "List buckets", + listObjects: "List files", + uploadFile: "Upload file", + readFile: "Read file", + deleteFile: "Delete file", + }, +}; diff --git a/server/node-service/src/plugins/aliyunOss/i18n/index.ts b/server/node-service/src/plugins/aliyunOss/i18n/index.ts new file mode 100644 index 000000000..77e5c0346 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/i18n/index.ts @@ -0,0 +1,9 @@ +import { en } from "./en"; +import { zh } from "./zh"; +import { I18n } from "../../../common/i18n"; + +export default function getI18nTranslator(languages: string[]) { + return new I18n({ zh, en }, languages); +} + +export type AliyunOssI18nTranslator = ReturnType; diff --git a/server/node-service/src/plugins/aliyunOss/i18n/zh.ts b/server/node-service/src/plugins/aliyunOss/i18n/zh.ts new file mode 100644 index 000000000..d9f2db3ca --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/i18n/zh.ts @@ -0,0 +1,32 @@ +import { en } from "./en"; + +export const zh: typeof en = { + name: "阿里云对象存储", + description: "支持OSS对象存储服务(基于 STS 身份认证)", + skRequiredMessage: "请输入 SecretKey", + akRequiredMessage: "请输入 AccessKey", + arnRequiredMessage: "请输入阿里云ARN", + endpointUrlTooltip: "STS 服务接入点", + arnTooltip: "角色的全局资源描述符", + bucket: "存储桶", + region: "OSS 区域", + returnSignedUrl: "返回文件签名地址", + actions: "方法", + prefix: "前缀", + delimiter: "分隔符", + limit: "最大文件数", + fileName: "文件名", + dataType: "数据类型", + data: "数据", + dataTooltip:"数据内容仅支持 BASE64 编码,例:window.btoa(xxx)", + messages: { + bucketRequired: "需要提供存储桶名称", + }, + actionName: { + listBuckets: "查询桶列表", + listObjects: "获取文件列表", + uploadFile: "上传文件", + readFile: "读取文件", + deleteFile: "删除文件", + }, +}; diff --git a/server/node-service/src/plugins/aliyunOss/index.ts b/server/node-service/src/plugins/aliyunOss/index.ts new file mode 100644 index 000000000..280d31078 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/index.ts @@ -0,0 +1,39 @@ +import { DataSourcePluginFactory, PluginContext } from "lowcoder-sdk/dataSource"; +import getI18nTranslator from "./i18n"; +import getDataSourceConfig, { DataSourceDataType } from "./dataSourceConfig"; +import run, { validateDataSourceConfig } from "./run"; +import getQueryConfig, { ActionDataType } from "./queryConfig"; +import { ServiceError } from "../../common/error"; + +const ossPlugin: DataSourcePluginFactory = (context: PluginContext) => { + const i18n = getI18nTranslator(context.languages); + return { + id: "oss", + name: i18n.trans("name"), + icon: "alibabaOss.svg", + description: i18n.trans("description"), + category: "Assets", + dataSourceConfig: getDataSourceConfig(i18n), + queryConfig: getQueryConfig(i18n), + + validateDataSourceConfig: async (dataSourceConfig: DataSourceDataType) => { + return validateDataSourceConfig(dataSourceConfig); + }, + + run: async ( + action: ActionDataType, + dataSourceConfig: DataSourceDataType, + ctx: PluginContext + ) => { + const i18n = getI18nTranslator(ctx.languages); + try { + return await run(action, dataSourceConfig, i18n); + } catch (e:any) { + throw new ServiceError(e.message, 400); + } + }, + }; + }; + + export default ossPlugin; + \ No newline at end of file diff --git a/server/node-service/src/plugins/aliyunOss/queryConfig.ts b/server/node-service/src/plugins/aliyunOss/queryConfig.ts new file mode 100644 index 000000000..901aa9978 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/queryConfig.ts @@ -0,0 +1,80 @@ +import { ActionParamConfig, Config, ConfigToType, QueryConfig } from "lowcoder-sdk/dataSource"; +import { AliyunOssI18nTranslator } from "./i18n"; + +function getQueryConfig(i18n: AliyunOssI18nTranslator) { + const bucketActionParam = { + key: "bucket", + type: "textInput", + label: i18n.trans("bucket"), + } as const; + + const queryConfig = { + type: "query", + label: i18n.trans("actions"), + actions: [ + // { + // actionName: "listBuckets", + // label: i18n.trans("actionName.listBuckets"), + // params: [], + // }, + { + actionName: "listObjects", + label: i18n.trans("actionName.listObjects"), + params: [ + bucketActionParam, + { + key: "prefix", + type: "textInput", + label: i18n.trans("prefix"), + }, + { + key: "delimiter", + type: "textInput", + label: i18n.trans("delimiter"), + }, + { + key: "limit", + type: "numberInput", + defaultValue: 10, + label: i18n.trans("limit"), + } + ], + }, + { + actionName: "uploadData", + label: i18n.trans("actionName.uploadFile"), + params: [ + bucketActionParam, + { + key: "fileName", + type: "textInput", + label: i18n.trans("fileName"), + }, + { + key: "data", + type: "textInput", + label: i18n.trans("data"), + tooltip: i18n.trans("dataTooltip"), + }, + ], + }, + // { + // actionName: "deleteFile", + // label: i18n.trans("actionName.deleteFile"), + // params: [ + // bucketActionParam, + // { + // key: "fileName", + // type: "textInput", + // label: i18n.trans("fileName"), + // }, + // ], + // }, + ], + } as const; + return queryConfig; +} + +export type ActionDataType = ConfigToType>; + +export default getQueryConfig; diff --git a/server/node-service/src/plugins/aliyunOss/run.ts b/server/node-service/src/plugins/aliyunOss/run.ts new file mode 100644 index 000000000..b74cb00d8 --- /dev/null +++ b/server/node-service/src/plugins/aliyunOss/run.ts @@ -0,0 +1,143 @@ +// import { +// OSS +// } from "ali-oss"; +import OSS from "ali-oss"; +import { STS } from 'ali-oss'; +import { ServiceError } from "../../common/error"; +import { DataSourceDataType } from "./dataSourceConfig"; +import { AliyunOssI18nTranslator } from "./i18n"; +import { ActionDataType } from "./queryConfig"; +import { P } from "pino"; +import { query } from "express"; +import { Readable } from "stream"; + +interface StsCredential { + AccessKeyId: string; + AccessKeySecret: string; + SecurityToken: string; + Expiration: Date; +} +var stsCredential: StsCredential; +async function loginWithSts(params: DataSourceDataType): Promise { + if (stsCredential && new Date().getTime() < stsCredential.Expiration.getTime()) { + return stsCredential; + } + let sts = new STS({ + // 填写步骤1创建的RAM用户AccessKey。 + accessKeyId: params.accessKeyId, + accessKeySecret: params.accessKeySecret, + }); + let res = await sts.assumeRole(params.arn, ``, 3000, 'lowcoder'); + var { AccessKeyId, AccessKeySecret, SecurityToken, Expiration } = res.credentials; + stsCredential = { + AccessKeyId, + AccessKeySecret, + SecurityToken, + Expiration: new Date(Expiration) + }; + return stsCredential; +} + +async function getClient(params: DataSourceDataType) { + var stsCredential = await loginWithSts(params); + return new OSS({ + region: params.region, + accessKeyId: stsCredential.AccessKeyId, + accessKeySecret: stsCredential.AccessKeySecret, + stsToken: stsCredential.SecurityToken, + refreshSTSToken: async () => { + var res = await loginWithSts(params); + return { + accessKeyId: res.AccessKeyId, + accessKeySecret: res.AccessKeySecret, + stsToken: res.SecurityToken, + } + } + }); +} + +function getBucket(actionConfig: ActionDataType, dataSourceConfig: DataSourceDataType) { + if ("bucket" in actionConfig) { + return actionConfig.bucket; + } + return ""; +} + +export async function validateDataSourceConfig(dataSourceConfig: DataSourceDataType) { + try { + const client = getClient(dataSourceConfig); + return{ + success:true + }; + } catch (e) { + if (e) { + return { + success: false, + message: String(e), + }; + } + throw e; + } +} + +export default async function run( + action: ActionDataType, + dataSourceConfig: DataSourceDataType, + i18n: AliyunOssI18nTranslator +) { + const client = await getClient(dataSourceConfig); + const bucket = getBucket(action, dataSourceConfig); + client.useBucket(bucket); + + // list + if (action.actionName === "listObjects") { + if (!bucket) { + throw new ServiceError(i18n.trans("messages.bucketRequired"), 400); + } + const res = await client.listV2({ + prefix: action.prefix, + delimiter: action.delimiter, + "max-keys": String(action.limit ?? 100), + }, {}); + + const files = []; + for (const i of res.objects || []) { + files.push({ + name: i.name || "", + size: i.size, + lastModified: i.lastModified, + etag: i.etag, + url: i.url, + }); + } + return files; + } + + // upload + if (action.actionName === "uploadData") { + const buf = Buffer.from(action.data, ("base64") as BufferEncoding); + const r = new Readable(); + r.push(buf); + r.push(null); + let result = await client.putStream(action.fileName, r); + return { + fileName: action.fileName, + url: getUrl(action.fileName, client), + } + + // if (action.actionName === "deleteFile") { + // await client.send( + // new DeleteObjectCommand({ + // Bucket: bucket, + // Key: action.fileName, + // }) + // ); + // return { + // success: true, + // }; + // } + } + function getUrl(fileName: string, client: OSS) { + return client.signatureUrl(fileName); + } +} diff --git a/server/node-service/src/plugins/index.ts b/server/node-service/src/plugins/index.ts index 3c78b5363..22d0d8a23 100644 --- a/server/node-service/src/plugins/index.ts +++ b/server/node-service/src/plugins/index.ts @@ -32,6 +32,7 @@ import faunaPlugin from "./fauna"; import huggingFaceInferencePlugin from "./huggingFaceInference"; import didPlugin from "./did"; import bigQueryPlugin from "./bigQuery"; +import ossPlugin from "./aliyunOss"; import appConfigPlugin from "./appconfig"; import tursoPlugin from "./turso"; import postmanEchoPlugin from "./postmanEcho"; @@ -87,6 +88,7 @@ let plugins: (DataSourcePlugin | DataSourcePluginFactory)[] = [ googleCloudStorage, supabasePlugin, cloudinaryPlugin, + ossPlugin, // Project Management asanaPlugin, diff --git a/server/node-service/src/static/plugin-icons/alibabaOss.svg b/server/node-service/src/static/plugin-icons/alibabaOss.svg new file mode 100644 index 000000000..b3cdeed3d --- /dev/null +++ b/server/node-service/src/static/plugin-icons/alibabaOss.svg @@ -0,0 +1,3 @@ + + + diff --git a/server/node-service/yarn.lock b/server/node-service/yarn.lock index b5303f34f..04e420166 100644 --- a/server/node-service/yarn.lock +++ b/server/node-service/yarn.lock @@ -140,15 +140,15 @@ __metadata: linkType: hard "@aws-sdk/client-appconfig@npm:^3.533.0": - version: 3.654.0 - resolution: "@aws-sdk/client-appconfig@npm:3.654.0" + version: 3.658.1 + resolution: "@aws-sdk/client-appconfig@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -159,46 +159,46 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: 466dc5d6b1dba097154f9cd626fd424c5e83904eba102e7924b28ad7b5594ad828bc66737f5c3c66efcadb71e440fdd56f8c77da1d8819e2774142b9bf51a1be + checksum: 6dd3480ec3337863a2b414c8ac66feecf0c87f2381bd424a8a15d738f8805d1f54a17a751e6168fd91c374463900b222c632f12d459695faf9b3051eacc90a73 languageName: node linkType: hard "@aws-sdk/client-appconfigdata@npm:^3.533.0": - version: 3.654.0 - resolution: "@aws-sdk/client-appconfigdata@npm:3.654.0" + version: 3.658.1 + resolution: "@aws-sdk/client-appconfigdata@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -209,46 +209,46 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: 54eceea80fe7b741390299af252b7f197fec23dc6878fa865f87bb53a8604b88aa030b338962fa33b58b47cfaeccdf17692203146c6d4f12936c269757d47051 + checksum: d9a24db102faba56ee6f0120644f602de8f16184517b67e5c8d478d0ef6009e52d10fd0133ca32ea747243cd670f1b0c3c3a174a2506e00d33223e595e518e24 languageName: node linkType: hard "@aws-sdk/client-athena@npm:^3.333.0": - version: 3.654.0 - resolution: "@aws-sdk/client-athena@npm:3.654.0" + version: 3.658.1 + resolution: "@aws-sdk/client-athena@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -259,46 +259,46 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 uuid: ^9.0.1 - checksum: c0db2333dd19564ea3bf6a7c47deb22d25504f30ecc25da669025608dda5a882841741369809870e4a583f7e79905344ea6f9f0adc3671b624af759a995515ae + checksum: d3ffcb575c5da66ef507904ca2404f714254d9146dc374083394960a25eef76d32e3fbeb4dd05c31b2ebe6b6871df374241e9cac7ffb56d668f1d11255a4d2a7 languageName: node linkType: hard "@aws-sdk/client-dynamodb@npm:^3.332.0": - version: 3.656.0 - resolution: "@aws-sdk/client-dynamodb@npm:3.656.0" + version: 3.658.1 + resolution: "@aws-sdk/client-dynamodb@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-endpoint-discovery": 3.654.0 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 @@ -310,26 +310,26 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 @@ -337,20 +337,20 @@ __metadata: "@smithy/util-waiter": ^3.1.5 tslib: ^2.6.2 uuid: ^9.0.1 - checksum: a06315963bd4f439dae9f413644376194be183e3dd580eb2d75bcfabbfbdf51208ddcc2775d69299ced577f16ff32eae60197945287fc5473e341d2414ba357a + checksum: 60f7d38aeaf476f7e06ba252ea56d9bcfae6078bad626ae52ef629f35217a5687737430affbcea28acd1ec7c20252f43851d59aeae71a49a2066560c117c54f9 languageName: node linkType: hard "@aws-sdk/client-lambda@npm:^3.332.0": - version: 3.656.0 - resolution: "@aws-sdk/client-lambda@npm:3.656.0" + version: 3.659.0 + resolution: "@aws-sdk/client-lambda@npm:3.659.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -361,74 +361,74 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 + "@smithy/core": ^2.4.6 "@smithy/eventstream-serde-browser": ^3.0.9 "@smithy/eventstream-serde-config-resolver": ^3.0.6 "@smithy/eventstream-serde-node": ^3.0.8 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 "@smithy/util-utf8": ^3.0.0 "@smithy/util-waiter": ^3.1.5 tslib: ^2.6.2 - checksum: 7cdd969d6ccd15cad0a052a7b97f1e7a7a0d58028b966d3020d1bff68b162b0dc14c6c6974e82d8f2b62653ba7fb1e42a57f9c03f4f288e77d94e06fa608ed0e + checksum: 9ad14307210ed0ef3819ab6a8a40116922362c67e6d42b338ab01a1310269e1480e793d2971d3102ebe75940ffe961b510f83275fc9055a9c39fa95b21fdc810 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.332.0": - version: 3.654.0 - resolution: "@aws-sdk/client-s3@npm:3.654.0" + version: 3.658.1 + resolution: "@aws-sdk/client-s3@npm:3.658.1" dependencies: "@aws-crypto/sha1-browser": 5.2.0 "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/client-sts": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/client-sts": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-bucket-endpoint": 3.654.0 "@aws-sdk/middleware-expect-continue": 3.654.0 - "@aws-sdk/middleware-flexible-checksums": 3.654.0 + "@aws-sdk/middleware-flexible-checksums": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-location-constraint": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 - "@aws-sdk/middleware-sdk-s3": 3.654.0 + "@aws-sdk/middleware-sdk-s3": 3.658.1 "@aws-sdk/middleware-ssec": 3.654.0 "@aws-sdk/middleware-user-agent": 3.654.0 "@aws-sdk/region-config-resolver": 3.654.0 - "@aws-sdk/signature-v4-multi-region": 3.654.0 + "@aws-sdk/signature-v4-multi-region": 3.658.1 "@aws-sdk/types": 3.654.0 "@aws-sdk/util-endpoints": 3.654.0 "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@aws-sdk/xml-builder": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 + "@smithy/core": ^2.4.6 "@smithy/eventstream-serde-browser": ^3.0.9 "@smithy/eventstream-serde-config-resolver": ^3.0.6 "@smithy/eventstream-serde-node": ^3.0.8 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-blob-browser": ^3.1.5 "@smithy/hash-node": ^3.0.6 "@smithy/hash-stream-node": ^3.1.5 @@ -436,39 +436,39 @@ __metadata: "@smithy/md5-js": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 "@smithy/util-utf8": ^3.0.0 "@smithy/util-waiter": ^3.1.5 tslib: ^2.6.2 - checksum: 39da200413335ef4fbb64cffa94ffbb5d2dfbb09841d7c10e19c6f7e50790edd72f8fe0bc87b82950c9e65bf02ea24786f67ccc068e6064ced96cbe44baa0a2b + checksum: d6e4ed98c208b633ab6071b0d145419fcda0ccc1a8b24659b112e5d5031fe5b0bc4243137b7d0d28ce8028b76b6697e453f2f933a1a6b69b5dc3ea9d7c3cab90 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.654.0" +"@aws-sdk/client-sso-oidc@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/client-sso-oidc@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -479,44 +479,44 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 peerDependencies: - "@aws-sdk/client-sts": ^3.654.0 - checksum: d4a4b978629c290f1c26e1e50e48171dfa58bce938e97fd6c4ad605cc3c40b7a3c51e3a5925816b5be09cfec5cb0c7f5bf4abc9e0244544dd4cc7bc94a8865db + "@aws-sdk/client-sts": ^3.658.1 + checksum: 13c38482e5542dd45a73aa8e82da914c825ddc2d9a7d397b2e9f220c1d7f23ba6c1a9998c702d6e31c5acf7479e572cfd10fe34d2c08360d0e88663c05860c34 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/client-sso@npm:3.654.0" +"@aws-sdk/client-sso@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/client-sso@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.654.0 + "@aws-sdk/core": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -527,44 +527,44 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: beb1ef4bfd8ed34d35b7eca962a989d1d560a86eb652d55175a68304f17a2c2975ac95f5e920d661caaafecf8eb5195c809279e6d7d776a37a90d329988419c3 + checksum: 9b8076775d8408f127b7b7de9f989c44646798e9ec69010d2097a549d565b56fc21ed7f47a52411926250a4e607940fb371354e58f10d4dac8dafbc8ab20d5b1 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/client-sts@npm:3.654.0" +"@aws-sdk/client-sts@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/client-sts@npm:3.658.1" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.654.0 - "@aws-sdk/core": 3.654.0 - "@aws-sdk/credential-provider-node": 3.654.0 + "@aws-sdk/client-sso-oidc": 3.658.1 + "@aws-sdk/core": 3.658.1 + "@aws-sdk/credential-provider-node": 3.658.1 "@aws-sdk/middleware-host-header": 3.654.0 "@aws-sdk/middleware-logger": 3.654.0 "@aws-sdk/middleware-recursion-detection": 3.654.0 @@ -575,50 +575,50 @@ __metadata: "@aws-sdk/util-user-agent-browser": 3.654.0 "@aws-sdk/util-user-agent-node": 3.654.0 "@smithy/config-resolver": ^3.0.8 - "@smithy/core": ^2.4.3 - "@smithy/fetch-http-handler": ^3.2.7 + "@smithy/core": ^2.4.6 + "@smithy/fetch-http-handler": ^3.2.8 "@smithy/hash-node": ^3.0.6 "@smithy/invalid-dependency": ^3.0.6 "@smithy/middleware-content-length": ^3.0.8 "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.18 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/middleware-stack": ^3.0.6 "@smithy/node-config-provider": ^3.1.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/node-http-handler": ^3.2.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/url-parser": ^3.0.6 "@smithy/util-base64": ^3.0.0 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.18 - "@smithy/util-defaults-mode-node": ^3.0.18 + "@smithy/util-defaults-mode-browser": ^3.0.21 + "@smithy/util-defaults-mode-node": ^3.0.21 "@smithy/util-endpoints": ^2.1.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: 27c793be26d637f304bc80acb8d763d59c2ea4618d6adead95f36bb5f0bdf5ee3f00222497dd7114d23b7f3320b15171c317e7b588b6e6a91f07ef618f9e5478 + checksum: c577d3020dc8e9ea66d5baa2b4752d20827908d6e107a3d99a35a78ee04e16da8e9f1313a294cb140e24f6df6d4bb77d0aa5ceec481c647df8a0887b1a84b228 languageName: node linkType: hard -"@aws-sdk/core@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/core@npm:3.654.0" +"@aws-sdk/core@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/core@npm:3.658.1" dependencies: - "@smithy/core": ^2.4.3 + "@smithy/core": ^2.4.6 "@smithy/node-config-provider": ^3.1.7 "@smithy/property-provider": ^3.1.6 "@smithy/protocol-http": ^4.1.3 - "@smithy/signature-v4": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/signature-v4": ^4.1.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/util-middleware": ^3.0.6 fast-xml-parser: 4.4.1 tslib: ^2.6.2 - checksum: 9e4b92d0e36aee68856afe09ca11f4f246eb325b3b087da6c2f70d3ef4e268f0fa76e2e77b6fa39021955a3ad933379aa89f48ce3b9b782762d4252f7f61d441 + checksum: 96ee7de9e7fddd11c34f6547fdc434d53443dbd381fa61e1dde9d1cd9c3623aac79537d3288ce86f959d824dfd50b4c05c62ab2680680f3e3dd48084763443fb languageName: node linkType: hard @@ -634,31 +634,31 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.654.0" +"@aws-sdk/credential-provider-http@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/credential-provider-http@npm:3.658.1" dependencies: "@aws-sdk/types": 3.654.0 - "@smithy/fetch-http-handler": ^3.2.7 - "@smithy/node-http-handler": ^3.2.2 + "@smithy/fetch-http-handler": ^3.2.8 + "@smithy/node-http-handler": ^3.2.3 "@smithy/property-provider": ^3.1.6 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 tslib: ^2.6.2 - checksum: 9eac0812e89afd063d66b1d984ca36ff04e53332eda36d12b2f20784f64e0fe0fd60370ab127c4b4a6187fe88cf5b9779b3013b4a3bce7b23ab67da20a3d82a4 + checksum: 4dba2d2f9c06dfa235c3bc674f17e7acb5030096abac6b39021e21b9a61b03659ba0098e65d6ef0b106c8f76dfb19330b79b676efa099f5177e493281762ff39 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.654.0" +"@aws-sdk/credential-provider-ini@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/credential-provider-ini@npm:3.658.1" dependencies: "@aws-sdk/credential-provider-env": 3.654.0 - "@aws-sdk/credential-provider-http": 3.654.0 + "@aws-sdk/credential-provider-http": 3.658.1 "@aws-sdk/credential-provider-process": 3.654.0 - "@aws-sdk/credential-provider-sso": 3.654.0 + "@aws-sdk/credential-provider-sso": 3.658.1 "@aws-sdk/credential-provider-web-identity": 3.654.0 "@aws-sdk/types": 3.654.0 "@smithy/credential-provider-imds": ^3.2.3 @@ -667,20 +667,20 @@ __metadata: "@smithy/types": ^3.4.2 tslib: ^2.6.2 peerDependencies: - "@aws-sdk/client-sts": ^3.654.0 - checksum: a227a95e2fb08937ad7a58edeaf831c79ae38f995bdac2358c8496b3950dea3b77ada198014bd3dd98a9b26ae734067553a7589d1e8c4caad87fd8d159e53a81 + "@aws-sdk/client-sts": ^3.658.1 + checksum: 22a7fa9bc1055b1041eb37b8d9b6bdc17202991798925061bbbaf71c88c10b4378ef72c7794e4da275c9bec86e92a9912f0371fd02f50c92f6b7a628ae2556ba languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.654.0" +"@aws-sdk/credential-provider-node@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/credential-provider-node@npm:3.658.1" dependencies: "@aws-sdk/credential-provider-env": 3.654.0 - "@aws-sdk/credential-provider-http": 3.654.0 - "@aws-sdk/credential-provider-ini": 3.654.0 + "@aws-sdk/credential-provider-http": 3.658.1 + "@aws-sdk/credential-provider-ini": 3.658.1 "@aws-sdk/credential-provider-process": 3.654.0 - "@aws-sdk/credential-provider-sso": 3.654.0 + "@aws-sdk/credential-provider-sso": 3.658.1 "@aws-sdk/credential-provider-web-identity": 3.654.0 "@aws-sdk/types": 3.654.0 "@smithy/credential-provider-imds": ^3.2.3 @@ -688,7 +688,7 @@ __metadata: "@smithy/shared-ini-file-loader": ^3.1.7 "@smithy/types": ^3.4.2 tslib: ^2.6.2 - checksum: e87ab967059c28a8114eac718ac0567b4f1c1f04e502f38e4103a5b2d46836a16f38efbe73f745b428631257329302f4087abce0fe8bead01919d06151743a3d + checksum: 40ef54f3b54a74dba76988554c1c9dff4a51e175338e53f73f44f9a71003334b10e43ece7e9b2200b73db12a3cebcdfdd6052f9d4d93cda954fb3e28215d744d languageName: node linkType: hard @@ -705,18 +705,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.654.0" +"@aws-sdk/credential-provider-sso@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/credential-provider-sso@npm:3.658.1" dependencies: - "@aws-sdk/client-sso": 3.654.0 + "@aws-sdk/client-sso": 3.658.1 "@aws-sdk/token-providers": 3.654.0 "@aws-sdk/types": 3.654.0 "@smithy/property-provider": ^3.1.6 "@smithy/shared-ini-file-loader": ^3.1.7 "@smithy/types": ^3.4.2 tslib: ^2.6.2 - checksum: 3c434ce89101034afb58d757e45a48ab37184ad4823f8318baea26d60773308e3ec9627fbe3ec91d325f4a473133126f401e1311284cbd5315e7007d9d14a055 + checksum: ba73ea979a042a4a9196e607632b8a693ad9511cc3f952481b3fc42cce00e8e1cacee64b12902ef105588a905a4f940c8ba6ce3b1343d8f9dea5354b877f7bd8 languageName: node linkType: hard @@ -785,9 +785,9 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.654.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.658.1" dependencies: "@aws-crypto/crc32": 5.2.0 "@aws-crypto/crc32c": 5.2.0 @@ -799,7 +799,7 @@ __metadata: "@smithy/util-middleware": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: a79192c9400cc13b558a002948ccd782bca4a8ac1ff894081b5bfefbe8f9e49b7afe82c27f775bf2f3a218ed5c661f3a5e649ee4baa17d3dea56f495b0d7ec3e + checksum: 67b8c9d55bc665258b45d5312b96a491929e1549c9e427bb0fd986f4d117d39b1a65e4c01b6ffae985e85d0e16409999ceab95c2b836d7eabf066db6e4836de3 languageName: node linkType: hard @@ -849,25 +849,25 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.654.0" +"@aws-sdk/middleware-sdk-s3@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.658.1" dependencies: - "@aws-sdk/core": 3.654.0 + "@aws-sdk/core": 3.658.1 "@aws-sdk/types": 3.654.0 "@aws-sdk/util-arn-parser": 3.568.0 - "@smithy/core": ^2.4.3 + "@smithy/core": ^2.4.6 "@smithy/node-config-provider": ^3.1.7 "@smithy/protocol-http": ^4.1.3 - "@smithy/signature-v4": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/signature-v4": ^4.1.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/util-config-provider": ^3.0.0 "@smithy/util-middleware": ^3.0.6 - "@smithy/util-stream": ^3.1.6 + "@smithy/util-stream": ^3.1.8 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: 5668d23a1dd23e58159f72518b665af1668385ddf46310f50bc00928b4c1f549ed1d8b057dd8d423581479a3cafa4dac61df438314d0074c31fc822fe551966b + checksum: 0f476ee09a77fb43ecc34f9d25ba5caa74d50ac4e8687f7ff490763f2de798c744a853e95503b4f396fa144680d06ef0982a27c31214f1fd7334af967ae3d6fe languageName: node linkType: hard @@ -910,32 +910,32 @@ __metadata: linkType: hard "@aws-sdk/s3-request-presigner@npm:^3.332.0": - version: 3.654.0 - resolution: "@aws-sdk/s3-request-presigner@npm:3.654.0" + version: 3.658.1 + resolution: "@aws-sdk/s3-request-presigner@npm:3.658.1" dependencies: - "@aws-sdk/signature-v4-multi-region": 3.654.0 + "@aws-sdk/signature-v4-multi-region": 3.658.1 "@aws-sdk/types": 3.654.0 "@aws-sdk/util-format-url": 3.654.0 "@smithy/middleware-endpoint": ^3.1.3 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.2 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 tslib: ^2.6.2 - checksum: d92a8166b825958a11102e11693d640b094758afbab3d868f5e201107cb7778fc9003b2e3c4a077452ec00fb839f2524cd9c651bb9233247df81d37edb9670c9 + checksum: 73fca6dcfd184fa2c33f1f871197153eaeb4efe469753bf45d44981453ad304307c992ecc2f146c9d21c64c5124d68bb33813626e3fd38d8673d3056d7504bfb languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.654.0": - version: 3.654.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.654.0" +"@aws-sdk/signature-v4-multi-region@npm:3.658.1": + version: 3.658.1 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.658.1" dependencies: - "@aws-sdk/middleware-sdk-s3": 3.654.0 + "@aws-sdk/middleware-sdk-s3": 3.658.1 "@aws-sdk/types": 3.654.0 "@smithy/protocol-http": ^4.1.3 - "@smithy/signature-v4": ^4.1.3 + "@smithy/signature-v4": ^4.1.4 "@smithy/types": ^3.4.2 tslib: ^2.6.2 - checksum: 4b670f9f8d9f86341caba62c5de29b321f6e7a99d20d5f284b41ce08b906713c601761767043349768d8b7bbf73658e56302c66d60a4ec856f986e8ee51421a4 + checksum: 90647c4981e08328ff2b720777abd1f26b15f78d2dc02a610679eb4084a54501557504ea47f336d384e0724483be760b062369660fa947013f4b2ab50daa2a27 languageName: node linkType: hard @@ -2241,8 +2241,8 @@ __metadata: linkType: hard "@rollup/plugin-node-resolve@npm:^15.0.0": - version: 15.2.4 - resolution: "@rollup/plugin-node-resolve@npm:15.2.4" + version: 15.3.0 + resolution: "@rollup/plugin-node-resolve@npm:15.3.0" dependencies: "@rollup/pluginutils": ^5.0.1 "@types/resolve": 1.20.2 @@ -2254,13 +2254,13 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 4c03d41bcbb7028432c8c7295ede54051151abdd726360cc089c5fe04d2ec266f961f7be78061aaf289b5294097db35393bfff1d6c01ad24d20471e07753e06c + checksum: 90e4e94b173e7edd57e374ac0cc0a69cc6f1b4507e83731132ac6fa1747d96a5648a48441e4452728429b6db5e67561439b7b2f4d2c6a941a33d38be56d871b4 languageName: node linkType: hard "@rollup/pluginutils@npm:^5.0.1": - version: 5.1.1 - resolution: "@rollup/pluginutils@npm:5.1.1" + version: 5.1.2 + resolution: "@rollup/pluginutils@npm:5.1.2" dependencies: "@types/estree": ^1.0.0 estree-walker: ^2.0.2 @@ -2270,7 +2270,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 0eee2b3fd46b18900e58355ba1ed31a4b5e31ed544874576975ea54be0af8880ee9dfca7132c72e8720ab9cbea0dc24c01063df0e5476346b712d38187520c0d + checksum: 16c8c154fef9a32c513b52bd79c92ac427edccd05a8dc3994f10c296063940c57bf809d05903b473d9d408aa5977d75b98c701f481dd1856d5ffc37187ac0060 languageName: node linkType: hard @@ -2341,21 +2341,21 @@ __metadata: languageName: node linkType: hard -"@smithy/core@npm:^2.4.3": - version: 2.4.5 - resolution: "@smithy/core@npm:2.4.5" +"@smithy/core@npm:^2.4.6": + version: 2.4.6 + resolution: "@smithy/core@npm:2.4.6" dependencies: "@smithy/middleware-endpoint": ^3.1.3 - "@smithy/middleware-retry": ^3.0.20 + "@smithy/middleware-retry": ^3.0.21 "@smithy/middleware-serde": ^3.0.6 "@smithy/protocol-http": ^4.1.3 - "@smithy/smithy-client": ^3.3.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/util-body-length-browser": ^3.0.0 "@smithy/util-middleware": ^3.0.6 "@smithy/util-utf8": ^3.0.0 tslib: ^2.6.2 - checksum: 8abc766d8f6b285c600d0b09330175b9228a24dc73ace22069534c22e29a04629bbb881408e240edefbfdf25d04068b691fff3b3d14dd80dce9242e3042c40b3 + checksum: 3672f8a6ec07c1d666830c8bcafdebcfcbeb112c17bf10feb5f8b413662473a117cff4b4102002cf837ea833e2ca5aed348f66339718ab99ba9ee9d2919a6904 languageName: node linkType: hard @@ -2427,7 +2427,7 @@ __metadata: languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^3.2.7, @smithy/fetch-http-handler@npm:^3.2.8": +"@smithy/fetch-http-handler@npm:^3.2.8": version: 3.2.8 resolution: "@smithy/fetch-http-handler@npm:3.2.8" dependencies: @@ -2540,20 +2540,20 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-retry@npm:^3.0.18, @smithy/middleware-retry@npm:^3.0.20": - version: 3.0.20 - resolution: "@smithy/middleware-retry@npm:3.0.20" +"@smithy/middleware-retry@npm:^3.0.21": + version: 3.0.21 + resolution: "@smithy/middleware-retry@npm:3.0.21" dependencies: "@smithy/node-config-provider": ^3.1.7 "@smithy/protocol-http": ^4.1.3 "@smithy/service-error-classification": ^3.0.6 - "@smithy/smithy-client": ^3.3.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 "@smithy/util-middleware": ^3.0.6 "@smithy/util-retry": ^3.0.6 tslib: ^2.6.2 uuid: ^9.0.1 - checksum: 7d4a623b58e96e4910152b1cd0f03accb2a09491e5b8742cfbc7dc33da73ed65bbb02926c19b5ce8d03c51572af7e5353e7f67098eb4b0a96fe4fbc5a4eea521 + checksum: 82076a537fc12b8b8028317cbb81fdeff8dec82ce353f31808915a0de05ab30e66f9de2e2ae28712e15af3301a7ac9ee5d4a29dd5757c22f8dfdf04cf1a759ff languageName: node linkType: hard @@ -2589,7 +2589,7 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^3.2.2, @smithy/node-http-handler@npm:^3.2.3": +"@smithy/node-http-handler@npm:^3.2.3": version: 3.2.3 resolution: "@smithy/node-http-handler@npm:3.2.3" dependencies: @@ -2662,7 +2662,7 @@ __metadata: languageName: node linkType: hard -"@smithy/signature-v4@npm:^4.1.3": +"@smithy/signature-v4@npm:^4.1.4": version: 4.1.4 resolution: "@smithy/signature-v4@npm:4.1.4" dependencies: @@ -2678,9 +2678,9 @@ __metadata: languageName: node linkType: hard -"@smithy/smithy-client@npm:^3.3.2, @smithy/smithy-client@npm:^3.3.4": - version: 3.3.4 - resolution: "@smithy/smithy-client@npm:3.3.4" +"@smithy/smithy-client@npm:^3.3.5": + version: 3.3.5 + resolution: "@smithy/smithy-client@npm:3.3.5" dependencies: "@smithy/middleware-endpoint": ^3.1.3 "@smithy/middleware-stack": ^3.0.6 @@ -2688,7 +2688,7 @@ __metadata: "@smithy/types": ^3.4.2 "@smithy/util-stream": ^3.1.8 tslib: ^2.6.2 - checksum: 83429123f714dfadf370b550d3126ca739dd83cdb28b93c5c27db9cf790647e43db82fe288e051c7a815020600f6f6aacac0a7f4ea937f94910f9eb87917ec14 + checksum: 573ce9ce9fed3478b6eb102cab064a6f5a3cae7953cd442875aa2a753cb7d9fe28e73a050429b9ea245befe1233da35f3792b50357e647ea8bad214d8efc60ee languageName: node linkType: hard @@ -2770,31 +2770,31 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^3.0.18": - version: 3.0.20 - resolution: "@smithy/util-defaults-mode-browser@npm:3.0.20" +"@smithy/util-defaults-mode-browser@npm:^3.0.21": + version: 3.0.21 + resolution: "@smithy/util-defaults-mode-browser@npm:3.0.21" dependencies: "@smithy/property-provider": ^3.1.6 - "@smithy/smithy-client": ^3.3.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 bowser: ^2.11.0 tslib: ^2.6.2 - checksum: 74ab83a010d9e56917d8bfdf9f67163dbebfc0c7e59b14a4aa4c25251c86fb370111995137a72321bfc0b34ceaf51ac6b6d998d92a8888b568c8bf9d2318b942 + checksum: 83b3bf320c8c0b38791d3cf87429a4c8bf9177a8dd991a55b6f5f95a76967384aff0213a774f36a52af915b7b4c80d9ab9c0417b1361d6dd2ecc8d5bd12ac594 languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^3.0.18": - version: 3.0.20 - resolution: "@smithy/util-defaults-mode-node@npm:3.0.20" +"@smithy/util-defaults-mode-node@npm:^3.0.21": + version: 3.0.21 + resolution: "@smithy/util-defaults-mode-node@npm:3.0.21" dependencies: "@smithy/config-resolver": ^3.0.8 "@smithy/credential-provider-imds": ^3.2.3 "@smithy/node-config-provider": ^3.1.7 "@smithy/property-provider": ^3.1.6 - "@smithy/smithy-client": ^3.3.4 + "@smithy/smithy-client": ^3.3.5 "@smithy/types": ^3.4.2 tslib: ^2.6.2 - checksum: 76cd7a4a6d5b11836e90c5abf246805974f79265ff0f50416007a1865739ed833239f5a31ae0b75d65a6706425226acde157023bc150530c70a4cd872144c1e6 + checksum: 823f29048f29748bf61562224f96fce79982bed78d339b3b1d9ba6a63694c79e8382cb4fd366ad1ca8a9cc5050b563b8fc16e4569d1a46bfdc82b32f04c7e8ae languageName: node linkType: hard @@ -2839,7 +2839,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-stream@npm:^3.1.6, @smithy/util-stream@npm:^3.1.8": +"@smithy/util-stream@npm:^3.1.8": version: 3.1.8 resolution: "@smithy/util-stream@npm:3.1.8" dependencies: @@ -3509,6 +3509,13 @@ __metadata: languageName: node linkType: hard +"@types/ali-oss@npm:^6.16.11": + version: 6.16.11 + resolution: "@types/ali-oss@npm:6.16.11" + checksum: 1932d908edf7d71aef24de60792c4d4cbe3a31a692a785e6a85c13d866ddb3c397eff7875bc169177eef347a194492dc2cab5a127097248aac0f1367d52064da + languageName: node + linkType: hard + "@types/axios@npm:^0.14.0": version: 0.14.0 resolution: "@types/axios@npm:0.14.0" @@ -3586,14 +3593,14 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:^4.17.33": - version: 4.19.5 - resolution: "@types/express-serve-static-core@npm:4.19.5" + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: 72076c2f8df55e89136d4343fc874050d56c0f4afd885772a8aa506b98c3f4f3ddc7dcba42295a8b931c61000234fd679aec79ef50db15f376bf37d46234939a + checksum: b0576eddc2d25ccdf10e68ba09598b87a4d7b2ad04a81dc847cb39fe56beb0b6a5cc017b1e00aa0060cb3b38e700384ce96d291a116a0f1e54895564a104aae9 languageName: node linkType: hard @@ -3694,9 +3701,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.190": - version: 4.17.7 - resolution: "@types/lodash@npm:4.17.7" - checksum: 09e58a119cd8a70acfb33f8623dc2fc54f74cdce3b3429b879fc2daac4807fe376190a04b9e024dd300f9a3ee1876d6623979cefe619f70654ca0fe0c47679a7 + version: 4.17.9 + resolution: "@types/lodash@npm:4.17.9" + checksum: 6d1bf3e77f0a54d97532755a74260d402d8972259c5451b74612c16cb983b73e0760e5bfe4f9e68ab15051511c867812b40715a01f9805afe6bc36c7dd676378 languageName: node linkType: hard @@ -3758,20 +3765,20 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 22.5.5 - resolution: "@types/node@npm:22.5.5" + version: 22.7.3 + resolution: "@types/node@npm:22.7.3" dependencies: undici-types: ~6.19.2 - checksum: 1f788966ff7df07add0af3481fb68c7fe5091cc72a265c671432abb443788ddacca4ca6378af64fe100c20f857c4d80170d358e66c070171fcea0d4adb1b45b1 + checksum: 1785ceb0d7b05b2a68df85ec89f2c76bc57a59f4f7a349966f2f7c8ee531d59dcba1adb4e3fddb19e0981ded96bf255291858e6b56dfe7984247b3a4f1227a22 languageName: node linkType: hard "@types/node@npm:^20.1.1": - version: 20.16.5 - resolution: "@types/node@npm:20.16.5" + version: 20.16.9 + resolution: "@types/node@npm:20.16.9" dependencies: undici-types: ~6.19.2 - checksum: f38b7bd8c4993dcf38943afa2ffdd7dfd18fc94f8f3f28d0c1045a10d39871a6cc1b8f8d3bf0c7ed848457d0e1d283482f6ca125579c13fed1b7575d23e8e8f5 + checksum: 2f0a248cc0ad7e3cdb03c2ff50a3f6c7337c3d0b387a9c4d8a341ee3b3a3ec25846ffd22ca2670a0543d62ec098ece0f1013a441a63e3ed81de1ec8f38ec108e languageName: node linkType: hard @@ -3935,6 +3942,13 @@ __metadata: languageName: node linkType: hard +"address@npm:^1.2.2": + version: 1.2.2 + resolution: "address@npm:1.2.2" + checksum: ace439960c1e3564d8f523aff23a841904bf33a2a7c2e064f7f60a064194075758b9690e65bd9785692a4ef698a998c57eb74d145881a1cecab8ba658ddb1607 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.0, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -3953,6 +3967,15 @@ __metadata: languageName: node linkType: hard +"agentkeepalive@npm:^3.4.1": + version: 3.5.3 + resolution: "agentkeepalive@npm:3.5.3" + dependencies: + humanize-ms: ^1.2.1 + checksum: c56879ca38fcf600ba1cd15ddf3fabd6de6e937a4762bfe6d8b75ac590eb3532ae00b1b986617afd37360e36e4e11d0be8d6612669312fff92a51cf4c3cfca7a + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" @@ -3996,6 +4019,39 @@ __metadata: languageName: node linkType: hard +"ali-oss@npm:^6.20.0": + version: 6.21.0 + resolution: "ali-oss@npm:6.21.0" + dependencies: + address: ^1.2.2 + agentkeepalive: ^3.4.1 + bowser: ^1.6.0 + copy-to: ^2.0.1 + dateformat: ^2.0.0 + debug: ^4.3.4 + destroy: ^1.0.4 + end-or-error: ^1.0.1 + get-ready: ^1.0.0 + humanize-ms: ^1.2.0 + is-type-of: ^1.4.0 + js-base64: ^2.5.2 + jstoxml: ^2.0.0 + lodash: ^4.17.21 + merge-descriptors: ^1.0.1 + mime: ^2.4.5 + platform: ^1.3.1 + pump: ^3.0.0 + qs: ^6.4.0 + sdk-base: ^2.0.1 + stream-http: 2.8.2 + stream-wormhole: ^1.0.4 + urllib: ^2.44.0 + utility: ^1.18.0 + xml2js: ^0.6.2 + checksum: 26424e96c4a927e08d6aa9480a0f9db6da00b0188a7a45672f3244344f5cf6ff81aee72a8e46dcd240c98f168d09e2853ac84ae9e5764bc673b4d959a11a5e51 + languageName: node + linkType: hard + "ansi-escapes@npm:^4.2.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -4051,6 +4107,13 @@ __metadata: languageName: node linkType: hard +"any-promise@npm:^1.0.0, any-promise@npm:^1.3.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de + languageName: node + linkType: hard + "anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -4371,6 +4434,13 @@ __metadata: languageName: node linkType: hard +"bowser@npm:^1.6.0": + version: 1.9.4 + resolution: "bowser@npm:1.9.4" + checksum: 127584ee1b8f0c27f410f652d409ea8bcb23d185a4269bcbe0229069720be9d83dc80a939e0fa33d8a9055141a0cf2fee5a02b2b5515c38841ddc899d67dec8d + languageName: node + linkType: hard + "bowser@npm:^2.11.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" @@ -4407,16 +4477,16 @@ __metadata: linkType: hard "browserslist@npm:^4.23.1": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" + version: 4.24.0 + resolution: "browserslist@npm:4.24.0" dependencies: - caniuse-lite: ^1.0.30001646 - electron-to-chromium: ^1.5.4 + caniuse-lite: ^1.0.30001663 + electron-to-chromium: ^1.5.28 node-releases: ^2.0.18 update-browserslist-db: ^1.1.0 bin: browserslist: cli.js - checksum: 7906064f9970aeb941310b2fcb8b4ace4a1b50aa657c986677c6f1553a8cabcc94ee9c5922f715baffbedaa0e6cf0831b6fed7b059dde6873a4bfadcbe069c7e + checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0 languageName: node linkType: hard @@ -4472,6 +4542,13 @@ __metadata: languageName: node linkType: hard +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: 1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773 + languageName: node + linkType: hard + "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -4566,10 +4643,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001663 - resolution: "caniuse-lite@npm:1.0.30001663" - checksum: 489a642feb6826a0fc7cfd7dbc35a3341cc1439eafdf0dae79338cf9033c5d9eddaedacbef7935acaddbb3c226a51097ed53d66dc6d8128cd6938c6763e1bbc4 +"caniuse-lite@npm:^1.0.30001663": + version: 1.0.30001664 + resolution: "caniuse-lite@npm:1.0.30001664" + checksum: cee25b4ea8a84779b7c9a60c1f9e304f6d99b79ef622b25fbc7873b4e55e8722a1091dd6c8b77bd7723e9f26a84b4a820a50a864989dd477e7ee51dc30461dca languageName: node linkType: hard @@ -4810,7 +4887,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-type@npm:^1.0.2, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 @@ -4838,6 +4915,13 @@ __metadata: languageName: node linkType: hard +"copy-to@npm:^2.0.1": + version: 2.0.1 + resolution: "copy-to@npm:2.0.1" + checksum: 05ea12875bdc96ae053a3b30148e9d992026035ff2bfcc0b615e8d49d1cf8fc3d1f40843f9a4b7b1b6d9118eeebcba31e621076d7de525828aa9c07d22a81dab + languageName: node + linkType: hard + "copyfiles@npm:^2.4.1": version: 2.4.1 resolution: "copyfiles@npm:2.4.1" @@ -4863,7 +4947,7 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:~1.0.0": +"core-util-is@npm:^1.0.2, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 @@ -4970,6 +5054,13 @@ __metadata: languageName: node linkType: hard +"dateformat@npm:^2.0.0": + version: 2.2.0 + resolution: "dateformat@npm:2.2.0" + checksum: 1a276434222757b99ce8ed352188db90ce6667389f32e7ff9565d8715531ff2213454b55fbe06d8fd97fb6f2be095656a95195c9cda9c0738d9aab92a9d59688 + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -5042,6 +5133,15 @@ __metadata: languageName: node linkType: hard +"default-user-agent@npm:^1.0.0": + version: 1.0.0 + resolution: "default-user-agent@npm:1.0.0" + dependencies: + os-name: ~1.0.3 + checksum: b1ef07c8e7de846a66e1e120d7ba11969faa36c8db4af2317f9b64d30e7507d129e3f721c7cc3f531a1719c1ab463d830bf426fbcda87b11defe23689f4d2b60 + languageName: node + linkType: hard + "define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -5086,7 +5186,7 @@ __metadata: languageName: node linkType: hard -"destroy@npm:1.2.0": +"destroy@npm:1.2.0, destroy@npm:^1.0.4": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -5121,6 +5221,13 @@ __metadata: languageName: node linkType: hard +"digest-header@npm:^1.0.0": + version: 1.1.0 + resolution: "digest-header@npm:1.1.0" + checksum: fadbdda75e1cc650e460c8fe2064f74c43cc005d0eab66cc390dd1ae2678cfb41f69f151323fbd3e059e28c941f1b9adc6ea4dbd9c918cb246f34a5eb8e103f0 + languageName: node + linkType: hard + "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -5219,7 +5326,7 @@ __metadata: languageName: node linkType: hard -"ee-first@npm:1.1.1": +"ee-first@npm:1.1.1, ee-first@npm:~1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f @@ -5237,10 +5344,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.27 - resolution: "electron-to-chromium@npm:1.5.27" - checksum: 1a32103306b92732979db40f299e013b94b284a80745c26390ceaee2bf76ef71a4167b1ababc17dc3d24cf4c27d5aa95dcf7c256c55c329164f726553dc9ea9a +"electron-to-chromium@npm:^1.5.28": + version: 1.5.29 + resolution: "electron-to-chromium@npm:1.5.29" + checksum: c1de62aaea88c9b3ba32f8f2703b9d77a81633099a8f61365eaf9855d36e72189dcd99b9c3b8b2804afa403ac2ce0b00c23affa6f19d17b04ce0076f66a546b6 languageName: node linkType: hard @@ -5297,6 +5404,13 @@ __metadata: languageName: node linkType: hard +"end-or-error@npm:^1.0.1": + version: 1.0.1 + resolution: "end-or-error@npm:1.0.1" + checksum: 12d5aaa572e83fd567f999f133f02626f28481f6fc83fb5a9b6610a2cd48cdbbe36491483291bd366ae4073af3a9d6495ffde39ae417cb74b7bbf8d8bd76d7a6 + languageName: node + linkType: hard + "ent@npm:^2.2.0": version: 2.2.1 resolution: "ent@npm:2.2.1" @@ -5352,14 +5466,14 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -5585,6 +5699,15 @@ __metadata: languageName: node linkType: hard +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: ^0.1.0 + checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + "extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -5642,9 +5765,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff + version: 3.0.2 + resolution: "fast-uri@npm:3.0.2" + checksum: ca00aadc84e0ab93a8a1700c386bc7cbeb49f47d9801083c258444eed31221fdf864d68fb48ea8acd7c512bf046b53c09e3aafd6d4bdb9449ed21be29d8d6f75 languageName: node linkType: hard @@ -5813,6 +5936,18 @@ __metadata: languageName: node linkType: hard +"formstream@npm:^1.1.0": + version: 1.5.1 + resolution: "formstream@npm:1.5.1" + dependencies: + destroy: ^1.0.4 + mime: ^2.5.2 + node-hex: ^1.0.1 + pause-stream: ~0.0.11 + checksum: d09e1377e63f7823fa4612f0510a8a0bf84ed6e070dcbf8d5362a9228962f927e950434e5f36590f7aa52087049959e378e9cfb128e65f01655be95adee412bd + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -6002,6 +6137,13 @@ __metadata: languageName: node linkType: hard +"get-ready@npm:^1.0.0, get-ready@npm:~1.0.0": + version: 1.0.0 + resolution: "get-ready@npm:1.0.0" + checksum: a4f3a2d7af3721d03f0f20206d1e6783671c276518ff6837b5f8b5c8fe77c6dad331353fe002c19163e1607fd47d377e5d4e8abbd28616a00ad4072d48840994 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -6337,7 +6479,7 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": +"humanize-ms@npm:^1.2.0, humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" dependencies: @@ -6355,7 +6497,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -6487,6 +6629,13 @@ __metadata: languageName: node linkType: hard +"is-class-hotfix@npm:~0.0.6": + version: 0.0.6 + resolution: "is-class-hotfix@npm:0.0.6" + checksum: 7a0d5f14ef6db81c38f78f53fb08e440068e1ff62d5717fe4af1ca419fa0b68e6559a166c7d9953700e83efc290ef8fa24cf3363382014f9d6a74623d037ad7f + languageName: node + linkType: hard + "is-core-module@npm:^2.13.0": version: 2.15.1 resolution: "is-core-module@npm:2.15.1" @@ -6496,6 +6645,13 @@ __metadata: languageName: node linkType: hard +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -6570,6 +6726,17 @@ __metadata: languageName: node linkType: hard +"is-type-of@npm:^1.4.0": + version: 1.4.0 + resolution: "is-type-of@npm:1.4.0" + dependencies: + core-util-is: ^1.0.2 + is-class-hotfix: ~0.0.6 + isstream: ~0.1.2 + checksum: 9d8ca64d0cb00da0bffe1c52c8883e6a1581377a0152d5a1ddbfcdd46fafac9ad713ad07866de73218160c36217ed482a83a700f52e13dc385f88c50c5fc51fd + languageName: node + linkType: hard + "is@npm:^3.3.0": version: 3.3.0 resolution: "is@npm:3.3.0" @@ -6605,6 +6772,13 @@ __metadata: languageName: node linkType: hard +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963 + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -7143,6 +7317,13 @@ __metadata: languageName: node linkType: hard +"js-base64@npm:^2.5.2": + version: 2.6.4 + resolution: "js-base64@npm:2.6.4" + checksum: 5f4084078d6c46f8529741d110df84b14fac3276b903760c21fa8cc8521370d607325dfe1c1a9fbbeaae1ff8e602665aaeef1362427d8fef704f9e3659472ce8 + languageName: node + linkType: hard + "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -7310,6 +7491,13 @@ __metadata: languageName: node linkType: hard +"jstoxml@npm:^2.0.0": + version: 2.2.9 + resolution: "jstoxml@npm:2.2.9" + checksum: 6a80183a646f415a2e959f31fa2e04f07e538b68daa8d47ebc38ff1576060ac958c76685516d1cc0c213f64acd3d0488f53e7f79db094b7b3a48d2b70acc4edb + languageName: node + linkType: hard + "jwa@npm:^1.4.1": version: 1.4.1 resolution: "jwa@npm:1.4.1" @@ -7550,6 +7738,7 @@ __metadata: "@google-cloud/bigquery": ^6.1.0 "@google-cloud/storage": ^6.10.1 "@supabase/supabase-js": ^2.26.0 + "@types/ali-oss": ^6.16.11 "@types/axios": ^0.14.0 "@types/express": ^4.17.14 "@types/jest": ^29.2.4 @@ -7558,6 +7747,7 @@ __metadata: "@types/morgan": ^1.9.3 "@types/node": ^20.1.1 "@types/node-fetch": ^2.6.2 + ali-oss: ^6.20.0 axios: ^1.7.7 base64-arraybuffer: ^1.0.2 bluebird: ^3.7.2 @@ -7799,7 +7989,7 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.3": +"merge-descriptors@npm:1.0.3, merge-descriptors@npm:^1.0.1": version: 1.0.3 resolution: "merge-descriptors@npm:1.0.3" checksum: 52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 @@ -7862,6 +8052,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^2.4.5, mime@npm:^2.5.2": + version: 2.6.0 + resolution: "mime@npm:2.6.0" + bin: + mime: cli.js + checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862 + languageName: node + linkType: hard + "mime@npm:^3.0.0": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -7930,7 +8129,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3": +"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -8052,6 +8251,17 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -8106,6 +8316,17 @@ __metadata: languageName: node linkType: hard +"mz@npm:^2.7.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: ^1.0.0 + object-assign: ^4.0.1 + thenify-all: ^1.0.0 + checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 + languageName: node + linkType: hard + "nan@npm:^2.14.0, nan@npm:^2.17.0, nan@npm:^2.18.0": version: 2.20.0 resolution: "nan@npm:2.20.0" @@ -8275,6 +8496,13 @@ __metadata: languageName: node linkType: hard +"node-hex@npm:^1.0.1": + version: 1.0.1 + resolution: "node-hex@npm:1.0.1" + checksum: 9053d532859ee7e9653972af77ac7b73edc4f13b9b53d0b96e4045e3ac78ac4460571d4b72ad31e9095be5f7d01e6fd71f268f02ad6029091f8cabae1d4ce4df + languageName: node + linkType: hard + "node-int64@npm:^0.4.0": version: 0.4.0 resolution: "node-int64@npm:0.4.0" @@ -8401,7 +8629,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -8518,6 +8746,29 @@ __metadata: languageName: node linkType: hard +"os-name@npm:~1.0.3": + version: 1.0.3 + resolution: "os-name@npm:1.0.3" + dependencies: + osx-release: ^1.0.0 + win-release: ^1.0.0 + bin: + os-name: cli.js + checksum: 2fc86cc199f8b4992bb00041401c5ab0407e3069e05981f3aa3e5a44cee9b7f22c2b0f5db2c0c1d55656c519884272b5e1e55517358c2e5f728b37dd38f5af78 + languageName: node + linkType: hard + +"osx-release@npm:^1.0.0": + version: 1.1.0 + resolution: "osx-release@npm:1.1.0" + dependencies: + minimist: ^1.1.0 + bin: + osx-release: cli.js + checksum: abd437ef21dbfb04f098acc90112cc92ef10c17213e3fd75f8eba45931bd85f6d564ecade0642fac51acff2015597194a76a11773009a90baeb35a03b1c36b06 + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -8590,9 +8841,9 @@ __metadata: linkType: hard "package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 languageName: node linkType: hard @@ -8660,7 +8911,16 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": +"pause-stream@npm:~0.0.11": + version: 0.0.11 + resolution: "pause-stream@npm:0.0.11" + dependencies: + through: ~2.3 + checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd @@ -8728,6 +8988,13 @@ __metadata: languageName: node linkType: hard +"platform@npm:^1.3.1": + version: 1.3.6 + resolution: "platform@npm:1.3.6" + checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + languageName: node + linkType: hard + "postman-to-openapi@npm:^3.0.1": version: 3.0.1 resolution: "postman-to-openapi@npm:3.0.1" @@ -8998,7 +9265,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.0": +"qs@npm:6.13.0, qs@npm:^6.4.0": version: 6.13.0 resolution: "qs@npm:6.13.0" dependencies: @@ -9082,6 +9349,21 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + "readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" @@ -9118,21 +9400,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:~2.3.6": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -9291,7 +9558,23 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.7.1": +"sax@npm:>=0.6.0": + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 3ad64df16b743f0f2eb7c38ced9692a6d924f1cd07bbe45c39576c2cf50de8290d9d04e7b2228f924c7d05fecc4ec5cf651423278e0c7b63d260c387ef3af84a + languageName: node + linkType: hard + +"sdk-base@npm:^2.0.1": + version: 2.0.1 + resolution: "sdk-base@npm:2.0.1" + dependencies: + get-ready: ~1.0.0 + checksum: 8475cca6182ae16078e863cf251b995ce925710619af1a1adca46a21f0f1a3169dc005051f3041761420c342038712a2e09f67b0e034419a9dbe3b07a2bf8b00 + languageName: node + linkType: hard + +"semver@npm:^5.0.1, semver@npm:^5.7.1": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -9628,6 +9911,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:^1.3.1": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c + languageName: node + linkType: hard + "stream-events@npm:^1.0.5": version: 1.0.5 resolution: "stream-events@npm:1.0.5" @@ -9637,6 +9927,19 @@ __metadata: languageName: node linkType: hard +"stream-http@npm:2.8.2": + version: 2.8.2 + resolution: "stream-http@npm:2.8.2" + dependencies: + builtin-status-codes: ^3.0.0 + inherits: ^2.0.1 + readable-stream: ^2.3.6 + to-arraybuffer: ^1.0.0 + xtend: ^4.0.0 + checksum: d72df90581ba5acb93b84d5e80fda1b40b149c3e0c893193b378dc4cc262dd737c202b0c8b0a8155a063ede8bc719c393e3ea089fd10f29a72d2f64676c990f5 + languageName: node + linkType: hard + "stream-shift@npm:^1.0.2": version: 1.0.3 resolution: "stream-shift@npm:1.0.3" @@ -9644,6 +9947,13 @@ __metadata: languageName: node linkType: hard +"stream-wormhole@npm:^1.0.4": + version: 1.1.0 + resolution: "stream-wormhole@npm:1.1.0" + checksum: cc19e0235c5d031bd530fa83913c807d9525fa4ba33d51691dd822c0726b8b7ef138b34f289d063a3018cddba67d3ba7fd0ecedaa97242a0f1ed2eed3c6a2ab1 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -9923,6 +10233,24 @@ __metadata: languageName: node linkType: hard +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: ">= 3.1.0 < 4" + checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: ^1.0.0 + checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e + languageName: node + linkType: hard + "thread-stream@npm:^2.6.0": version: 2.7.0 resolution: "thread-stream@npm:2.7.0" @@ -9942,6 +10270,13 @@ __metadata: languageName: node linkType: hard +"through@npm:~2.3": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + languageName: node + linkType: hard + "tmp@npm:^0.2.1": version: 0.2.3 resolution: "tmp@npm:0.2.3" @@ -9956,6 +10291,13 @@ __metadata: languageName: node linkType: hard +"to-arraybuffer@npm:^1.0.0": + version: 1.0.1 + resolution: "to-arraybuffer@npm:1.0.1" + checksum: 31433c10b388722729f5da04c6b2a06f40dc84f797bb802a5a171ced1e599454099c6c5bc5118f4b9105e7d049d3ad9d0f71182b77650e4fdb04539695489941 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -10237,6 +10579,15 @@ __metadata: languageName: node linkType: hard +"unescape@npm:^1.0.1": + version: 1.0.1 + resolution: "unescape@npm:1.0.1" + dependencies: + extend-shallow: ^2.0.1 + checksum: 0d89b0f55e08a2843e635f1ccf8472a35b367c41d9a8014dd7de5cc3af710a6e988a950b86b6229e143147ade21772f2d72054bc846f4972eb448df472b856ec + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -10309,16 +10660,41 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" dependencies: - escalade: ^3.1.2 - picocolors: ^1.0.1 + escalade: ^3.2.0 + picocolors: ^1.1.0 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 + checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e + languageName: node + linkType: hard + +"urllib@npm:^2.44.0": + version: 2.44.0 + resolution: "urllib@npm:2.44.0" + dependencies: + any-promise: ^1.3.0 + content-type: ^1.0.2 + default-user-agent: ^1.0.0 + digest-header: ^1.0.0 + ee-first: ~1.1.1 + formstream: ^1.1.0 + humanize-ms: ^1.2.0 + iconv-lite: ^0.6.3 + pump: ^3.0.0 + qs: ^6.4.0 + statuses: ^1.3.1 + utility: ^1.16.1 + peerDependencies: + proxy-agent: ^5.0.0 + peerDependenciesMeta: + proxy-agent: + optional: true + checksum: 208a5fa89857bbd64bcad9a8a02624deeb78f853a4e57c83a08168daab602992cd5eef3a1628531ef53da5b1a2885a4bba07c4b6fcb052b8c09310479e630e1a languageName: node linkType: hard @@ -10329,6 +10705,19 @@ __metadata: languageName: node linkType: hard +"utility@npm:^1.16.1, utility@npm:^1.18.0": + version: 1.18.0 + resolution: "utility@npm:1.18.0" + dependencies: + copy-to: ^2.0.1 + escape-html: ^1.0.3 + mkdirp: ^0.5.1 + mz: ^2.7.0 + unescape: ^1.0.1 + checksum: 7cf4a75fa9adebba0740aa5d3f19ed0fbbd99bb1e7a2d0c30152ae144ccf45f272febdbbf01564cc980582cacc300fa4843ac19a633a50fa6d8e5adfc74d0138 + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -10487,6 +10876,15 @@ __metadata: languageName: node linkType: hard +"win-release@npm:^1.0.0": + version: 1.1.1 + resolution: "win-release@npm:1.1.1" + dependencies: + semver: ^5.0.1 + checksum: 8943898cc4badaf8598342d63093e49ae9a64c140cf190e81472d3a8890f3387b8408181412e1b58658fe7777ce5d1e3f02eee4beeaee49909d1d17a72d52fc1 + languageName: node + linkType: hard + "word-wrap@npm:~1.2.3": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -10548,6 +10946,23 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:^0.6.2": + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "xmlcreate@npm:^2.0.4": version: 2.0.4 resolution: "xmlcreate@npm:2.0.4" @@ -10562,7 +10977,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~4.0.1": +"xtend@npm:^4.0.0, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a diff --git a/translations/locales/en.js b/translations/locales/en.js index 240d494af..aafb078ed 100644 --- a/translations/locales/en.js +++ b/translations/locales/en.js @@ -196,6 +196,10 @@ export const en = { "textOverflow": "Text Overflow", "scrollbar": "Show Scrollbars", "siderScrollbar": "Show Scrollbars in Sider", + "mainScrollbar": "Show Scrollbars in main content", + "modalScrollbar": "Show Scrollbars in Modal", + "drawerScrollbar": "Show Scrollbars in Drawer", + "textAreaScrollBar": "Show Scrollbars in Text Area", "siderRight": "Show sider on the Right", "siderWidth": "Sider Width", "siderWidthTooltip": "Sider width supports percentages (%) and pixels (px).", diff --git a/translations/locales/en.ts b/translations/locales/en.ts index 418b180c9..75c7036bb 100644 --- a/translations/locales/en.ts +++ b/translations/locales/en.ts @@ -201,6 +201,10 @@ export const en = { "textOverflow": "Text Overflow", "scrollbar": "Show Scrollbars", "siderScrollbar" : "Show Scrollbars in Sider", + "mainScrollbar": "Show Scrollbars in main content", + "modalScrollbar": "Show Scrollbars in Modal", + "drawerScrollbar": "Show Scrollbars in Drawer", + "textAreaScrollBar": "Show Scrollbars in Text Area", "siderRight" : "Show sider on the Right", "siderWidth" : "Sider Width", "siderWidthTooltip" : "Sider width supports percentages (%) and pixels (px).",