From d4c81c2eb4887dee310c4bb231b822fbb117fe10 Mon Sep 17 00:00:00 2001 From: Zzm0809 Date: Sat, 23 Nov 2024 02:22:15 +0000 Subject: [PATCH 01/45] Spotless Apply --- dinky-web/src/models/UseWebSocketModel.tsx | 2 +- .../CenterTabContent/SqlTask/index.tsx | 9 ++++----- .../DataStudio/Toolbar/Project/function.tsx | 6 ++++-- .../DataStudio/Toolbar/Project/index.tsx | 2 +- .../DataStudio/Toolbar/Service/index.tsx | 20 +++++++++++-------- dinky-web/src/pages/DevOps/JobList/index.tsx | 2 +- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/dinky-web/src/models/UseWebSocketModel.tsx b/dinky-web/src/models/UseWebSocketModel.tsx index 3ceda5dbba..677534eb36 100644 --- a/dinky-web/src/models/UseWebSocketModel.tsx +++ b/dinky-web/src/models/UseWebSocketModel.tsx @@ -33,7 +33,7 @@ export enum Topic { PROCESS_CONSOLE = 'PROCESS_CONSOLE', PRINT_TABLE = 'PRINT_TABLE', METRICS = 'METRICS', - TASK_RUN_INSTANCE = 'TASK_RUN_INSTANCE', + TASK_RUN_INSTANCE = 'TASK_RUN_INSTANCE' } export type SubscriberData = { diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index 08c80e7d69..2534e38f19 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -78,7 +78,7 @@ import CodeEdit from '@/components/CustomEditor/CodeEdit'; import DiffModal from '@/pages/DataStudio/CenterTabContent/SqlTask/DiffModal'; import TaskConfig from '@/pages/DataStudio/CenterTabContent/SqlTask/TaskConfig'; import SelectDb from '@/pages/DataStudio/CenterTabContent/RunToolbar/SelectDb'; -import {SseData, Topic} from "@/models/UseWebSocketModel"; +import { SseData, Topic } from '@/models/UseWebSocketModel'; export type FlinkSqlProps = { showDesc: boolean; @@ -388,7 +388,7 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { const handleSubmit = useCallback(async () => { setIsSubmitting(true); try { - if(currentState.step !== JOB_LIFE_CYCLE.PUBLISH){ + if (currentState.step !== JOB_LIFE_CYCLE.PUBLISH) { await handleSave(); } updateAction({ @@ -677,8 +677,7 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { /> { showDesc={showDesc} color={'red'} desc={l('pages.datastudio.editor.stop')} - icon={} + icon={} onClick={handleStop} hotKey={{ ...hotKeyConfig, diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Project/function.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Project/function.tsx index c1fc1e923c..658799ec6c 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Project/function.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Project/function.tsx @@ -232,7 +232,7 @@ export const buildProjectTree = ( currentUser: UserBaseInfo.User, taskOwnerLockingStrategy: TaskOwnerLockingStrategy, users: UserBaseInfo.User[] = [], - currentRunningTaskIds: number[] = [], + currentRunningTaskIds: number[] = [] ): any => data ? data.map((item: Catalogue) => { @@ -256,7 +256,9 @@ export const buildProjectTree = ( // 渲染后缀图标 const renderSuffixIcon = ( <> - {currentRunningTaskIds.includes(item.taskId)?:undefined} + {currentRunningTaskIds.includes(item.taskId) ? ( + + ) : undefined} {lockTask( item?.task?.firstLevelOwner, item?.task?.secondLevelOwners, diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Project/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Project/index.tsx index b6fba6a9b2..cee586c51e 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Project/index.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Project/index.tsx @@ -44,7 +44,7 @@ import { useRightContext } from '@/pages/DataStudio/Toolbar/Project/RightContext import { TreeVo } from '@/pages/DataStudio/type'; import FolderModal from '@/pages/DataStudio/Toolbar/Project/FolderModal'; import { getTaskSortTypeData } from '@/pages/DataStudio/service'; -import {SseData, Topic} from "@/models/UseWebSocketModel"; +import { SseData, Topic } from '@/models/UseWebSocketModel'; export const Project = (props: any) => { const { diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx index 883460ab7a..c8f12a862c 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx @@ -56,7 +56,7 @@ import { assert } from '@/pages/DataStudio/utils'; import { connect } from '@umijs/max'; import { Lineage } from '@/pages/DataStudio/Toolbar/Service/Lineage'; import { useModel } from '@umijs/max'; -import {SseData, Topic} from "@/models/UseWebSocketModel"; +import { SseData, Topic } from '@/models/UseWebSocketModel'; const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) => { const { @@ -207,10 +207,14 @@ const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) = ) as TreeDataNode; } currentDialectTree.children!!.push({ - title: ( - {tab.title} - {currentRunningTaskIds.includes(tab.params.taskId)?:undefined} - ), + title: ( + + {tab.title} + {currentRunningTaskIds.includes(tab.params.taskId) ? ( + + ) : undefined} + + ), key: tab.params.taskId, icon: icon, isLeaf: true @@ -224,7 +228,7 @@ const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) = expandKeys.length == 0 && setExpandKeys(getAllNodeKeys(newTreeData)); }, [tabs, currentRunningTaskIds]); - const renderContent = useMemo(() => { + const renderContent = useMemo(() => { if (selectedKey.length === 1) { const taskId = selectedKey[0] as number; const taskParams = tabs.find((tab) => tab.params.taskId === taskId)?.params; @@ -260,7 +264,7 @@ const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) = key: 'history', label: l('menu.datastudio.history'), icon: , - children: + children: }); } if (assert(taskParams?.dialect, [DIALECT.FLINK_SQL], true, 'includes')) { @@ -288,7 +292,7 @@ const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) = /> ); } - },[tabs, selectedKey, props.action, tabActiveKey]); + }, [tabs, selectedKey, props.action, tabActiveKey]); return ( diff --git a/dinky-web/src/pages/DevOps/JobList/index.tsx b/dinky-web/src/pages/DevOps/JobList/index.tsx index d1625390e9..5127c08e34 100644 --- a/dinky-web/src/pages/DevOps/JobList/index.tsx +++ b/dinky-web/src/pages/DevOps/JobList/index.tsx @@ -54,7 +54,7 @@ import { buildProjectTree } from '@/pages/DataStudio/Toolbar/Project/function'; import { showFirstLevelOwner, showSecondLevelOwners } from '@/pages/DataStudio/function'; import { generateList, getLeafKeyList, searchInTree } from '@/utils/treeUtils'; import { mapDispatchToProps } from '@/pages/DataStudio/DvaFunction'; -import {SseData, Topic} from "@/models/UseWebSocketModel"; +import { SseData, Topic } from '@/models/UseWebSocketModel'; const { DirectoryTree } = Tree; From a7c2dacf0271c7ccbee04e87672e355de2d9d741 Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Wed, 27 Nov 2024 18:17:01 +0800 Subject: [PATCH 02/45] feat: Add a logical deletion field. --- .../java/org/dinky/data/model/Dashboard.java | 5 + .../java/org/dinky/data/model/LoginLog.java | 5 +- .../java/org/dinky/data/model/Metrics.java | 5 + .../java/org/dinky/data/model/OperateLog.java | 5 + .../java/org/dinky/data/model/Resources.java | 5 + .../java/org/dinky/data/model/Savepoints.java | 5 + .../java/org/dinky/data/model/SysToken.java | 2 + .../org/dinky/data/model/TaskVersion.java | 5 + .../dinky/data/model/alert/AlertHistory.java | 5 + .../org/dinky/data/model/job/History.java | 5 + .../org/dinky/data/model/job/JobHistory.java | 5 + .../org/dinky/data/model/job/JobInstance.java | 5 + .../java/org/dinky/data/model/rbac/Role.java | 6 - .../org/dinky/data/model/rbac/Tenant.java | 3 - .../java/org/dinky/data/model/rbac/User.java | 5 - .../dinky/mybatis/model/DateBaseEntity.java | 5 + .../org/dinky/mybatis/model/SuperEntity.java | 9 +- .../main/java/org/dinky/utils/SqliteUtil.java | 32 +- .../migration/h2/V20241127.1.3.0__release.sql | 125 ++++++++ .../mysql/V20241127.1.3.0__release.sql | 82 +++++ .../pgsql/V20241127.1.3.0__release.sql | 79 +++++ .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 288 +++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- .../flink/catalog/DinkyMysqlCatalog.java | 275 ++++++++--------- 28 files changed, 1339 insertions(+), 1002 deletions(-) create mode 100644 dinky-admin/src/main/resources/db/migration/h2/V20241127.1.3.0__release.sql create mode 100644 dinky-admin/src/main/resources/db/migration/mysql/V20241127.1.3.0__release.sql create mode 100644 dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql diff --git a/dinky-admin/src/main/java/org/dinky/data/model/Dashboard.java b/dinky-admin/src/main/java/org/dinky/data/model/Dashboard.java index afe120f0b3..5e387c7e96 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/Dashboard.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/Dashboard.java @@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -59,6 +60,10 @@ public class Dashboard extends Model { @ApiModelProperty(value = "Layouts", dataType = "String", example = "[]", notes = "Layouts of the metrics") private String layouts; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(fill = FieldFill.INSERT) @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) diff --git a/dinky-admin/src/main/java/org/dinky/data/model/LoginLog.java b/dinky-admin/src/main/java/org/dinky/data/model/LoginLog.java index 8876bc75d4..2764ad45f6 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/LoginLog.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/LoginLog.java @@ -34,7 +34,9 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +@EqualsAndHashCode(callSuper = true) @Data @ApiModel(value = "LoginLog", description = "Login Log Information") @TableName("dinky_sys_login_log") @@ -85,9 +87,6 @@ public class LoginLog extends DateBaseEntity implements Serializable { @ApiModelProperty(value = "Message", dataType = "String", notes = "Additional message or details about the login") private String msg; - @ApiModelProperty(value = "Is Deleted", dataType = "Boolean", notes = "Flag indicating if the login log is deleted") - private Boolean isDeleted; - @ApiModelProperty(value = "Access Time", dataType = "String", notes = "Timestamp indicating the time of login") private LocalDateTime accessTime; } diff --git a/dinky-admin/src/main/java/org/dinky/data/model/Metrics.java b/dinky-admin/src/main/java/org/dinky/data/model/Metrics.java index e2def9d4dc..4c6335567d 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/Metrics.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/Metrics.java @@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -93,6 +94,10 @@ public class Metrics extends Model { notes = "Timestamp indicating the last update time of the metrics") private LocalDateTime updateTime; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/dinky-admin/src/main/java/org/dinky/data/model/OperateLog.java b/dinky-admin/src/main/java/org/dinky/data/model/OperateLog.java index 43612b5340..9a5ee304f4 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/OperateLog.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/OperateLog.java @@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -49,6 +50,10 @@ public class OperateLog implements Serializable { notes = "Name of the operation module") private String moduleName; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @ApiModelProperty( value = "Business Type", dataType = "Integer", diff --git a/dinky-admin/src/main/java/org/dinky/data/model/Resources.java b/dinky-admin/src/main/java/org/dinky/data/model/Resources.java index ecbc133b4a..84b6a5bd40 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/Resources.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/Resources.java @@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.annotation.JsonFormat; @@ -105,6 +106,10 @@ public class Resources extends Model { notes = "Flag indicating if the resource is a directory") private Boolean isDirectory; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(fill = FieldFill.INSERT) @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) diff --git a/dinky-admin/src/main/java/org/dinky/data/model/Savepoints.java b/dinky-admin/src/main/java/org/dinky/data/model/Savepoints.java index 10e010a721..94bdc7d6e8 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/Savepoints.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/Savepoints.java @@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -95,6 +96,10 @@ public class Savepoints implements Serializable { notes = "Timestamp indicating the creation time of the savepoint") private LocalDateTime createTime; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "Creator", dataType = "String", notes = "Creator of the savepoint") private Integer creator; diff --git a/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java b/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java index 122d98ba04..3db7513236 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java @@ -19,6 +19,7 @@ package org.dinky.data.model; +import lombok.EqualsAndHashCode; import org.dinky.mybatis.model.DateBaseEntity; import java.io.Serializable; @@ -39,6 +40,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor diff --git a/dinky-admin/src/main/java/org/dinky/data/model/TaskVersion.java b/dinky-admin/src/main/java/org/dinky/data/model/TaskVersion.java index 442a4dc5ca..90b3f13d4e 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/TaskVersion.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/TaskVersion.java @@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -60,6 +61,10 @@ public class TaskVersion implements Serializable { @TableField(value = "task_id") private Integer taskId; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @ApiModelProperty(value = "Version ID", dataType = "Integer", notes = "ID of the version") @TableField(value = "version_id") private Integer versionId; diff --git a/dinky-admin/src/main/java/org/dinky/data/model/alert/AlertHistory.java b/dinky-admin/src/main/java/org/dinky/data/model/alert/AlertHistory.java index dcd0da6cc5..3812a7d177 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/alert/AlertHistory.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/alert/AlertHistory.java @@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -85,6 +86,10 @@ public class AlertHistory implements Serializable { @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime createTime; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value = "Update Time", example = "2022-02-24 20:12:00", dataType = "LocalDateTime") @JsonDeserialize(using = LocalDateTimeDeserializer.class) diff --git a/dinky-admin/src/main/java/org/dinky/data/model/job/History.java b/dinky-admin/src/main/java/org/dinky/data/model/job/History.java index 542544e6da..08bde90f87 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/job/History.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/job/History.java @@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -129,6 +130,10 @@ public class History implements Serializable { @ApiModelProperty(value = "Group by count", dataType = "Integer") private Long count; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @ApiModelProperty(hidden = true) public JobInstance buildJobInstance() { JobInstance jobInstance = new JobInstance(); diff --git a/dinky-admin/src/main/java/org/dinky/data/model/job/JobHistory.java b/dinky-admin/src/main/java/org/dinky/data/model/job/JobHistory.java index 6e10950f35..302d830d79 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/job/JobHistory.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/job/JobHistory.java @@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -81,6 +82,10 @@ public class JobHistory implements Serializable { @TableField(typeHandler = JSONObjectHandler.class) private FlinkJobDetailInfo jobJson; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @ApiModelProperty( value = "Exceptions JSON", dataType = "String", diff --git a/dinky-admin/src/main/java/org/dinky/data/model/job/JobInstance.java b/dinky-admin/src/main/java/org/dinky/data/model/job/JobInstance.java index 60a056708e..22aaeafd9c 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/job/JobInstance.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/job/JobInstance.java @@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -103,6 +104,10 @@ public class JobInstance implements Serializable { @ApiModelProperty(value = "Error", dataType = "String", notes = "Error message associated with the job instance") private String error; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) @JsonDeserialize(using = LocalDateTimeDeserializer.class) diff --git a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Role.java b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Role.java index 225bbac902..fbd1b2b00c 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Role.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Role.java @@ -63,12 +63,6 @@ public class Role extends DateBaseEntity implements Serializable { @ApiModelProperty(value = "Role Name", dataType = "String", example = "Administrator", notes = "Name of the role") private String roleName; - @ApiModelProperty( - value = "Is Delete", - dataType = "Boolean", - notes = "Flag indicating if the role is marked as deleted") - private Boolean isDelete; - @ApiModelProperty(value = "Note", dataType = "String", notes = "Additional notes or details about the role") private String note; diff --git a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java index b2e453aabb..227e3686c1 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java @@ -53,7 +53,4 @@ public class Tenant extends DateBaseEntity implements Serializable { @ApiModelProperty(value = "Tenant Note", required = true, dataType = "String", example = "Default") private String note; - /** is delete */ - @ApiModelProperty(value = "Is Delete", required = true, dataType = "Boolean", example = "false") - private Boolean isDelete; } diff --git a/dinky-admin/src/main/java/org/dinky/data/model/rbac/User.java b/dinky-admin/src/main/java/org/dinky/data/model/rbac/User.java index 1c93871f7b..16221fcd61 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/rbac/User.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/rbac/User.java @@ -29,7 +29,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; @@ -80,10 +79,6 @@ public class User extends DateBaseEntity implements Serializable { @ApiModelProperty(value = "Enabled", dataType = "Boolean", notes = "Whether the user is enabled") private Boolean enabled; - @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") - @TableLogic - private Boolean isDelete; - @ApiModelProperty(value = "Super Admin Flag", dataType = "Boolean", notes = "Whether the user is a super admin") private Boolean superAdminFlag; diff --git a/dinky-admin/src/main/java/org/dinky/mybatis/model/DateBaseEntity.java b/dinky-admin/src/main/java/org/dinky/mybatis/model/DateBaseEntity.java index 15df518f81..7eb742da2f 100644 --- a/dinky-admin/src/main/java/org/dinky/mybatis/model/DateBaseEntity.java +++ b/dinky-admin/src/main/java/org/dinky/mybatis/model/DateBaseEntity.java @@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -56,6 +57,10 @@ public class DateBaseEntity> extends Model { example = "2021-05-28 00:00:00") private LocalDateTime createTime; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @TableField(fill = FieldFill.INSERT_UPDATE) @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) diff --git a/dinky-admin/src/main/java/org/dinky/mybatis/model/SuperEntity.java b/dinky-admin/src/main/java/org/dinky/mybatis/model/SuperEntity.java index 8ec726cf04..c42c2a1ed7 100644 --- a/dinky-admin/src/main/java/org/dinky/mybatis/model/SuperEntity.java +++ b/dinky-admin/src/main/java/org/dinky/mybatis/model/SuperEntity.java @@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -51,7 +52,9 @@ @ApiModel(value = "SuperEntity", description = "Super Base Entity", parent = Model.class) public class SuperEntity> extends Model { - /** 主键ID */ + /** + * 主键ID + */ @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", required = true, dataType = "Integer", example = "1", notes = "Primary Key") private Integer id; @@ -96,6 +99,10 @@ public class SuperEntity> extends Model { @ApiModelProperty(value = "Updater", required = true, dataType = "String", example = "Updater") private Integer updater; + @ApiModelProperty(value = "Is Delete", dataType = "Boolean", notes = "Whether the user is deleted") + @TableLogic + private Boolean isDelete; + @Override public Serializable pkVal() { return this.id; diff --git a/dinky-admin/src/main/java/org/dinky/utils/SqliteUtil.java b/dinky-admin/src/main/java/org/dinky/utils/SqliteUtil.java index 328aeb71d1..87e863ac67 100644 --- a/dinky-admin/src/main/java/org/dinky/utils/SqliteUtil.java +++ b/dinky-admin/src/main/java/org/dinky/utils/SqliteUtil.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -35,12 +36,12 @@ public enum SqliteUtil { INSTANCE; private Connection connection; - private final AtomicLong lastRecyle = new AtomicLong(0); + private final AtomicLong lastRecycle = new AtomicLong(0); static { try { SqliteUtil.INSTANCE.connect("dinky.db"); - SqliteUtil.INSTANCE.recyleData(); + SqliteUtil.INSTANCE.recycleData(); } catch (SQLException e) { throw new RuntimeException(e); } @@ -56,28 +57,28 @@ public void createTable(String tableName, String columns) { try (Statement stmt = connection.createStatement()) { stmt.execute(sql); } catch (SQLException e) { - log.error("Failed to create table: " + e.getMessage()); + log.error("Failed to create table: {}", e.getMessage()); } } public void executeSql(String sql) throws SQLException { - Statement pstmt = connection.createStatement(); - pstmt.executeUpdate(sql); + Statement stmt = connection.createStatement(); + stmt.executeUpdate(sql); connection.commit(); } - public void recyleData() { + public void recycleData() { long now = System.currentTimeMillis(); - if (now - lastRecyle.get() < 1000 * 60 * 60) { + if (now - lastRecycle.get() < 1000 * 60 * 60) { return; } - lastRecyle.set(now); + lastRecycle.set(now); try { String sql = "DELETE FROM dinky_metrics WHERE heart_time <= datetime('now', '-7 days')"; executeSql(sql); executeSql("VACUUM"); } catch (SQLException e) { - log.error("Failed to recyle database: " + e.getMessage()); + log.error("Failed to recycle database: {}", e.getMessage()); } } @@ -95,9 +96,9 @@ public void write(String tableName, List columns, List> val pstmt.executeBatch(); connection.commit(); } catch (SQLException e) { - log.error("Failed to write to SQLite: " + e.getMessage()); + log.error("Failed to write to SQLite: {}", e.getMessage()); } - recyleData(); + recycleData(); } private static String createInsertSql(String tableName, List columns) { @@ -130,6 +131,7 @@ public void close() throws SQLException { } } + @Getter public static class PreparedResultSet implements AutoCloseable { private final PreparedStatement pstmt; private final ResultSet rs; @@ -139,14 +141,6 @@ public PreparedResultSet(PreparedStatement pstmt, ResultSet rs) { this.rs = rs; } - public PreparedStatement getPstmt() { - return pstmt; - } - - public ResultSet getRs() { - return rs; - } - @Override public void close() throws Exception { pstmt.close(); diff --git a/dinky-admin/src/main/resources/db/migration/h2/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/h2/V20241127.1.3.0__release.sql new file mode 100644 index 0000000000..69ca7ed76b --- /dev/null +++ b/dinky-admin/src/main/resources/db/migration/h2/V20241127.1.3.0__release.sql @@ -0,0 +1,125 @@ +ALTER TABLE `dinky_alert_history` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_history` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_job_history` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_job_instance` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_sys_menu` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_sys_role_menu` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_row_permissions` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_user_role` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_user_tenant` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_udf_manage` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_udf_template` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_catalogue` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_cluster_configuration` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_cluster` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_dashboard` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_database` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + + +ALTER TABLE `dinky_flink_document` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_fragment` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_git_project` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_metrics` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_sys_operate_log` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_resources` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_savepoints` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_sys_token` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_task` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_task_version` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_alert_group` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_alert_instance` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_alert_rules` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_alert_template` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `dinky_sys_login_log` + CHANGE COLUMN `is_deleted` `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_column` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_database` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_database_property` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_function` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_table` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE `metadata_table_property` + ADD COLUMN `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +ALTER TABLE metadata_column + ADD UNIQUE INDEX unx_metadata_column (table_id, column_name, is_delete) USING BTREE; +ALTER TABLE metadata_database + ADD UNIQUE INDEX unx_metadata_database (database_name, is_delete) USING BTREE; +ALTER TABLE metadata_database_property + ADD UNIQUE INDEX unx_metadata_database_property (database_id, `key`, is_delete) USING BTREE; +ALTER TABLE metadata_function + ADD UNIQUE INDEX unx_metadata_function (`function_name`, `database_id`, `is_delete`) USING BTREE; +ALTER TABLE metadata_table + ADD UNIQUE INDEX unx_metadata_table (`table_name`, `database_id`, `is_delete`) USING BTREE; +ALTER TABLE metadata_table_property + ADD UNIQUE INDEX unx_metadata_table_property (table_id, `key`, is_delete) USING BTREE; + diff --git a/dinky-admin/src/main/resources/db/migration/mysql/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/mysql/V20241127.1.3.0__release.sql new file mode 100644 index 0000000000..c38db327e8 --- /dev/null +++ b/dinky-admin/src/main/resources/db/migration/mysql/V20241127.1.3.0__release.sql @@ -0,0 +1,82 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL add_column_if_not_exists('dinky_alert_history', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_history', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_job_history', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_job_instance', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_sys_menu', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_sys_role_menu', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_row_permissions', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_user_role', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_user_tenant', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_udf_manage', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_udf_template', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_catalogue', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_cluster_configuration', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_cluster', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_dashboard', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_database', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_flink_document', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_fragment', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_git_project', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_metrics', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_sys_operate_log', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_resources', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_savepoints', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_sys_token', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_task', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_task_version', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_alert_group', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_alert_instance', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_alert_rules', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +CALL add_column_if_not_exists('dinky_alert_template', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +ALTER TABLE `dinky_sys_login_log` + CHANGE COLUMN `is_deleted` `is_delete` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'is delete 0: false, 1: true'; + +CALL add_column_if_not_exists('metadata_column', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); +CALL add_column_if_not_exists('metadata_database', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); +CALL add_column_if_not_exists('metadata_database_property', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); +CALL add_column_if_not_exists('metadata_function', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); +CALL add_column_if_not_exists('metadata_table', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); +CALL add_column_if_not_exists('metadata_table_property', 'is_delete', 'tinyint(1)', '0', 'is delete 0: false, 1: true', null); + +ALTER TABLE metadata_column ADD UNIQUE INDEX unx_metadata_column(table_id, column_name, is_delete) USING BTREE; +ALTER TABLE metadata_database ADD UNIQUE INDEX unx_metadata_database(database_name, is_delete) USING BTREE; +ALTER TABLE metadata_database_property ADD UNIQUE INDEX unx_metadata_database_property(database_id, `key`, is_delete) USING BTREE; +ALTER TABLE metadata_function ADD UNIQUE INDEX unx_metadata_function(`function_name`, `database_id`, `is_delete`) USING BTREE; +ALTER TABLE metadata_table ADD UNIQUE INDEX unx_metadata_table(`table_name`, `database_id`, `is_delete`) USING BTREE; +ALTER TABLE metadata_table_property ADD UNIQUE INDEX unx_metadata_table_property(table_id, `key`, is_delete) USING BTREE; + + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql new file mode 100644 index 0000000000..779db8e1b7 --- /dev/null +++ b/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql @@ -0,0 +1,79 @@ + +SELECT add_column_if_not_exists('public','dinky_alert_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_job_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_job_instance', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_sys_menu', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_sys_role_menu', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_row_permissions', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_user_role', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_user_tenant', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_udf_manage', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_udf_template', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_catalogue', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_cluster_configuration', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_cluster', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_dashboard', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_database', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_flink_document', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_fragment', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_git_project', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_metrics', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_sys_operate_log', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_resources', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_savepoints', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_sys_token', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_task', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_task_version', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_alert_group', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_alert_instance', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_alert_rules', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','dinky_alert_template', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +-- 删除 is_deleted 字段 +ALTER TABLE public.dinky_alert_history DROP COLUMN IF EXISTS is_deleted; +SELECT add_column_if_not_exists('public','dinky_sys_login_log', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + +SELECT add_column_if_not_exists('public','metadata_column', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); +SELECT add_column_if_not_exists('public','metadata_database', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); +SELECT add_column_if_not_exists('public','metadata_database_property', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); +SELECT add_column_if_not_exists('public','metadata_function', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); +SELECT add_column_if_not_exists('public','metadata_table', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); +SELECT add_column_if_not_exists('public','metadata_table_property', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); + + +CREATE UNIQUE INDEX unx_metadata_column ON metadata_column (table_id, column_name, is_delete); +CREATE UNIQUE INDEX unx_metadata_database ON metadata_database (database_name, is_delete); +CREATE UNIQUE INDEX unx_metadata_database_property ON metadata_database_property (database_id, key, is_delete); +CREATE UNIQUE INDEX unx_metadata_function ON metadata_function (function_name, database_id, is_delete); +CREATE UNIQUE INDEX unx_metadata_table ON metadata_table (table_name, database_id, is_delete); +CREATE UNIQUE INDEX unx_metadata_table_property ON metadata_table_property (table_id, key, is_delete); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index b1824877a3..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,77 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -177,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -233,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -251,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -263,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -292,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -304,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -325,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -341,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -355,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -364,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -379,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -389,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -407,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -415,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -428,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -453,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -476,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -497,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -510,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -526,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -540,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -556,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -583,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -603,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -630,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -667,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -675,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -692,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -720,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -729,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -759,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -776,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -805,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -836,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -845,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -885,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -903,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -914,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -928,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -939,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -955,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -971,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1014,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1030,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1038,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1054,38 +1056,38 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { throw new TableNotExistException(getName(), tablePath); } - /*if (!isPartitionedTable(tablePath)) { - CatalogTableStatistics result = tableStats.get(tablePath); - return result != null ? result.copy() : CatalogTableStatistics.UNKNOWN; - } else { - return CatalogTableStatistics.UNKNOWN; - }*/ + /* + * if (!isPartitionedTable(tablePath)) { CatalogTableStatistics result = tableStats.get(tablePath); return + * result != null ? result.copy() : CatalogTableStatistics.UNKNOWN; } else { return + * CatalogTableStatistics.UNKNOWN; } + */ return CatalogTableStatistics.UNKNOWN; } @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1100,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1146,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 12da5b2767..82a8cab17a 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,6 +22,7 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; +import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,8 +75,7 @@ import org.slf4j.LoggerFactory; /** - * 自定义 catalog 检查connection done. 默认db,会被强制指定,不管输入的是什么,都会指定为 default_database - * 可以读取配置文件信息来获取数据库连接,而不是在sql语句中强制指定。 + * DinkyMysqlCatalog is a catalog implementation for MySQL. */ public class DinkyMysqlCatalog extends AbstractCatalog { @@ -89,79 +89,87 @@ public class DinkyMysqlCatalog extends AbstractCatalog { try { Class.forName(MYSQL_DRIVER); } catch (ClassNotFoundException e) { - throw new CatalogException("未加载 mysql 驱动!", e); + throw new CatalogException("Failed to load MySQL driver: " + MYSQL_DRIVER, e); } } private static final String COMMENT = "comment"; - /** 判断是否发生过SQL异常,如果发生过,那么conn可能失效。要注意判断 */ + /** Determine whether an SQL exception has occurred, and if so, conn may fail. Pay attention to judgment + */ private boolean sqlExceptionHappened = false; - /** 对象类型,例如 库、表、视图等 */ + /** Object types, such as libraries, tables, views, etc. + */ protected static class ObjectType { - /** 数据库 */ + /** + * Database + * */ public static final String DATABASE = "database"; - /** 数据表 */ + /** + * Table + * */ public static final String TABLE = "TABLE"; - /** 视图 */ + /** View */ public static final String VIEW = "VIEW"; } - /** 对象类型,例如 库、表、视图等 */ + /** + * + * object type, such as library, table, view, etc. + * + * */ protected static class ColumnType { - /** 物理字段 */ + /** physical field + */ public static final String PHYSICAL = "physical"; - /** 计算字段 */ + /** computed field + */ public static final String COMPUTED = "computed"; - /** 元数据字段 */ + /** + * metadata field + * */ public static final String METADATA = "metadata"; - /** 水印 */ + /** + * watermark field + * + * */ public static final String WATERMARK = "watermark"; } - /** 数据库用户名 */ - private final String user; - /** 数据库密码 */ - private final String pwd; - /** 数据库连接 */ - private final String url; - - /** 默认database */ - private static final String defaultDatabase = "default_database"; - - /** - * 数据库用户名 + /** 数据库用户名 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUser() { - return user; - } - - /** - * 数据库密码 + @Getter + private final String user; + /** 数据库密码 + * -- GETTER -- + * 数据库密码 * * @return 数据库密码 */ - public String getPwd() { - return pwd; - } - - /** - * 数据库用户名 + @Getter + private final String pwd; + /** 数据库连接 + * -- GETTER -- + * 数据库用户名 * * @return 数据库用户名 */ - public String getUrl() { - return url; - } + @Getter + private final String url; + + /** 默认database */ + private static final String defaultDatabase = "default_database"; public DinkyMysqlCatalog(String name, String url, String user, String pwd) { super(name, defaultDatabase); @@ -179,14 +187,13 @@ public DinkyMysqlCatalog(String name) { @Override public void open() throws CatalogException { - // 验证连接是否有效 - // 获取默认db看看是否存在 + Integer defaultDbId = getDatabaseId(defaultDatabase); if (defaultDbId == null) { try { createDatabase(defaultDatabase, new CatalogDatabaseImpl(new HashMap<>(), ""), true); } catch (DatabaseAlreadyExistException a) { - logger.info("重复创建默认库"); + logger.info("The default database already exists"); } } } @@ -235,7 +242,7 @@ protected Connection getConnection() throws CatalogException { @Override public List listDatabases() throws CatalogException { List myDatabases = new ArrayList<>(); - String querySql = "SELECT database_name FROM metadata_database"; + String querySql = "SELECT database_name FROM metadata_database WHERE is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { @@ -253,7 +260,7 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description " + " FROM metadata_database where database_name=?"; + String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -265,7 +272,7 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` " + "from metadata_database_property " + "where database_id=? "; + String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -294,7 +301,7 @@ public boolean databaseExists(String databaseName) throws CatalogException { } private Integer getDatabaseId(String databaseName) throws CatalogException { - String querySql = "select id from metadata_database where database_name=?"; + String querySql = "select id from metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -306,13 +313,13 @@ private Integer getDatabaseId(String databaseName) throws CatalogException { id = rs.getInt(1); multiDB = true; } else { - throw new CatalogException("存在多个同名database: " + databaseName); + throw new CatalogException("the database name is not unique"); } } return id; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException(String.format("获取 database 信息失败:%s.%s", getName(), databaseName), e); + throw new CatalogException(String.format("get database info fail:%s.%s", getName(), databaseName), e); } } @@ -327,9 +334,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno throw new DatabaseAlreadyExistException(getName(), databaseName); } } else { - // 在这里实现创建库的代码 Connection conn = getConnection(); - // 启动事务 String insertSql = "insert into metadata_database(database_name, description) values(?, ?)"; try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) { @@ -343,7 +348,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno && db.getProperties().size() > 0) { int id = idRs.getInt(1); String propInsertSql = - "insert into metadata_database_property(database_id, " + "`key`,`value`) values (?,?,?)"; + "insert into metadata_database_property(database_id, `key`,`value`) values (?,?,?)"; PreparedStatement pstat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : db.getProperties().entrySet()) { pstat.setInt(1, id); @@ -357,7 +362,7 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - logger.error("创建 database 信息失败:", e); + logger.error("create database info failed:", e); } } } @@ -366,9 +371,9 @@ public void createDatabase(String databaseName, CatalogDatabase db, boolean igno public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) throws DatabaseNotExistException, DatabaseNotEmptyException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以删除"); + throw new CatalogException("the default database can't be deleted"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -381,7 +386,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.setAutoCommit(false); // 查询是否有表 List tables = listTables(name); - if (tables.size() > 0) { + if (!tables.isEmpty()) { if (!cascade) { // 有表,不做级联删除。 throw new DatabaseNotEmptyException(getName(), name); @@ -391,17 +396,16 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade try { dropTable(new ObjectPath(name, table), true); } catch (TableNotExistException t) { - logger.warn("表{}不存在", name + "." + table); + logger.warn("table {} is not exits", name + "." + table); } } } - // todo: 现在是真实删除,后续设计是否做记录保留。 - String deletePropSql = "delete from metadata_database_property where database_id=?"; + String deletePropSql = "update metadata_database set is_delete=1 where id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_database where id=?"; + String deleteDbSql = "update metadata_database set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -409,7 +413,7 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 database 信息失败:", e); + throw new CatalogException("drop database failed:", e); } } @@ -417,9 +421,9 @@ public void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNotExists) throws DatabaseNotExistException, CatalogException { if (name.equals(defaultDatabase)) { - throw new CatalogException("默认 database 不可以修改"); + throw new CatalogException("the default database can't be altered"); } - // 1、取出db id, + Integer id = getDatabaseId(name); if (id == null) { if (!ignoreIfNotExists) { @@ -430,8 +434,8 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo Connection conn = getConnection(); try { conn.setAutoCommit(false); - // 1、名称不能改,类型不能改。只能改备注 - String updateCommentSql = "update metadata_database set description=? where id=?"; + + String updateCommentSql = "update metadata_database set description=? where id=? and is_delete = 0"; PreparedStatement uState = conn.prepareStatement(updateCommentSql); uState.setString(1, newDb.getComment()); uState.setInt(2, id); @@ -455,7 +459,7 @@ public void alterDatabase(String name, CatalogDatabase newDb, boolean ignoreIfNo conn.commit(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 database 信息失败:", e); + throw new CatalogException("alert database info failed:", e); } } @@ -478,7 +482,7 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ?"; + String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -499,10 +503,6 @@ protected List listTablesViews(String databaseName, String tableType) @Override public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // 还是分步骤来 - // 1、先取出表 这可能是view也可能是table - // 2、取出列 - // 3、取出属性 Integer id = getTableId(tablePath); if (id == null) { @@ -512,7 +512,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep Connection conn = getConnection(); try { String queryTable = - "SELECT table_name " + " ,description, table_type " + " FROM metadata_table " + " where id=?"; + "SELECT table_name ,description, table_type FROM metadata_table where id=? and is_delete = 0"; PreparedStatement ps = conn.prepareStatement(queryTable); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); @@ -528,7 +528,7 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property " + "WHERE table_id=?"; + String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -542,11 +542,10 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep props.put(COMMENT, description); return CatalogTable.fromProperties(props); } else if (tableType.equals(ObjectType.VIEW)) { - // 1、从库中取出table信息。(前面已做) - // 2、取出字段。 + String colSql = "SELECT column_name, column_type, data_type, description " + " FROM metadata_column WHERE " - + " table_id=?"; + + " table_id=? and is_delete = 0"; PreparedStatement cStat = conn.prepareStatement(colSql); cStat.setInt(1, id); ResultSet crs = cStat.executeQuery(); @@ -558,13 +557,13 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep builder.column(colName, dataType); String cDesc = crs.getString("description"); - if (null != cDesc && cDesc.length() > 0) { + if (null != cDesc && !cDesc.isEmpty()) { builder.withComment(cDesc); } } cStat.close(); // 3、取出query - String qSql = "SELECT `key`, value FROM metadata_table_property" + " WHERE table_id=? "; + String qSql = "SELECT `key`, value FROM metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement qStat = conn.prepareStatement(qSql); qStat.setInt(1, id); ResultSet qrs = qStat.executeQuery(); @@ -585,11 +584,11 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep // 合成view return CatalogView.of(builder.build(), description, originalQuery, expandedQuery, options); } else { - throw new CatalogException("不支持的数据类型。" + tableType); + throw new CatalogException("an unsupported data type。" + tableType); } } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 表信息失败。", e); + throw new CatalogException("Failed to obtain table information。", e); } } @@ -605,7 +604,7 @@ private Integer getTableId(ObjectPath tablePath) { return null; } // 获取id - String getIdSql = "select id from metadata_table " + " where table_name=? and database_id=?"; + String getIdSql = "select id from metadata_table where table_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, tablePath.getObjectName()); @@ -632,19 +631,20 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) } Connection conn = getConnection(); try { - // todo: 现在是真实删除,后续设计是否做记录保留。 conn.setAutoCommit(false); - String deletePropSql = "delete from metadata_table_property " + " where table_id=?"; + + String deletePropSql = "update metadata_table_property set is_delete=1 where table_id=?"; PreparedStatement dStat = conn.prepareStatement(deletePropSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteColSql = "delete from metadata_column " + " where table_id=?"; + String deleteColSql = "update metadata_column set is_delete=1 where table_id=?"; dStat = conn.prepareStatement(deleteColSql); dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); - String deleteDbSql = "delete from metadata_table " + " where id=?"; +// String deleteDbSql = "delete from metadata_table " + " where id=?"; + String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); dStat.executeUpdate(); @@ -669,7 +669,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor if (tableExists(newPath)) { throw new TableAlreadyExistException(getName(), newPath); } - String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=?"; + String updateSql = "UPDATE metadata_table SET table_name=? WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(updateSql)) { ps.setString(1, newTableName); @@ -677,7 +677,7 @@ public void renameTable(ObjectPath tablePath, String newTableName, boolean ignor ps.executeUpdate(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } @@ -694,12 +694,12 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - // 插入表 - // 插入到table表。这里,它可能是table也可能是view - // 如果是一个table,我们认为它是一个 resolved table,就可以使用properties方式来进行序列化并保存。 - // 如果是一个view,我们认为它只能有物理字段 + //Insert table + //Insert into the table table. Here, it could be a table or a view + //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. + //If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("暂时不支持输入非 ResolvedCatalogBaseTable 类型的表"); + throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -722,7 +722,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig ResultSet idRs = iStat.getGeneratedKeys(); if (!idRs.next()) { iStat.close(); - throw new CatalogException("插入元数据表信息失败"); + throw new CatalogException("Failed to insert metadata table information"); } int id = idRs.getInt(1); iStat.close(); @@ -731,7 +731,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); String propInsertSql = - "insert into metadata_table_property(table_id," + "`key`,`value`) values (?,?,?)"; + "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -761,7 +761,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig Schema.UnresolvedPhysicalColumn pCol = (Schema.UnresolvedPhysicalColumn) col; if (!(pCol.getDataType() instanceof DataType)) { throw new UnsupportedOperationException(String.format( - "类型识别失败,该列不是有效类型:%s.%s.%s : %s", + "Type identification failed. The column is not a valid type:%s.%s.%s : %s", tablePath.getDatabaseName(), tablePath.getObjectName(), pCol.getName(), @@ -778,7 +778,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("暂时认为view 不会出现 非物理字段"); + throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -807,8 +807,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig conn.commit(); } catch (SQLException ex) { sqlExceptionHappened = true; - logger.error("插入数据库失败", ex); - throw new CatalogException("插入数据库失败", ex); + logger.error("Failed to insert database\n", ex); + throw new CatalogException("Failed to insert database\n", ex); } } @@ -838,7 +838,7 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ps.executeBatch(); } catch (SQLException ex) { sqlExceptionHappened = true; - throw new CatalogException("修改表名失败", ex); + throw new CatalogException("Failed to modify table name", ex); } } } @@ -847,36 +847,36 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean @Override public List listPartitions(ObjectPath tablePath) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitions(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public List listPartitionsByFilter(ObjectPath tablePath, List filters) throws TableNotExistException, TableNotPartitionedException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public CatalogPartition getPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public boolean partitionExists(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -887,15 +887,15 @@ public void createPartition( boolean ignoreIfExists) throws TableNotExistException, TableNotPartitionedException, PartitionSpecInvalidException, PartitionAlreadyExistsException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override public void dropPartition(ObjectPath tablePath, CatalogPartitionSpec partitionSpec, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } @Override @@ -905,8 +905,8 @@ public void alterPartition( CatalogPartition newPartition, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。 + throw new UnsupportedOperationException("The method is not yet complete\n"); } /** *********************Functions********************* */ @@ -916,7 +916,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio if (null == dbId) { throw new DatabaseNotExistException(getName(), dbName); } - String querySql = "SELECT function_name from metadata_function " + " WHERE database_id=?"; + String querySql = "SELECT function_name from metadata_function WHERE database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { @@ -930,7 +930,7 @@ public List listFunctions(String dbName) throws DatabaseNotExistExceptio return functions; } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("获取 UDF 列表失败"); + throw new CatalogException("Failed to get UDF list", e); } } @@ -941,7 +941,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx throw new FunctionNotExistException(getName(), functionPath); } - String querySql = "SELECT class_name,function_language from metadata_function " + " WHERE id=?"; + String querySql = "SELECT class_name,function_language from metadata_function WHERE id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(querySql)) { gStat.setInt(1, id); @@ -957,7 +957,7 @@ public CatalogFunction getFunction(ObjectPath functionPath) throws FunctionNotEx } catch (SQLException e) { sqlExceptionHappened = true; throw new CatalogException( - "获取 UDF 失败:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); + "Failed to get UDF list:" + functionPath.getDatabaseName() + "." + functionPath.getObjectName()); } } @@ -973,7 +973,7 @@ private Integer getFunctionId(ObjectPath functionPath) { return null; } // 获取id - String getIdSql = "select id from metadata_function " + " where function_name=? and database_id=?"; + String getIdSql = "select id from metadata_function where function_name=? and database_id=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement gStat = conn.prepareStatement(getIdSql)) { gStat.setString(1, functionPath.getObjectName()); @@ -1016,7 +1016,7 @@ public void createFunction(ObjectPath functionPath, CatalogFunction function, bo ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("创建 函数 失败", e); + throw new CatalogException("Failed to create function", e); } } @@ -1032,7 +1032,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function " + "set (class_name =?, function_language=?) " + " where id=?"; + String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1040,7 +1040,7 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("修改 函数 失败", e); + throw new CatalogException("Failed to modify function", e); } } @@ -1056,20 +1056,21 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); - String insertSql = "delete from metadata_function " + " where id=?"; +// String insertSql = "delete from metadata_function " + " where id=?"; + String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { sqlExceptionHappened = true; - throw new CatalogException("删除 函数 失败", e); + throw new CatalogException("drop function fail.", e); } } @Override public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1086,7 +1087,7 @@ public CatalogTableStatistics getTableStatistics(ObjectPath tablePath) @Override public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 + // todo: The method is not yet complete。。 checkNotNull(tablePath); if (!tableExists(tablePath)) { @@ -1101,32 +1102,32 @@ public CatalogColumnStatistics getTableColumnStatistics(ObjectPath tablePath) @Override public CatalogTableStatistics getPartitionStatistics(ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public CatalogColumnStatistics getPartitionColumnStatistics( ObjectPath tablePath, CatalogPartitionSpec partitionSpec) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableStatistics( ObjectPath tablePath, CatalogTableStatistics tableStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override public void alterTableColumnStatistics( ObjectPath tablePath, CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws TableNotExistException, CatalogException, TablePartitionedException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } @Override @@ -1147,7 +1148,7 @@ public void alterPartitionColumnStatistics( CatalogColumnStatistics columnStatistics, boolean ignoreIfNotExists) throws PartitionNotExistException, CatalogException { - // todo: 补充完成该方法。 - throw new UnsupportedOperationException("该方法尚未完成"); + // todo: The method is not yet complete。。 + throw new UnsupportedOperationException("The method is not yet complete。"); } } From a6d8ed264aea9206f8908d9c0e191e4bc74e00f0 Mon Sep 17 00:00:00 2001 From: Zzm0809 Date: Wed, 27 Nov 2024 10:18:03 +0000 Subject: [PATCH 03/45] Spotless Apply --- .../java/org/dinky/data/model/SysToken.java | 2 +- .../org/dinky/data/model/rbac/Tenant.java | 1 - .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- .../flink/catalog/DinkyMysqlCatalog.java | 40 +++++++++++-------- 9 files changed, 169 insertions(+), 114 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java b/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java index 3db7513236..e9e7b37bfd 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/SysToken.java @@ -19,7 +19,6 @@ package org.dinky.data.model; -import lombok.EqualsAndHashCode; import org.dinky.mybatis.model.DateBaseEntity; import java.io.Serializable; @@ -37,6 +36,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java index 227e3686c1..b81ba246a4 100644 --- a/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java +++ b/dinky-admin/src/main/java/org/dinky/data/model/rbac/Tenant.java @@ -52,5 +52,4 @@ public class Tenant extends DateBaseEntity implements Serializable { /** note */ @ApiModelProperty(value = "Tenant Note", required = true, dataType = "String", example = "Default") private String note; - } diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.14/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.15/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.16/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.17/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.18/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.19/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); diff --git a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java index 82a8cab17a..83b7835b52 100644 --- a/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java +++ b/dinky-catalog/dinky-catalog-mysql/dinky-catalog-mysql-1.20/src/main/java/org/dinky/flink/catalog/DinkyMysqlCatalog.java @@ -22,7 +22,6 @@ import static org.apache.flink.util.Preconditions.checkArgument; import static org.apache.flink.util.Preconditions.checkNotNull; -import lombok.Getter; import org.dinky.flink.catalog.factory.DinkyMysqlCatalogFactoryOptions; import org.apache.flink.table.api.Schema; @@ -74,6 +73,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import lombok.Getter; + /** * DinkyMysqlCatalog is a catalog implementation for MySQL. */ @@ -260,7 +261,8 @@ public List listDatabases() throws CatalogException { @Override public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistException, CatalogException { - String querySql = "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; + String querySql = + "SELECT id, database_name,description FROM metadata_database where database_name=? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, databaseName); @@ -272,7 +274,8 @@ public CatalogDatabase getDatabase(String databaseName) throws DatabaseNotExistE Map map = new HashMap<>(); - String sql = "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; + String sql = + "select `key`,`value` from metadata_database_property where database_id=? and is_delete = 0"; try (PreparedStatement pStat = conn.prepareStatement(sql)) { pStat.setInt(1, id); ResultSet prs = pStat.executeQuery(); @@ -482,7 +485,8 @@ protected List listTablesViews(String databaseName, String tableType) // get all schemas // 要给出table 或 view - String querySql = "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; + String querySql = + "SELECT table_name FROM metadata_table where table_type=? and database_id = ? and is_delete = 0"; Connection conn = getConnection(); try (PreparedStatement ps = conn.prepareStatement(querySql)) { ps.setString(1, tableType); @@ -528,7 +532,8 @@ public CatalogBaseTable getTable(ObjectPath tablePath) throws TableNotExistExcep } if (tableType.equals(ObjectType.TABLE)) { // 这个是 table - String propSql = "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; + String propSql = + "SELECT `key`, `value` from metadata_table_property WHERE table_id=? and is_delete = 0"; PreparedStatement pState = conn.prepareStatement(propSql); pState.setInt(1, id); ResultSet prs = pState.executeQuery(); @@ -643,7 +648,7 @@ public void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) dStat.setInt(1, id); dStat.executeUpdate(); dStat.close(); -// String deleteDbSql = "delete from metadata_table " + " where id=?"; + // String deleteDbSql = "delete from metadata_table " + " where id=?"; String deleteDbSql = "update metadata_table set is_delete=1 where id=?"; dStat = conn.prepareStatement(deleteDbSql); dStat.setInt(1, id); @@ -694,12 +699,14 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig } return; } - //Insert table - //Insert into the table table. Here, it could be a table or a view - //If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save it. - //If it is a view, we think it can only have physical fields + // Insert table + // Insert into the table table. Here, it could be a table or a view + // If it is a table, we think it is a resolved table, so we can use the properties method to serialize and save + // it. + // If it is a view, we think it can only have physical fields if (!(table instanceof ResolvedCatalogBaseTable)) { - throw new UnsupportedOperationException("Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); + throw new UnsupportedOperationException( + "Entering tables of non-ResolvedCatalogBaseTable types is temporarily not supported"); } Connection conn = getConnection(); try { @@ -730,8 +737,7 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig if (table instanceof ResolvedCatalogTable) { // table 就可以直接拿properties了。 Map props = ((ResolvedCatalogTable) table).toProperties(); - String propInsertSql = - "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; + String propInsertSql = "insert into metadata_table_property(table_id, `key`,`value`) values (?,?,?)"; PreparedStatement pStat = conn.prepareStatement(propInsertSql); for (Map.Entry entry : props.entrySet()) { pStat.setInt(1, id); @@ -778,7 +784,8 @@ public void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ig colIStat.setObject(7, null); // view没有主键 colIStat.addBatch(); } else { - throw new UnsupportedOperationException("Temporarily, it is believed that non-physical fields will not appear in view"); + throw new UnsupportedOperationException( + "Temporarily, it is believed that non-physical fields will not appear in view"); } } colIStat.executeBatch(); @@ -1032,7 +1039,8 @@ public void alterFunction(ObjectPath functionPath, CatalogFunction newFunction, } Connection conn = getConnection(); - String insertSql = "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; + String insertSql = + "update metadata_function set (class_name =?, function_language=?) " + " where id=? and is_delete = 0"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setString(1, newFunction.getClassName()); ps.setString(2, newFunction.getFunctionLanguage().toString()); @@ -1056,7 +1064,7 @@ public void dropFunction(ObjectPath functionPath, boolean ignoreIfNotExists) } Connection conn = getConnection(); -// String insertSql = "delete from metadata_function " + " where id=?"; + // String insertSql = "delete from metadata_function " + " where id=?"; String insertSql = "update metadata_function set is_delete = 1 where id=?"; try (PreparedStatement ps = conn.prepareStatement(insertSql)) { ps.setInt(1, id); From 87be271da93355a6179689dd9e93db8724afb047 Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Wed, 27 Nov 2024 18:19:55 +0800 Subject: [PATCH 04/45] pref: Optimized down button icon --- .../resources/db/migration/pgsql/V20241127.1.3.0__release.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql index 779db8e1b7..d5b522e889 100644 --- a/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql +++ b/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql @@ -59,7 +59,6 @@ SELECT add_column_if_not_exists('public','dinky_alert_rules', 'is_delete', 'BOOL SELECT add_column_if_not_exists('public','dinky_alert_template', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); --- 删除 is_deleted 字段 ALTER TABLE public.dinky_alert_history DROP COLUMN IF EXISTS is_deleted; SELECT add_column_if_not_exists('public','dinky_sys_login_log', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); From 25199f7685789c362a71e81b131f1bb0f0a52a48 Mon Sep 17 00:00:00 2001 From: gaoyan Date: Wed, 27 Nov 2024 18:09:26 +0800 Subject: [PATCH 05/45] [Optimize][Web]Click the Tasks tab to switch to Service Synchronization (#3965) Co-authored-by: gaoyan1998 --- .../DataStudio/CenterTabContent/SqlTask/index.tsx | 10 ++++++++++ dinky-web/src/pages/DataStudio/data.d.tsx | 3 ++- dinky-web/src/pages/DataStudio/index.tsx | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index 87d6141132..a426ab24a0 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -252,6 +252,16 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { } }); observer.observe(element); + + const key = Number(id.replace('project_', '')); + updateAction({ + actionType: DataStudioActionType.TASK_TAB_CHANGE, + params: { + taskId: params.taskId, + key: key + } + }); + return () => { observer.unobserve(element); }; diff --git a/dinky-web/src/pages/DataStudio/data.d.tsx b/dinky-web/src/pages/DataStudio/data.d.tsx index d148dd6f75..7f737e18a5 100644 --- a/dinky-web/src/pages/DataStudio/data.d.tsx +++ b/dinky-web/src/pages/DataStudio/data.d.tsx @@ -59,5 +59,6 @@ export enum DataStudioActionType { TASK_RUN_SUBMIT = 'task-run-submit', TASK_PREVIEW_RESULT = 'task-preview-result', TASK_RUN_DEBUG = 'task-run-debug', - TASK_RUN_LOCATION = 'task-run-location' + TASK_RUN_LOCATION = 'task-run-location', + TASK_TAB_CHANGE = 'task-tab-change' } diff --git a/dinky-web/src/pages/DataStudio/index.tsx b/dinky-web/src/pages/DataStudio/index.tsx index 55106b6990..8ef1ff4c95 100644 --- a/dinky-web/src/pages/DataStudio/index.tsx +++ b/dinky-web/src/pages/DataStudio/index.tsx @@ -579,6 +579,21 @@ const DataStudio: React.FC = (props: any) => { dropMode={'edge'} style={{ position: 'absolute', left: 0, top: 0, right: 0, bottom: 0 }} onLayoutChange={async (newLayout, currentTabId, direction) => { + if (currentTabId && direction == 'active') { + const tableData = (dataStudioState.centerContent.tabs as CenterTab[]).find( + (x) => x.id === currentTabId + ); + if (tableData) { + const key = Number(currentTabId.replace('project_', '')); + updateAction({ + actionType: DataStudioActionType.TASK_TAB_CHANGE, + params: { + taskId: tableData.params.taskId, + key: key + } + }); + } + } // todo 这里移到方向会导致布局和算法异常,先暂时规避掉 if ( direction === 'left' || From 1d08cf3f8a17267023ed3e799f60bc7c4eb74740 Mon Sep 17 00:00:00 2001 From: gaoyan Date: Wed, 27 Nov 2024 18:32:45 +0800 Subject: [PATCH 06/45] [Bug] Fix the route redirection error on the welcome page (#3966) --- dinky-web/src/pages/Other/Welcome/WelcomeItem/FinishPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dinky-web/src/pages/Other/Welcome/WelcomeItem/FinishPage.tsx b/dinky-web/src/pages/Other/Welcome/WelcomeItem/FinishPage.tsx index 6c7f3d3078..10d8ff6602 100644 --- a/dinky-web/src/pages/Other/Welcome/WelcomeItem/FinishPage.tsx +++ b/dinky-web/src/pages/Other/Welcome/WelcomeItem/FinishPage.tsx @@ -27,7 +27,7 @@ const FinishPage = () => { title={l('welcome.finish.title')} subTitle={l('welcome.finish')} extra={[ - ]} From 20a44c4301471dba2c5874b3cbff5a791e4ed153 Mon Sep 17 00:00:00 2001 From: zhangyuhang <2827528315@qq.com> Date: Wed, 27 Nov 2024 21:04:54 +0800 Subject: [PATCH 07/45] [Optimization][dinky-getaway] Delete the previously failed cluster when resubmitting the task. (#3969) Co-authored-by: yuhang2.zhang --- .../apache/flink/kubernetes/KubernetesClusterDescriptor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dinky-client/dinky-client-1.18/src/main/java/org/apache/flink/kubernetes/KubernetesClusterDescriptor.java b/dinky-client/dinky-client-1.18/src/main/java/org/apache/flink/kubernetes/KubernetesClusterDescriptor.java index 41b782176a..27ed7870ae 100644 --- a/dinky-client/dinky-client-1.18/src/main/java/org/apache/flink/kubernetes/KubernetesClusterDescriptor.java +++ b/dinky-client/dinky-client-1.18/src/main/java/org/apache/flink/kubernetes/KubernetesClusterDescriptor.java @@ -171,7 +171,8 @@ public ClusterClientProvider deployApplicationCluster( throws ClusterDeploymentException { if (client.getService(ExternalServiceDecorator.getExternalServiceName(clusterId)) .isPresent()) { - throw new ClusterDeploymentException("The Flink cluster " + clusterId + " already exists."); + client.stopAndCleanupCluster(clusterId); + LOG.warn("The Flink cluster {} already exists, automatically stopAndCleanupCluster.", clusterId); } checkNotNull(clusterSpecification); From 1ee757c266fccdc714ac7ffdb38957117c6488f3 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Wed, 27 Nov 2024 22:23:24 +0800 Subject: [PATCH 08/45] [BugFix][Flink]Fix the Flink task to submit the session mode. (#3967) --- .../src/main/java/org/dinky/executor/Executor.java | 2 +- .../main/java/org/dinky/job/runner/JobDDLRunner.java | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/dinky-core/src/main/java/org/dinky/executor/Executor.java b/dinky-core/src/main/java/org/dinky/executor/Executor.java index 181aa712d9..acf43bf1d3 100644 --- a/dinky-core/src/main/java/org/dinky/executor/Executor.java +++ b/dinky-core/src/main/java/org/dinky/executor/Executor.java @@ -275,7 +275,7 @@ public void initPyUDF(String executable, String... udfPyFilePath) { private void addJar(String... jarPath) { Configuration configuration = tableEnvironment.getRootConfiguration(); List jars = configuration.get(PipelineOptions.JARS); - if (jars == null) { + if (CollUtil.isEmpty(jars)) { tableEnvironment.addConfiguration(PipelineOptions.JARS, CollUtil.newArrayList(jarPath)); } else { CollUtil.addAll(jars, jarPath); diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java index e7e1ebe615..c46fff071a 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java @@ -143,22 +143,25 @@ public SqlExplainResult explain(JobStatement jobStatement) { } private void executeAdd(String statement) { - AddJarSqlParseStrategy.getAllFilePath(statement) - .forEach(t -> jobManager.getUdfPathContextHolder().addOtherPlugins(t)); + Set allFilePath = AddJarSqlParseStrategy.getAllFilePath(statement); + allFilePath.forEach(t -> jobManager.getUdfPathContextHolder().addOtherPlugins(t)); (jobManager.getExecutor().getDinkyClassLoader()) .addURLs(URLUtils.getURLs(jobManager.getUdfPathContextHolder().getOtherPluginsFiles())); } private void executeAddFile(String statement) { - AddFileSqlParseStrategy.getAllFilePath(statement) - .forEach(t -> jobManager.getUdfPathContextHolder().addFile(t)); + Set allFilePath = AddFileSqlParseStrategy.getAllFilePath(statement); + allFilePath.forEach(t -> jobManager.getUdfPathContextHolder().addFile(t)); (jobManager.getExecutor().getDinkyClassLoader()) .addURLs(URLUtils.getURLs(jobManager.getUdfPathContextHolder().getFiles())); + jobManager.getExecutor().addJar(ArrayUtil.toArray(allFilePath, File.class)); } private void executeAddJar(String statement) { + Set allFilePath = AddFileSqlParseStrategy.getAllFilePath(statement); Configuration combinationConfig = getCombinationConfig(); FileSystem.initialize(combinationConfig, null); + jobManager.getExecutor().addJar(ArrayUtil.toArray(allFilePath, File.class)); jobManager.getExecutor().executeSql(statement); } From 4d0ffb2811c9a1ba2aceaa30de4ae97bace47040 Mon Sep 17 00:00:00 2001 From: gaoyan Date: Wed, 27 Nov 2024 22:26:32 +0800 Subject: [PATCH 09/45] [Bug][Web]Fix web npe (#3970) Co-authored-by: gaoyan1998 --- dinky-web/package-lock.json | 5286 ++--------------- .../Toolbar/Service/Result/index.tsx | 2 +- 2 files changed, 351 insertions(+), 4937 deletions(-) diff --git a/dinky-web/package-lock.json b/dinky-web/package-lock.json index 107f51ed5b..344429dbf3 100644 --- a/dinky-web/package-lock.json +++ b/dinky-web/package-lock.json @@ -361,32 +361,6 @@ "pino": "7.11.0" } }, - "node_modules/@alita/plugins/node_modules/dva": { - "version": "2.5.0-beta.2", - "resolved": "https://registry.npmmirror.com/dva/-/dva-2.5.0-beta.2.tgz", - "integrity": "sha512-kc2+CHhF1cNIU3Rg1miMhHgOKJ/VDrq9d6ynVBZf1EN2YKWU3MVFq/uTTBqMr2qkR0m9f8VKHOFmfKLtfMI93Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "@types/isomorphic-fetch": "^0.0.34", - "@types/react-router-dom": "^4.2.7", - "@types/react-router-redux": "^5.0.13", - "dva-core": "^1.5.0-beta.2", - "global": "^4.3.2", - "history": "^4.6.3", - "invariant": "^2.2.2", - "isomorphic-fetch": "^2.2.1", - "react-redux": "^5.0.5", - "react-router-dom": "^4.1.2", - "react-router-redux": "5.0.0-alpha.9", - "redux": "^3.7.2" - }, - "peerDependencies": { - "react": "15.x || ^16.0.0-0", - "react-dom": "15.x || ^16.0.0-0" - } - }, "node_modules/@alita/plugins/node_modules/dva-core": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/dva-core/-/dva-core-2.0.4.tgz", @@ -427,102 +401,6 @@ "dva": "^2.5.0-0" } }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/dva-core": { - "version": "1.5.0-beta.2", - "resolved": "https://registry.npmmirror.com/dva-core/-/dva-core-1.5.0-beta.2.tgz", - "integrity": "sha512-xmtr/J63EZXBdVXNBW+QCD7p9CaE8kAo2U1faRyv3PIGcy0G3Y6IBDNtoBB/Cj3nzk/jvX0dv96Hnh1kpSnI7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "flatten": "^1.0.2", - "global": "^4.3.2", - "invariant": "^2.2.1", - "is-plain-object": "^2.0.3", - "redux": "^3.7.1", - "redux-saga": "^0.16.0", - "warning": "^3.0.0" - }, - "peerDependencies": { - "redux": "3.x" - } - }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/dva-core/node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmmirror.com/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/react-redux": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/react-redux/-/react-redux-5.1.2.tgz", - "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.1", - "react-is": "^16.6.0", - "react-lifecycles-compat": "^3.0.0" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0", - "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" - } - }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@alita/plugins/node_modules/dva/node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, "node_modules/@alita/plugins/node_modules/immer": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.4.tgz", @@ -555,47 +433,6 @@ "node": ">=10" } }, - "node_modules/@alita/plugins/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "peer": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/@alita/plugins/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmmirror.com/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alita/plugins/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, "node_modules/@alita/plugins/node_modules/react-intl": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.12.1.tgz", @@ -619,58 +456,6 @@ "react": "^16.3.0" } }, - "node_modules/@alita/plugins/node_modules/react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@alita/plugins/node_modules/react-router/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmmirror.com/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/@alita/plugins/node_modules/react-router/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "dev": true, - "peer": true - }, - "node_modules/@alita/plugins/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@alita/plugins/node_modules/semver": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", @@ -1297,38 +1082,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@antv/adjust": { - "version": "0.2.5", - "resolved": "https://registry.npmmirror.com/@antv/adjust/-/adjust-0.2.5.tgz", - "integrity": "sha512-MfWZOkD9CqXRES6MBGRNe27Q577a72EIwyMnE29wIlPliFvJfWwsrONddpGU7lilMpVKecS3WAzOoip3RfPTRQ==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.0", - "tslib": "^1.10.0" - } - }, - "node_modules/@antv/adjust/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/adjust/node_modules/@antv/util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "peer": true - }, - "node_modules/@antv/adjust/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "peer": true - }, "node_modules/@antv/algorithm": { "version": "0.1.26", "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.26.tgz", @@ -1347,39 +1100,6 @@ "tslib": "^2.0.3" } }, - "node_modules/@antv/attr": { - "version": "0.3.5", - "resolved": "https://registry.npmmirror.com/@antv/attr/-/attr-0.3.5.tgz", - "integrity": "sha512-wuj2gUo6C8Q2ASSMrVBuTcb5LcV+Tc0Egiy6bC42D0vxcQ+ta13CLxgMmHz8mjD0FxTPJDXSciyszRSC5TdLsg==", - "peer": true, - "dependencies": { - "@antv/color-util": "^2.0.1", - "@antv/scale": "^0.3.0", - "@antv/util": "~2.0.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@antv/attr/node_modules/@antv/scale": { - "version": "0.3.18", - "resolved": "https://registry.npmmirror.com/@antv/scale/-/scale-0.3.18.tgz", - "integrity": "sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.3", - "fecha": "~4.2.0", - "tslib": "^2.0.0" - } - }, - "node_modules/@antv/attr/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, "node_modules/@antv/ava": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@antv/ava/-/ava-3.4.1.tgz", @@ -1482,15 +1202,6 @@ "@antv/g6": "^4.3.11" } }, - "node_modules/@antv/ava/node_modules/@antv/g6": { - "version": "4.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6/-/g6-4.8.24.tgz", - "integrity": "sha512-bgj7sZ+z45JmOngIpYpwmSIg7SboMLZBoAlX0+RoAETZB3/xvZO0MXT3lCSyAhIgm5Sb68pekKi7OStuo04NyQ==", - "peer": true, - "dependencies": { - "@antv/g6-pc": "0.8.24" - } - }, "node_modules/@antv/color-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@antv/color-schema/-/color-schema-0.2.3.tgz", @@ -1499,26 +1210,6 @@ "@types/chroma-js": "^2.1.3" } }, - "node_modules/@antv/color-util": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/@antv/color-util/-/color-util-2.0.6.tgz", - "integrity": "sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/color-util/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, "node_modules/@antv/component": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@antv/component/-/component-2.0.1.tgz", @@ -1549,15 +1240,6 @@ "tslib": "^2.0.3" } }, - "node_modules/@antv/dom-util": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@antv/dom-util/-/dom-util-2.0.4.tgz", - "integrity": "sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==", - "peer": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/@antv/event-emitter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz", @@ -1575,73 +1257,6 @@ "@babel/runtime": "^7.25.6" } }, - "node_modules/@antv/g-base": { - "version": "0.5.16", - "resolved": "https://registry.npmmirror.com/@antv/g-base/-/g-base-0.5.16.tgz", - "integrity": "sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg==", - "peer": true, - "dependencies": { - "@antv/event-emitter": "^0.1.1", - "@antv/g-math": "^0.1.9", - "@antv/matrix-util": "^3.1.0-beta.1", - "@antv/path-util": "~2.0.5", - "@antv/util": "~2.0.13", - "@types/d3-timer": "^2.0.0", - "d3-ease": "^1.0.5", - "d3-interpolate": "^3.0.1", - "d3-timer": "^1.0.9", - "detect-browser": "^5.1.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g-base/node_modules/@antv/g-math": { - "version": "0.1.9", - "resolved": "https://registry.npmmirror.com/@antv/g-math/-/g-math-0.1.9.tgz", - "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0" - } - }, - "node_modules/@antv/g-base/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g-base/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g-base/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g-base/node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", - "peer": true - }, "node_modules/@antv/g-camera-api": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/@antv/g-camera-api/-/g-camera-api-2.0.18.tgz", @@ -1855,49 +1470,6 @@ "tslib": "^2.5.3" } }, - "node_modules/@antv/g-webgpu": { - "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/@antv/g-webgpu/-/g-webgpu-0.7.2.tgz", - "integrity": "sha512-kw+oYGsdvj5qeUfy5DPb/jztZBV+2fmqBd3Vv8NlKatfBmv8AirYX/CCW74AUSdWm99rEiLyxFB1VdRZ6b/wnQ==", - "peer": true, - "dependencies": { - "@antv/g-webgpu-core": "^0.7.2", - "@antv/g-webgpu-engine": "^0.7.2", - "gl-matrix": "^3.1.0", - "gl-vec2": "^1.3.0", - "lodash": "^4.17.15" - } - }, - "node_modules/@antv/g-webgpu-core": { - "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/@antv/g-webgpu-core/-/g-webgpu-core-0.7.2.tgz", - "integrity": "sha512-xUMmop7f3Rs34zFYKXLqHhDR1CQTeDl/7vI7Sn3X/73BqJc3X3HIIRvm83Fg2CjVACaOzw4WeLRXNaOCp9fz9w==", - "peer": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "gl-matrix": "^3.1.0", - "lodash": "^4.17.15", - "probe.gl": "^3.1.1" - } - }, - "node_modules/@antv/g-webgpu-core/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "peer": true - }, - "node_modules/@antv/g-webgpu-engine": { - "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/@antv/g-webgpu-engine/-/g-webgpu-engine-0.7.2.tgz", - "integrity": "sha512-lx8Y93IW2cnJvdoDRKyMmTdYqSC1pOmF0nyG3PGGyA0NI9vBYVgO0KTF6hkyWjdTWVq7XDZyf/h8CJridLh3lg==", - "peer": true, - "dependencies": { - "@antv/g-webgpu-core": "^0.7.2", - "gl-matrix": "^3.1.0", - "lodash": "^4.17.15", - "regl": "^1.3.11" - } - }, "node_modules/@antv/g2": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-5.2.7.tgz", @@ -1936,210 +1508,6 @@ "d3-hierarchy": "^3.1.2" } }, - "node_modules/@antv/g2plot": { - "version": "2.4.32", - "resolved": "https://registry.npmmirror.com/@antv/g2plot/-/g2plot-2.4.32.tgz", - "integrity": "sha512-HTBuAMa+PJ6DqY1XCX1GBNTGz/IBmn9lx2xu18NQSHtgXAIHWSF+WYs7Aj8iaujcapM8g+IPgjS6ObO1u9CbFg==", - "peer": true, - "dependencies": { - "@antv/color-util": "^2.0.6", - "@antv/event-emitter": "^0.1.2", - "@antv/g-base": "^0.5.11", - "@antv/g2": "^4.1.26", - "@antv/matrix-util": "^3.1.0-beta.2", - "@antv/path-util": "^3.0.1", - "@antv/scale": "^0.3.18", - "@antv/util": "^2.0.17", - "d3-hierarchy": "^2.0.0", - "d3-regression": "^1.3.5", - "fmin": "^0.0.2", - "pdfast": "^0.2.0", - "size-sensor": "^1.0.1", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/component": { - "version": "0.8.35", - "resolved": "https://registry.npmmirror.com/@antv/component/-/component-0.8.35.tgz", - "integrity": "sha512-VnRa5X77nBPI952o2xePEEMSNZ6g2mcUDrQY8mVL2kino/8TFhqDq5fTRmDXZyWyIYd4ulJTz5zgeSwAnX/INQ==", - "peer": true, - "dependencies": { - "@antv/color-util": "^2.0.3", - "@antv/dom-util": "~2.0.1", - "@antv/g-base": "^0.5.9", - "@antv/matrix-util": "^3.1.0-beta.1", - "@antv/path-util": "~2.0.7", - "@antv/scale": "~0.3.1", - "@antv/util": "~2.0.0", - "fecha": "~4.2.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/component/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/component/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/coord": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/@antv/coord/-/coord-0.3.1.tgz", - "integrity": "sha512-rFE94C8Xzbx4xmZnHh2AnlB3Qm1n5x0VT3OROy257IH6Rm4cuzv1+tZaUBATviwZd99S+rOY9telw/+6C9GbRw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.1.0-beta.2", - "@antv/util": "~2.0.12", - "tslib": "^2.1.0" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g-canvas": { - "version": "0.5.17", - "resolved": "https://registry.npmmirror.com/@antv/g-canvas/-/g-canvas-0.5.17.tgz", - "integrity": "sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA==", - "peer": true, - "dependencies": { - "@antv/g-base": "^0.5.12", - "@antv/g-math": "^0.1.9", - "@antv/matrix-util": "^3.1.0-beta.1", - "@antv/path-util": "~2.0.5", - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g-canvas/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g-canvas/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g-math": { - "version": "0.1.9", - "resolved": "https://registry.npmmirror.com/@antv/g-math/-/g-math-0.1.9.tgz", - "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g-svg": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/@antv/g-svg/-/g-svg-0.5.7.tgz", - "integrity": "sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==", - "peer": true, - "dependencies": { - "@antv/g-base": "^0.5.12", - "@antv/g-math": "^0.1.9", - "@antv/util": "~2.0.0", - "detect-browser": "^5.0.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g2": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/@antv/g2/-/g2-4.2.11.tgz", - "integrity": "sha512-QiqxLLYDWkv9c4oTcXscs6NMxBuWZ1JCarHPZ27J43IN2BV+qUKw8yce0A8CBR8fCILEFqQAfS00Szqpye036Q==", - "peer": true, - "dependencies": { - "@antv/adjust": "^0.2.1", - "@antv/attr": "^0.3.1", - "@antv/color-util": "^2.0.2", - "@antv/component": "^0.8.27", - "@antv/coord": "^0.3.0", - "@antv/dom-util": "^2.0.2", - "@antv/event-emitter": "~0.1.0", - "@antv/g-base": "~0.5.6", - "@antv/g-canvas": "~0.5.10", - "@antv/g-svg": "~0.5.6", - "@antv/matrix-util": "^3.1.0-beta.3", - "@antv/path-util": "^2.0.15", - "@antv/scale": "^0.3.14", - "@antv/util": "~2.0.5", - "tslib": "^2.0.0" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g2/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/g2/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/scale": { - "version": "0.3.18", - "resolved": "https://registry.npmmirror.com/@antv/scale/-/scale-0.3.18.tgz", - "integrity": "sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.3", - "fecha": "~4.2.0", - "tslib": "^2.0.0" - } - }, - "node_modules/@antv/g2plot/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g2plot/node_modules/d3-hierarchy": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", - "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==", - "peer": true - }, "node_modules/@antv/g6": { "version": "5.0.27", "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-5.0.27.tgz", @@ -2159,66 +1527,6 @@ "hull.js": "^1.0.6" } }, - "node_modules/@antv/g6-core": { - "version": "0.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6-core/-/g6-core-0.8.24.tgz", - "integrity": "sha512-rgI3dArAD8uoSz2+skS4ctN4x/Of33ivTIKaEYYvClxgkLZWVz9zvocy+5AWcVPBHZsAXkZcdh9zndIoWY/33A==", - "peer": true, - "dependencies": { - "@antv/algorithm": "^0.1.26", - "@antv/dom-util": "^2.0.1", - "@antv/event-emitter": "~0.1.0", - "@antv/g-base": "^0.5.1", - "@antv/g-math": "^0.1.1", - "@antv/matrix-util": "^3.1.0-beta.3", - "@antv/path-util": "^2.0.3", - "@antv/util": "~2.0.5", - "ml-matrix": "^6.5.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@antv/g6-core/node_modules/@antv/g-math": { - "version": "0.1.9", - "resolved": "https://registry.npmmirror.com/@antv/g-math/-/g-math-0.1.9.tgz", - "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0" - } - }, - "node_modules/@antv/g6-core/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-core/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-core/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, "node_modules/@antv/g6-extension-react": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/@antv/g6-extension-react/-/g6-extension-react-0.1.7.tgz", @@ -2276,236 +1584,6 @@ "object-assign": "^4.1.1" } }, - "node_modules/@antv/g6-pc": { - "version": "0.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6-pc/-/g6-pc-0.8.24.tgz", - "integrity": "sha512-nf0y1lrp8J5DotqRryXd2S/J30COW8spVcLF9gUqywGqQAHfE00Ywkqr+PZBnsfCZXsXCi9o0+CE9NrkWs4SBQ==", - "peer": true, - "dependencies": { - "@ant-design/colors": "^4.0.5", - "@antv/algorithm": "^0.1.26", - "@antv/dom-util": "^2.0.1", - "@antv/event-emitter": "~0.1.0", - "@antv/g-base": "^0.5.1", - "@antv/g-canvas": "^0.5.2", - "@antv/g-math": "^0.1.1", - "@antv/g-svg": "^0.5.1", - "@antv/g6-core": "0.8.24", - "@antv/g6-element": "0.8.24", - "@antv/g6-plugin": "0.8.24", - "@antv/hierarchy": "^0.6.10", - "@antv/layout": "^0.3.0", - "@antv/matrix-util": "^3.1.0-beta.3", - "@antv/path-util": "^2.0.3", - "@antv/util": "~2.0.5", - "color": "^3.1.3", - "d3-force": "^2.0.1", - "dagre": "^0.8.5", - "insert-css": "^2.0.0", - "ml-matrix": "^6.5.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@antv/g6-pc/node_modules/@ant-design/colors": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-4.0.5.tgz", - "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", - "peer": true, - "dependencies": { - "tinycolor2": "^1.4.1" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g-canvas": { - "version": "0.5.17", - "resolved": "https://registry.npmmirror.com/@antv/g-canvas/-/g-canvas-0.5.17.tgz", - "integrity": "sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA==", - "peer": true, - "dependencies": { - "@antv/g-base": "^0.5.12", - "@antv/g-math": "^0.1.9", - "@antv/matrix-util": "^3.1.0-beta.1", - "@antv/path-util": "~2.0.5", - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g-math": { - "version": "0.1.9", - "resolved": "https://registry.npmmirror.com/@antv/g-math/-/g-math-0.1.9.tgz", - "integrity": "sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.0", - "gl-matrix": "^3.0.0" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g-svg": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/@antv/g-svg/-/g-svg-0.5.7.tgz", - "integrity": "sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==", - "peer": true, - "dependencies": { - "@antv/g-base": "^0.5.12", - "@antv/g-math": "^0.1.9", - "@antv/util": "~2.0.0", - "detect-browser": "^5.0.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g6": { - "version": "4.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6/-/g6-4.8.24.tgz", - "integrity": "sha512-bgj7sZ+z45JmOngIpYpwmSIg7SboMLZBoAlX0+RoAETZB3/xvZO0MXT3lCSyAhIgm5Sb68pekKi7OStuo04NyQ==", - "peer": true, - "dependencies": { - "@antv/g6-pc": "0.8.24" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g6-element": { - "version": "0.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6-element/-/g6-element-0.8.24.tgz", - "integrity": "sha512-61FXkt9LY+6EOUtSam1iFTOW2AM59sPVcV1BuPj4dXiD0dluLE+R7d8B/94g1tKDw9tsjhfUQGC7hTXscJRJFw==", - "peer": true, - "dependencies": { - "@antv/g-base": "^0.5.1", - "@antv/g6-core": "0.8.24", - "@antv/util": "~2.0.5", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "@antv/g6": "4.8.24" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/g6-plugin": { - "version": "0.8.24", - "resolved": "https://registry.npmmirror.com/@antv/g6-plugin/-/g6-plugin-0.8.24.tgz", - "integrity": "sha512-ZIOnwLTC7SM2bFiJZ3vYFWnkyOCWKqnU96i/fBh1qAoY5slDS3hatenZWEXUtOcqaKw1h+5A5f72MRXqBBVn0g==", - "peer": true, - "dependencies": { - "@antv/dom-util": "^2.0.2", - "@antv/g-base": "^0.5.1", - "@antv/g-canvas": "^0.5.2", - "@antv/g-svg": "^0.5.2", - "@antv/g6-core": "0.8.24", - "@antv/g6-element": "0.8.24", - "@antv/matrix-util": "^3.1.0-beta.3", - "@antv/path-util": "^2.0.3", - "@antv/scale": "^0.3.4", - "@antv/util": "^2.0.9", - "insert-css": "^2.0.0" - }, - "peerDependencies": { - "@antv/g6": "4.8.24" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/graphlib": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@antv/graphlib/-/graphlib-1.2.0.tgz", - "integrity": "sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ==", - "peer": true - }, - "node_modules/@antv/g6-pc/node_modules/@antv/layout": { - "version": "0.3.25", - "resolved": "https://registry.npmmirror.com/@antv/layout/-/layout-0.3.25.tgz", - "integrity": "sha512-d29Aw1PXoAavMRZy7iTB9L5rMBeChFEX0BJ9ELP4TI35ySdCu07YbmPo9ju9OH/6sG2/NB3o85Ayxrre3iwX/g==", - "peer": true, - "dependencies": { - "@antv/g-webgpu": "0.7.2", - "@antv/graphlib": "^1.0.0", - "@antv/util": "^3.3.2", - "d3-force": "^2.1.1", - "d3-quadtree": "^2.0.0", - "dagre-compound": "^0.0.11", - "ml-matrix": "6.5.0" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/layout/node_modules/@antv/util": { - "version": "3.3.10", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-3.3.10.tgz", - "integrity": "sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "gl-matrix": "^3.3.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/path-util": { - "version": "2.0.15", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-2.0.15.tgz", - "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", - "peer": true, - "dependencies": { - "@antv/matrix-util": "^3.0.4", - "@antv/util": "^2.0.9", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/path-util/node_modules/@antv/matrix-util": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz", - "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.3.0", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/scale": { - "version": "0.3.18", - "resolved": "https://registry.npmmirror.com/@antv/scale/-/scale-0.3.18.tgz", - "integrity": "sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==", - "peer": true, - "dependencies": { - "@antv/util": "~2.0.3", - "fecha": "~4.2.0", - "tslib": "^2.0.0" - } - }, - "node_modules/@antv/g6-pc/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/g6-pc/node_modules/d3-dispatch": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz", - "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==", - "peer": true - }, - "node_modules/@antv/g6-pc/node_modules/d3-force": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-2.1.1.tgz", - "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", - "peer": true, - "dependencies": { - "d3-dispatch": "1 - 2", - "d3-quadtree": "1 - 2", - "d3-timer": "1 - 2" - } - }, - "node_modules/@antv/g6-pc/node_modules/d3-timer": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-2.0.0.tgz", - "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==", - "peer": true - }, - "node_modules/@antv/g6-pc/node_modules/ml-matrix": { - "version": "6.5.0", - "resolved": "https://registry.npmmirror.com/ml-matrix/-/ml-matrix-6.5.0.tgz", - "integrity": "sha512-sms732Dge+rs5dU4mnjE0oqLWm1WujvR2fr38LgUHRG2cjXjWlO3WJupLYaSz3++2iYr0UrGDK72OAivr3J8dg==", - "peer": true, - "dependencies": { - "ml-array-rescale": "^1.3.1" - } - }, "node_modules/@antv/g6/node_modules/@antv/component": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@antv/component/-/component-2.1.1.tgz", @@ -2604,38 +1682,6 @@ "node": ">=12" } }, - "node_modules/@antv/matrix-util": { - "version": "3.1.0-beta.3", - "resolved": "https://registry.npmmirror.com/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz", - "integrity": "sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==", - "peer": true, - "dependencies": { - "@antv/util": "^2.0.9", - "gl-matrix": "^3.4.3", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/matrix-util/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "peer": true, - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, - "node_modules/@antv/path-util": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@antv/path-util/-/path-util-3.0.1.tgz", - "integrity": "sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q==", - "peer": true, - "dependencies": { - "gl-matrix": "^3.1.0", - "lodash-es": "^4.17.21", - "tslib": "^2.0.3" - } - }, "node_modules/@antv/scale": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.16.tgz", @@ -2835,6 +1881,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -2870,6 +1917,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", @@ -2890,6 +1938,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2898,6 +1947,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", @@ -2914,6 +1964,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2922,6 +1973,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -2937,6 +1989,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -2948,6 +2001,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -2959,6 +2013,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -2999,6 +2054,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, "dependencies": { "@babel/types": "^7.25.9" }, @@ -3018,6 +2074,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-wrap-function": "^7.25.9", @@ -3034,6 +2091,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", @@ -3050,6 +2108,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -3062,6 +2121,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -3098,6 +2158,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, "dependencies": { "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", @@ -3223,6 +2284,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3238,6 +2300,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3252,6 +2315,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", @@ -3268,6 +2332,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3284,6 +2349,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -3312,60 +2378,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz", - "integrity": "sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, "engines": { "node": ">=6.9.0" }, @@ -3377,6 +2394,7 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3388,6 +2406,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3399,6 +2418,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -3410,6 +2430,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3439,6 +2460,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3446,25 +2468,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz", - "integrity": "sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -3472,25 +2480,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.26.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", - "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3505,6 +2499,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3519,6 +2514,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3530,6 +2526,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3555,6 +2552,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3566,6 +2564,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3577,6 +2576,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3588,6 +2588,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3599,6 +2600,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3610,6 +2612,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3621,6 +2624,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3635,6 +2639,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3649,6 +2654,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3663,6 +2669,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -3678,6 +2685,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3692,6 +2700,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-remap-async-to-generator": "^7.25.9", @@ -3708,6 +2717,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -3724,6 +2734,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3738,6 +2749,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3752,6 +2764,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -3767,6 +2780,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -3783,6 +2797,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-compilation-targets": "^7.25.9", @@ -3802,6 +2817,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/template": "^7.24.7" @@ -3817,6 +2833,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -3831,6 +2848,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3846,6 +2864,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3860,6 +2879,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -3875,6 +2895,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3890,6 +2911,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -3901,26 +2923,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -3936,6 +2943,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", @@ -3952,6 +2960,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -3967,6 +2976,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -3981,6 +2991,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -3996,6 +3007,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4010,6 +3022,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4025,6 +3038,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", @@ -4041,6 +3055,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-module-transforms": "^7.24.7", @@ -4058,6 +3073,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4073,6 +3089,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4088,6 +3105,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4102,6 +3120,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -4117,6 +3136,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -4132,6 +3152,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -4149,6 +3170,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7" @@ -4164,6 +3186,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -4179,6 +3202,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", @@ -4195,6 +3219,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4209,6 +3234,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4224,6 +3250,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -4241,6 +3268,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4255,6 +3283,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4269,6 +3298,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-module-imports": "^7.25.9", @@ -4302,6 +3332,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -4316,6 +3347,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -4346,6 +3378,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" @@ -4361,6 +3394,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4371,39 +3405,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4418,6 +3424,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -4433,6 +3440,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4447,6 +3455,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4461,6 +3470,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -4475,6 +3485,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -4493,6 +3504,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -4507,6 +3519,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4522,6 +3535,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4537,6 +3551,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -4552,6 +3567,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.24.8", "@babel/helper-compilation-targets": "^7.24.8", @@ -4646,31 +3662,16 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/preset-flow": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz", - "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -4704,6 +3705,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", @@ -4718,48 +3720,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register": { - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/register/-/register-7.25.9.tgz", - "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", - "peer": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/register/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true }, "node_modules/@babel/runtime": { "version": "7.26.0", @@ -4802,25 +3767,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.25.9", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", @@ -6533,19 +5479,11 @@ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "dev": true }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -6561,6 +5499,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -6569,6 +5508,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6581,6 +5521,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6593,6 +5534,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -6604,6 +5546,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -6618,6 +5561,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -6629,6 +5573,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } @@ -6636,142 +5581,23 @@ "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -6783,6 +5609,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -6808,6 +5635,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -6824,6 +5652,7 @@ "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -6832,6 +5661,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -6889,6 +5719,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -7794,34 +6625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@probe.gl/env": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/@probe.gl/env/-/env-3.6.0.tgz", - "integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, - "node_modules/@probe.gl/log": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/@probe.gl/log/-/log-3.6.0.tgz", - "integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.6.0" - } - }, - "node_modules/@probe.gl/stats": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/@probe.gl/stats/-/stats-3.6.0.tgz", - "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, "node_modules/@radix-ui/popper": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/@radix-ui/popper/-/popper-0.0.10.tgz", @@ -8052,347 +6855,6 @@ "node": ">=12.0.0" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/assets-registry/-/assets-registry-0.76.3.tgz", - "integrity": "sha512-7Fnc3lzCFFpnoyL1egua6d/qUp0KiIpeSLbfOMln4nI2g2BMzyFHdPjJnpLV2NehmS0omOOkrfRqK5u1F/MXzA==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.3.tgz", - "integrity": "sha512-mZ7jmIIg4bUnxCqY3yTOkoHvvzsDyrZgfnIKiTGm5QACrsIGa5eT3pMFpMm2OpxGXRDrTMsYdPXE2rCyDX52VQ==", - "peer": true, - "dependencies": { - "@react-native/codegen": "0.76.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/babel-preset/-/babel-preset-0.76.3.tgz", - "integrity": "sha512-zi2nPlQf9q2fmfPyzwWEj6DU96v8ziWtEfG7CTAX2PG/Vjfsr94vn/wWrCdhBVvLRQ6Kvd/MFAuDYpxmQwIiVQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.76.3", - "babel-plugin-syntax-hermes-parser": "^0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", - "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", - "peer": true, - "dependencies": { - "hermes-parser": "0.25.1" - } - }, - "node_modules/@react-native/babel-preset/node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "peer": true - }, - "node_modules/@react-native/babel-preset/node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/codegen/-/codegen-0.76.3.tgz", - "integrity": "sha512-oJCH/jbYeGmFJql8/y76gqWCCd74pyug41yzYAjREso1Z7xL88JhDyKMvxEnfhSdMOZYVl479N80xFiXPy3ZYA==", - "peer": true, - "dependencies": { - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.23.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/codegen/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/codegen/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@react-native/codegen/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/codegen/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.3.tgz", - "integrity": "sha512-vgsLixHS24jR0d0QqPykBWFaC+V8x9cM3cs4oYXw3W199jgBNGP9MWcUJLazD2vzrT/lUTVBVg0rBeB+4XR6fg==", - "peer": true, - "dependencies": { - "@react-native/dev-middleware": "0.76.3", - "@react-native/metro-babel-transformer": "0.76.3", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "invariant": "^2.2.4", - "metro": "^0.81.0", - "metro-config": "^0.81.0", - "metro-core": "^0.81.0", - "node-fetch": "^2.2.0", - "readline": "^1.3.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@react-native-community/cli-server-api": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli-server-api": { - "optional": true - } - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/debugger-frontend/-/debugger-frontend-0.76.3.tgz", - "integrity": "sha512-pMHQ3NpPB28RxXciSvm2yD+uDx3pkhzfuWkc7VFgOduyzPSIr0zotUiOJzsAtrj8++bPbOsAraCeQhCqoOTWQw==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/dev-middleware/-/dev-middleware-0.76.3.tgz", - "integrity": "sha512-b+2IpW40z1/S5Jo5JKrWPmucYU/PzeGyGBZZ/SJvmRnBDaP3txb9yIqNZAII1EWsKNhedh8vyRO5PSuJ9Juqzw==", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.76.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/gradle-plugin/-/gradle-plugin-0.76.3.tgz", - "integrity": "sha512-t0aYZ8ND7+yc+yIm6Yp52bInneYpki6RSIFZ9/LMUzgMKvEB62ptt/7sfho9QkKHCNxE1DJSWIqLIGi/iHHkyg==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/js-polyfills/-/js-polyfills-0.76.3.tgz", - "integrity": "sha512-pubJFArMMrdZiytH+W95KngcSQs+LsxOBsVHkwgMnpBfRUxXPMK4fudtBwWvhnwN76Oe+WhxSq7vOS5XgoPhmw==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.3.tgz", - "integrity": "sha512-b2zQPXmW7avw/7zewc9nzMULPIAjsTwN03hskhxHUJH5pzUf7pIklB3FrgYPZrRhJgzHiNl3tOPu7vqiKzBYPg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.76.3", - "hermes-parser": "0.23.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz", - "integrity": "sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==", - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.3.tgz", - "integrity": "sha512-wTGv9pVh3vAOWb29xFm+J9VRe9dUcUcb9FyaMLT/Hxa88W4wqa5ZMe1V9UvrrBiA1G5DKjv8/1ZcDsJhyugVKA==", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@react-spring/animated": { "version": "9.7.3", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", @@ -8502,98 +6964,6 @@ "zdog": ">=1.0" } }, - "node_modules/@react-three/fiber": { - "version": "8.17.10", - "resolved": "https://registry.npmmirror.com/@react-three/fiber/-/fiber-8.17.10.tgz", - "integrity": "sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/debounce": "^1.2.1", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "debounce": "^1.2.1", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmmirror.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@react-three/fiber/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/@sigstore/bundle": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", @@ -8940,25 +7310,8 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@stylelint/postcss-css-in-js": { "version": "0.38.0", @@ -9374,6 +7727,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -9386,6 +7740,7 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -9394,6 +7749,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -9403,6 +7759,7 @@ "version": "7.20.6", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -9441,18 +7798,6 @@ "@types/node": "*" } }, - "node_modules/@types/d3-timer": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-2.0.3.tgz", - "integrity": "sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==", - "peer": true - }, - "node_modules/@types/debounce": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/@types/debounce/-/debounce-1.2.4.tgz", - "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", - "peer": true - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -9465,21 +7810,12 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -9537,6 +7873,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -9593,22 +7930,17 @@ "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==", "dev": true }, - "node_modules/@types/isomorphic-fetch": { - "version": "0.0.34", - "resolved": "https://registry.npmmirror.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz", - "integrity": "sha512-BmJKuPCZCR6pbYYgi5nKFJrPC4pLoBgsi/B1nFN64Ba+hLLGUcKPIh7eVlR2xG763Ap08hgQafq/Wx4RFb0omQ==", - "dev": true, - "peer": true - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -9617,6 +7949,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -9630,7 +7963,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/lodash": { "version": "4.17.6", @@ -9673,19 +8007,11 @@ "version": "20.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmmirror.com/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -9700,7 +8026,8 @@ "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true }, "node_modules/@types/qs": { "version": "6.9.15", @@ -9723,6 +8050,7 @@ "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -9768,6 +8096,7 @@ "version": "0.28.8", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dev": true, "dependencies": { "@types/react": "*" } @@ -9784,56 +8113,6 @@ "redux": "^4.0.0" } }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmmirror.com/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "4.3.5", - "resolved": "https://registry.npmmirror.com/@types/react-router-dom/-/react-router-dom-4.3.5.tgz", - "integrity": "sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/react-router-redux": { - "version": "5.0.27", - "resolved": "https://registry.npmmirror.com/@types/react-router-redux/-/react-router-redux-5.0.27.tgz", - "integrity": "sha512-qC5lbuP2K/kMR/HE3e5ltCJptyiQhmfV0wbklqcqWDbNdpJBDwUsBGP4f/0RDYJf09+OTbz43u6iG+8E0Zcwqw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0", - "redux": ">= 3.7.2" - } - }, - "node_modules/@types/react-router-redux/node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmmirror.com/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true, - "peer": true - }, - "node_modules/@types/react-router/node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmmirror.com/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true, - "peer": true - }, "node_modules/@types/react-virtualized": { "version": "9.22.0", "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.22.0.tgz", @@ -9880,13 +8159,8 @@ "node_modules/@types/sortablejs": { "version": "1.15.8", "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz", - "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "peer": true + "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==", + "dev": true }, "node_modules/@types/stylis": { "version": "4.2.5", @@ -9914,12 +8188,6 @@ "@types/node": "*" } }, - "node_modules/@types/webxr": { - "version": "0.5.20", - "resolved": "https://registry.npmmirror.com/@types/webxr/-/webxr-0.5.20.tgz", - "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==", - "peer": true - }, "node_modules/@types/yargs": { "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", @@ -9932,7 +8200,8 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", @@ -11229,64 +9498,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@umijs/lint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@umijs/lint/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@umijs/lint/node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@umijs/lint/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "peer": true - }, "node_modules/@umijs/lint/node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -11374,70 +9585,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@umijs/lint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true, - "peer": true - }, - "node_modules/@umijs/lint/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@umijs/lint/node_modules/eslint-plugin-jest": { "version": "27.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", @@ -11526,67 +9673,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@umijs/lint/node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@umijs/lint/node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@umijs/lint/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@umijs/lint/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@umijs/lint/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -11596,97 +9682,6 @@ "node": ">=4.0" } }, - "node_modules/@umijs/lint/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "peer": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@umijs/lint/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@umijs/lint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@umijs/lint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@umijs/lint/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@umijs/lint/node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmmirror.com/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true, - "peer": true - }, - "node_modules/@umijs/lint/node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, "node_modules/@umijs/lint/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -11704,73 +9699,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@umijs/lint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@umijs/lint/node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmmirror.com/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", - "dev": true, - "peer": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - } - }, "node_modules/@umijs/lint/node_modules/stylelint-config-recommended": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz", @@ -11792,33 +9720,6 @@ "stylelint": "^14.4.0" } }, - "node_modules/@umijs/lint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@umijs/lint/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@umijs/mako": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@umijs/mako/-/mako-0.9.3.tgz", @@ -13336,32 +11237,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@umijs/plugins/node_modules/dva": { - "version": "2.5.0-beta.2", - "resolved": "https://registry.npmmirror.com/dva/-/dva-2.5.0-beta.2.tgz", - "integrity": "sha512-kc2+CHhF1cNIU3Rg1miMhHgOKJ/VDrq9d6ynVBZf1EN2YKWU3MVFq/uTTBqMr2qkR0m9f8VKHOFmfKLtfMI93Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "@types/isomorphic-fetch": "^0.0.34", - "@types/react-router-dom": "^4.2.7", - "@types/react-router-redux": "^5.0.13", - "dva-core": "^1.5.0-beta.2", - "global": "^4.3.2", - "history": "^4.6.3", - "invariant": "^2.2.2", - "isomorphic-fetch": "^2.2.1", - "react-redux": "^5.0.5", - "react-router-dom": "^4.1.2", - "react-router-redux": "5.0.0-alpha.9", - "redux": "^3.7.2" - }, - "peerDependencies": { - "react": "15.x || ^16.0.0-0", - "react-dom": "15.x || ^16.0.0-0" - } - }, "node_modules/@umijs/plugins/node_modules/dva-core": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/dva-core/-/dva-core-2.0.4.tgz", @@ -13402,84 +11277,6 @@ "dva": "^2.5.0-0" } }, - "node_modules/@umijs/plugins/node_modules/dva/node_modules/dva-core": { - "version": "1.5.0-beta.2", - "resolved": "https://registry.npmmirror.com/dva-core/-/dva-core-1.5.0-beta.2.tgz", - "integrity": "sha512-xmtr/J63EZXBdVXNBW+QCD7p9CaE8kAo2U1faRyv3PIGcy0G3Y6IBDNtoBB/Cj3nzk/jvX0dv96Hnh1kpSnI7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "flatten": "^1.0.2", - "global": "^4.3.2", - "invariant": "^2.2.1", - "is-plain-object": "^2.0.3", - "redux": "^3.7.1", - "redux-saga": "^0.16.0", - "warning": "^3.0.0" - }, - "peerDependencies": { - "redux": "3.x" - } - }, - "node_modules/@umijs/plugins/node_modules/dva/node_modules/react-redux": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/react-redux/-/react-redux-5.1.2.tgz", - "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.1", - "react-is": "^16.6.0", - "react-lifecycles-compat": "^3.0.0" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0", - "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" - } - }, - "node_modules/@umijs/plugins/node_modules/dva/node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "node_modules/@umijs/plugins/node_modules/dva/node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/@umijs/plugins/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmmirror.com/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, "node_modules/@umijs/plugins/node_modules/immer": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.4.tgz", @@ -13500,47 +11297,6 @@ "intl-messageformat-parser": "^3.6.4" } }, - "node_modules/@umijs/plugins/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "peer": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/@umijs/plugins/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmmirror.com/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@umijs/plugins/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, "node_modules/@umijs/plugins/node_modules/react-intl": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.12.1.tgz", @@ -13609,61 +11365,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "node_modules/@umijs/plugins/node_modules/react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@umijs/plugins/node_modules/react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@umijs/plugins/node_modules/react-router/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "dev": true, - "peer": true - }, - "node_modules/@umijs/plugins/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/@umijs/plugins/node_modules/styled-components": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.1.tgz", @@ -14048,152 +11749,6 @@ "vite": "^4.2.0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, "node_modules/@xterm/addon-fit": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", @@ -14207,18 +11762,6 @@ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==" }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -14235,6 +11778,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -14246,6 +11790,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -14385,6 +11930,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14400,6 +11946,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -14436,12 +11983,6 @@ "node": ">=0.4.2" } }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmmirror.com/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -14482,6 +12023,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -14490,6 +12032,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15090,6 +12633,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "dev": true, "dependencies": { "tslib": "^2.0.1" }, @@ -15106,7 +12650,8 @@ "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true }, "node_modules/async-validator": { "version": "4.2.5", @@ -15231,19 +12776,11 @@ "form-data": "^4.0.0" } }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmmirror.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -15282,6 +12819,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -15297,6 +12835,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -15325,6 +12864,7 @@ "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", @@ -15338,6 +12878,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -15346,6 +12887,7 @@ "version": "0.10.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2", "core-js-compat": "^3.38.0" @@ -15358,6 +12900,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" }, @@ -15408,28 +12951,11 @@ "styled-components": ">= 2" } }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz", - "integrity": "sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==", - "peer": true, - "dependencies": { - "hermes-parser": "0.23.1" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -15455,6 +12981,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -15532,6 +13059,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -15580,6 +13108,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "engines": { "node": "*" } @@ -15922,6 +13451,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -15967,7 +13497,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/buffer-okam": { "version": "4.9.2", @@ -16123,39 +13654,6 @@ "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -16178,6 +13676,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } @@ -16285,6 +13784,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16379,63 +13879,11 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.6.0.tgz", "integrity": "sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==" }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmmirror.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/chromium-edge-launcher/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, "node_modules/cipher-base": { "version": "1.0.4", @@ -16661,20 +14109,6 @@ "node": ">= 0.10" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "peer": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -16724,16 +14158,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, "node_modules/color-blind": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/color-blind/-/color-blind-0.1.3.tgz", @@ -16749,6 +14173,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -16779,21 +14204,6 @@ "color-support": "bin.js" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -16864,7 +14274,8 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/component-classes": { "version": "1.2.6", @@ -16966,21 +14377,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -16990,60 +14386,6 @@ "node": ">=0.8" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -17143,6 +14485,7 @@ "version": "3.39.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, "dependencies": { "browserslist": "^4.24.2" }, @@ -17165,7 +14508,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cors": { "version": "2.8.5", @@ -17303,6 +14647,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -17679,12 +15024,6 @@ "node": ">=12" } }, - "node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==", - "peer": true - }, "node_modules/d3-force": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", @@ -17769,12 +15108,6 @@ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" }, - "node_modules/d3-regression": { - "version": "1.3.10", - "resolved": "https://registry.npmmirror.com/d3-regression/-/d3-regression-1.3.10.tgz", - "integrity": "sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==", - "peer": true - }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", @@ -17815,18 +15148,6 @@ "lodash": "^4.17.15" } }, - "node_modules/dagre-compound": { - "version": "0.0.11", - "resolved": "https://registry.npmmirror.com/dagre-compound/-/dagre-compound-0.0.11.tgz", - "integrity": "sha512-UrSgRP9LtOZCYb9e5doolZXpc7xayyszgyOs7uakTK4n4KsLegLVTRRtq01GpQd/iZjYw5fWMapx9ed+c80MAQ==", - "peer": true, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "dagre": "^0.8.5" - } - }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -17909,7 +15230,7 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -17942,12 +15263,6 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "peer": true - }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -18291,16 +15606,11 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "peer": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -18333,17 +15643,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-browser": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", - "peer": true - }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -18662,35 +15967,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/dva-core": { - "version": "1.6.0-beta.7", - "resolved": "https://registry.npmmirror.com/dva-core/-/dva-core-1.6.0-beta.7.tgz", - "integrity": "sha512-e+0yOEWUK+XbnqflX+KXoLZDGxn+kLKgcT6XYT8GyRe0xcbmLEbwDZO0DXUkdsbxfqSOlLkIprMUoYJ3D5B4Gg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "flatten": "^1.0.2", - "global": "^4.3.2", - "invariant": "^2.2.1", - "is-plain-object": "^2.0.3", - "redux-saga": "^0.16.0", - "warning": "^3.0.0" - }, - "peerDependencies": { - "redux": "4.x" - } - }, - "node_modules/dva-core/node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/dva-loading": { "version": "3.0.25", "resolved": "https://registry.npmjs.org/dva-loading/-/dva-loading-3.0.25.tgz", @@ -18749,7 +16025,8 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/ejs": { "version": "3.1.10", @@ -18795,12 +16072,14 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, "engines": { "node": ">= 4" } @@ -18809,6 +16088,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -18817,7 +16097,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "devOptional": true, + "dev": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -18918,6 +16198,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, "dependencies": { "stackframe": "^1.3.4" } @@ -19051,12 +16332,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "peer": true - }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -19225,7 +16500,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -19415,6 +16691,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -19568,6 +16845,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -19601,6 +16879,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -19612,6 +16891,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -19620,6 +16900,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -19642,6 +16923,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -19650,6 +16932,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -19667,6 +16950,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "engines": { "node": ">=6" } @@ -19680,6 +16964,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } @@ -19707,6 +16992,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -19746,7 +17032,8 @@ "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true }, "node_modules/express": { "version": "4.19.2", @@ -19941,7 +17228,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -19992,6 +17280,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, "dependencies": { "bser": "2.1.1" } @@ -20198,93 +17487,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "peer": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -20354,21 +17556,6 @@ "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", "dev": true }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "peer": true - }, - "node_modules/flow-parser": { - "version": "0.254.2", - "resolved": "https://registry.npmmirror.com/flow-parser/-/flow-parser-0.254.2.tgz", - "integrity": "sha512-18xCQaVdKNCY0TAEhwUdk1HmRdgsPSraWwu0Zifqo5M4Ubi9LjWTAdlfBFb07Os+fQ9TmzxlyZN6OxK0m9xrBw==", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/flru": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flru/-/flru-1.0.2.tgz", @@ -20647,6 +17834,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -20773,6 +17961,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -20811,6 +18000,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, "engines": { "node": ">=8.0.0" } @@ -20831,6 +18021,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -20913,12 +18104,6 @@ "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" }, - "node_modules/gl-vec2": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/gl-vec2/-/gl-vec2-1.3.0.tgz", - "integrity": "sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==", - "peer": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -20950,12 +18135,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true - }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -21082,7 +18261,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -21216,6 +18396,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -21362,21 +18543,6 @@ "node": ">=10.0.0" } }, - "node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.23.1" - } - }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -21590,6 +18756,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -21686,6 +18853,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { "node": ">=10.17.0" } @@ -21753,6 +18921,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -21866,6 +19035,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -21937,12 +19107,6 @@ "node": ">=12.0.0" } }, - "node_modules/insert-css": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/insert-css/-/insert-css-2.0.0.tgz", - "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==", - "peer": true - }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -22263,19 +19427,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, @@ -22510,6 +19666,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -22598,6 +19755,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "engines": { "node": ">=8" }, @@ -22725,6 +19883,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -22753,12 +19912,14 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -22830,6 +19991,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, "engines": { "node": ">=8" } @@ -22838,6 +20000,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -22853,6 +20016,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -22870,18 +20034,6 @@ "set-function-name": "^2.0.1" } }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "peer": true, - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -22921,62 +20073,11 @@ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -23001,6 +20102,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -23017,6 +20119,7 @@ "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -23025,6 +20128,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -23039,6 +20143,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -23049,128 +20154,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -23179,6 +20167,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -23195,6 +20184,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -23211,6 +20201,7 @@ "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -23219,6 +20210,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -23229,93 +20221,6 @@ "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, "node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", @@ -23393,62 +20298,6 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmmirror.com/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "peer": true - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmmirror.com/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -23467,12 +20316,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "peer": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -23487,7 +20330,8 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -23639,6 +20483,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -23663,26 +20508,6 @@ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true }, - "node_modules/konva": { - "version": "9.3.16", - "resolved": "https://registry.npmmirror.com/konva/-/konva-9.3.16.tgz", - "integrity": "sha512-qa47cefGDDHzkToGRGDsy24f/Njrz7EHP56jQ8mlDcjAPO7vkfTDeoBDIfmF7PZtpfzDdooafQmEUJMDU2F7FQ==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "peer": true - }, "node_modules/lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -23783,15 +20608,6 @@ "node": ">=0.10.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -23813,31 +20629,6 @@ "immediate": "~3.0.5" } }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, "node_modules/lightningcss": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.22.1.tgz", @@ -24404,15 +21195,6 @@ "node": ">=4" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/loader-utils": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", @@ -24470,7 +21252,8 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", @@ -24493,7 +21276,8 @@ "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "dev": true }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -24797,6 +21581,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -24809,6 +21595,8 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, "bin": { "semver": "bin/semver" } @@ -24893,6 +21681,7 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, "dependencies": { "tmpl": "1.0.5" } @@ -24930,12 +21719,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "peer": true - }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -25350,12 +22133,6 @@ "node": ">= 4.0.0" } }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "peer": true - }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -25467,7 +22244,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -25487,574 +22265,6 @@ "node": ">= 0.6" } }, - "node_modules/metro": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro/-/metro-0.81.0.tgz", - "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.24.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.81.0", - "metro-cache": "0.81.0", - "metro-cache-key": "0.81.0", - "metro-config": "0.81.0", - "metro-core": "0.81.0", - "metro-file-map": "0.81.0", - "metro-resolver": "0.81.0", - "metro-runtime": "0.81.0", - "metro-source-map": "0.81.0", - "metro-symbolicate": "0.81.0", - "metro-transform-plugins": "0.81.0", - "metro-transform-worker": "0.81.0", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", - "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.24.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.24.0.tgz", - "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.24.0.tgz", - "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", - "peer": true, - "dependencies": { - "hermes-estree": "0.24.0" - } - }, - "node_modules/metro-cache": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-cache/-/metro-cache-0.81.0.tgz", - "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "metro-core": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-cache-key/-/metro-cache-key-0.81.0.tgz", - "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-config/-/metro-config-0.81.0.tgz", - "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.6.3", - "metro": "0.81.0", - "metro-cache": "0.81.0", - "metro-core": "0.81.0", - "metro-runtime": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/metro-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/metro-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "peer": true - }, - "node_modules/metro-core": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-core/-/metro-core-0.81.0.tgz", - "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-file-map": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-file-map/-/metro-file-map-0.81.0.tgz", - "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==", - "peer": true, - "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=18.18" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-file-map/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro-file-map/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/metro-minify-terser": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz", - "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-resolver": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-resolver/-/metro-resolver-0.81.0.tgz", - "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-runtime": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-runtime/-/metro-runtime-0.81.0.tgz", - "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-source-map": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-source-map/-/metro-source-map-0.81.0.tgz", - "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.81.0", - "nullthrows": "^1.1.1", - "ob1": "0.81.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz", - "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.81.0", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz", - "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz", - "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.81.0", - "metro-babel-transformer": "0.81.0", - "metro-cache": "0.81.0", - "metro-cache-key": "0.81.0", - "metro-minify-terser": "0.81.0", - "metro-source-map": "0.81.0", - "metro-transform-plugins": "0.81.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.24.0.tgz", - "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.24.0.tgz", - "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", - "peer": true, - "dependencies": { - "hermes-estree": "0.24.0" - } - }, - "node_modules/metro/node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/metro/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/metro/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/metro/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/metro/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/micromark": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", @@ -26594,6 +22804,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -26677,6 +22888,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -26685,6 +22897,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -26696,6 +22909,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -26888,6 +23102,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -27167,16 +23382,11 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -27195,19 +23405,8 @@ "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmmirror.com/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "peer": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -27232,6 +23431,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -27259,15 +23459,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "peer": true, - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-gyp": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", @@ -27395,7 +23586,8 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true }, "node_modules/node-libs-browser": { "version": "2.2.1", @@ -27958,6 +24150,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -27990,12 +24183,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true - }, "node_modules/num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -28179,18 +24366,6 @@ "node": "*" } }, - "node_modules/ob1": { - "version": "0.81.0", - "resolved": "https://registry.npmmirror.com/ob1/-/ob1-0.81.0.tgz", - "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -28355,6 +24530,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -28391,6 +24567,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -28669,6 +24846,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -28836,6 +25014,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -28860,6 +25039,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -28876,6 +25056,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -28993,6 +25174,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, "engines": { "node": ">=6" } @@ -29039,6 +25221,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } @@ -30338,18 +26521,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/probe.gl": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/probe.gl/-/probe.gl-3.6.0.tgz", - "integrity": "sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.6.0", - "@probe.gl/log": "3.6.0", - "@probe.gl/stats": "3.6.0" - } - }, "node_modules/proc-log": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", @@ -30368,7 +26539,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/process-okam": { "version": "0.11.10", @@ -30553,6 +26725,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -30658,15 +26831,6 @@ "node": ">=0.4.x" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -30738,6 +26902,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -30756,6 +26921,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -31668,37 +27834,6 @@ "node": ">=14" } }, - "node_modules/react-devtools-core": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/react-devtools-core/-/react-devtools-core-5.3.2.tgz", - "integrity": "sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -31796,53 +27931,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-konva": { - "version": "18.2.10", - "resolved": "https://registry.npmmirror.com/react-konva/-/react-konva-18.2.10.tgz", - "integrity": "sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "peer": true, - "dependencies": { - "@types/react-reconciler": "^0.28.2", - "its-fine": "^1.1.1", - "react-reconciler": "~0.29.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "konva": "^8.0.1 || ^7.2.5 || ^9.0.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/react-konva/node_modules/react-reconciler": { - "version": "0.29.2", - "resolved": "https://registry.npmmirror.com/react-reconciler/-/react-reconciler-0.29.2.tgz", - "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -31898,67 +27986,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/react-native": { - "version": "0.76.3", - "resolved": "https://registry.npmmirror.com/react-native/-/react-native-0.76.3.tgz", - "integrity": "sha512-0TUhgmlouRNf6yuDIIAdbQl0g1VsONgCMsLs7Et64hjj5VLMCA7np+4dMrZvGZ3wRNqzgeyT9oWJsUm49AcwSQ==", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native/assets-registry": "0.76.3", - "@react-native/codegen": "0.76.3", - "@react-native/community-cli-plugin": "0.76.3", - "@react-native/gradle-plugin": "0.76.3", - "@react-native/js-polyfills": "0.76.3", - "@react-native/normalize-colors": "0.76.3", - "@react-native/virtualized-lists": "0.76.3", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "^0.23.1", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "commander": "^12.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.81.0", - "metro-source-map": "^0.81.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^5.3.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "^18.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-native-swipeout": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/react-native-swipeout/-/react-native-swipeout-2.3.6.tgz", @@ -31971,150 +27998,6 @@ "react-tween-state": "^0.1.5" } }, - "node_modules/react-native/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-native/node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "peer": true - }, - "node_modules/react-native/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/react-native/node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/react-native/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "peer": true - }, - "node_modules/react-native/node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-native/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/react-native/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-native/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-native/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/react-node-key": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-node-key/-/react-node-key-0.4.0.tgz", @@ -32139,31 +28022,6 @@ "node": ">=4.0" } }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmmirror.com/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", @@ -32199,6 +28057,7 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -32250,73 +28109,6 @@ "react-dom": ">=16.8" } }, - "node_modules/react-router-redux": { - "version": "5.0.0-alpha.9", - "resolved": "https://registry.npmmirror.com/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz", - "integrity": "sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==", - "deprecated": "This project is no longer maintained.", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "prop-types": "^15.6.0", - "react-router": "^4.2.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-redux/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmmirror.com/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/react-router-redux/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "dev": true, - "peer": true - }, - "node_modules/react-router-redux/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "peer": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-router-redux/node_modules/react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "dev": true, - "peer": true, - "dependencies": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, "node_modules/react-sortablejs": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/react-sortablejs/-/react-sortablejs-6.1.4.tgz", @@ -32416,17 +28208,6 @@ "node": ">=6" } }, - "node_modules/react-zdog": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/react-zdog/-/react-zdog-1.2.2.tgz", - "integrity": "sha512-Ix7ALha91aOEwiHuxumCeYbARS5XNpc/w0v145oGkM6poF/CvhKJwzLhM5sEZbtrghMA+psAhOJkCTzJoseicA==", - "peer": true, - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "resize-observer-polyfill": "^1.5.1" - } - }, "node_modules/reactcss": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", @@ -32686,6 +28467,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -32699,17 +28481,20 @@ "node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/readable-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -32738,12 +28523,6 @@ "node": ">=8.10.0" } }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "peer": true - }, "node_modules/real-require": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", @@ -32757,6 +28536,7 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "dev": true, "dependencies": { "ast-types": "0.15.2", "esprima": "~4.0.0", @@ -32771,6 +28551,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -32816,6 +28597,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, "dependencies": { "@babel/runtime": "^7.9.2" } @@ -32867,12 +28649,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -32889,6 +28673,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -32935,6 +28720,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -32951,6 +28737,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -32962,16 +28749,11 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" } }, - "node_modules/regl": { - "version": "1.7.0", - "resolved": "https://registry.npmmirror.com/regl/-/regl-1.7.0.tgz", - "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==", - "peer": true - }, "node_modules/regression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz", @@ -33579,6 +29361,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -33627,13 +29410,6 @@ "node": ">=4" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "dev": true, - "peer": true - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -33714,6 +29490,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -33975,7 +29752,7 @@ "version": "3.29.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", - "devOptional": true, + "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -34167,6 +29944,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -34287,23 +30065,11 @@ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "peer": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -34315,6 +30081,7 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -34338,6 +30105,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -34345,12 +30113,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -34361,30 +30131,14 @@ "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -34440,7 +30194,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/sha.js": { "version": "2.4.11", @@ -34455,18 +30210,6 @@ "sha.js": "bin.js" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "peer": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/shallow-equal": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", @@ -34482,6 +30225,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -34493,6 +30237,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -34501,6 +30246,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -34596,7 +30342,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/sigstore": { "version": "1.9.0", @@ -34946,6 +30693,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -35328,27 +31076,6 @@ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/stackblur-canvas": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", @@ -35360,28 +31087,8 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmmirror.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true }, "node_modules/state-local": { "version": "1.0.7", @@ -35392,6 +31099,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -35525,6 +31233,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -35562,6 +31271,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -35665,6 +31375,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -35726,6 +31437,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } @@ -36145,6 +31857,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -36176,15 +31889,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "peer": true, - "peerDependencies": { - "react": ">=17.0" - } - }, "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -36334,16 +32038,6 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/synckit": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", @@ -36537,35 +32231,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmmirror.com/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "peer": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/terser": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -36579,96 +32249,17 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -36677,6 +32268,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -36686,6 +32278,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -36722,18 +32315,6 @@ "real-require": "^0.1.0" } }, - "node_modules/three": { - "version": "0.170.0", - "resolved": "https://registry.npmmirror.com/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "peer": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, "node_modules/throttle-debounce": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", @@ -36748,16 +32329,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "peer": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -36794,13 +32365,6 @@ "integrity": "sha512-uHNGu4evFt/8eNLldazeAM1M8JrMc1jshhJJfVRARTN3yT8HEEibofeQ7QETWQ5ISBjd6fKtTVBCC/+mGS6FpA==", "dev": true }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true, - "peer": true - }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", @@ -36833,7 +32397,8 @@ "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true }, "node_modules/to-arraybuffer": { "version": "1.0.1", @@ -36870,6 +32435,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -36890,7 +32456,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/treeverse": { "version": "1.0.4", @@ -37376,15 +32943,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -37865,7 +33423,8 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/unfetch": { "version": "5.0.0", @@ -37877,6 +33436,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, "engines": { "node": ">=4" } @@ -37885,6 +33445,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -37897,6 +33458,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, "engines": { "node": ">=4" } @@ -37905,6 +33467,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, "engines": { "node": ">=4" } @@ -38074,6 +33637,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -38157,6 +33721,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -38276,7 +33841,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/util-okam": { "version": "0.11.1", @@ -38317,6 +33883,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -38398,13 +33965,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "dev": true, - "peer": true - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -38956,12 +34516,6 @@ "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -38978,6 +34532,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, "dependencies": { "makeerror": "1.0.12" } @@ -38990,19 +34545,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -39033,53 +34575,8 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack-5-chain": { "version": "8.0.1", @@ -39116,46 +34613,6 @@ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/websocket": { "version": "1.0.35", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", @@ -39188,12 +34645,14 @@ "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -39203,6 +34662,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -39343,32 +34803,6 @@ "node": ">=0.4.0" } }, - "node_modules/workerize-loader": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/workerize-loader/-/workerize-loader-2.0.2.tgz", - "integrity": "sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==", - "peer": true, - "dependencies": { - "loader-utils": "^2.0.0" - }, - "peerDependencies": { - "webpack": "*" - } - }, - "node_modules/workerize-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "peer": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -39422,6 +34856,7 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "dev": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -39430,6 +34865,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "engines": { "node": ">=0.4" } @@ -39438,6 +34874,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -40598,12 +36035,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zdog": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/zdog/-/zdog-1.1.3.tgz", - "integrity": "sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==", - "peer": true - }, "node_modules/zod": { "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", @@ -40647,23 +36078,6 @@ "babel-runtime": "6.x" } }, - "node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "peer": true, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Service/Result/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Service/Result/index.tsx index d39475e6aa..554b10f562 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Service/Result/index.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Service/Result/index.tsx @@ -194,7 +194,7 @@ export default (props: { const res = await handleGetOptionWithoutMsg(API_CONSTANTS.GET_LATEST_HISTORY_BY_ID, { id: taskId }); - historyIdParam = res.data.id; + historyIdParam = res?.data?.id; } if (historyIdParam) { const tableData = await handleGetOption( From 4bb76f9c994eb4b93a0f71572f3844d3cb988c86 Mon Sep 17 00:00:00 2001 From: gaoyan Date: Wed, 27 Nov 2024 22:47:59 +0800 Subject: [PATCH 10/45] [Bug] Fix web clear bug (#3971) Co-authored-by: gaoyan1998 --- .../src/main/java/org/dinky/context/ConsoleContextHolder.java | 2 +- .../src/pages/DataStudio/Toolbar/Service/Output/index.tsx | 4 +++- dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/context/ConsoleContextHolder.java b/dinky-admin/src/main/java/org/dinky/context/ConsoleContextHolder.java index 9946af83ff..05939563ba 100644 --- a/dinky-admin/src/main/java/org/dinky/context/ConsoleContextHolder.java +++ b/dinky-admin/src/main/java/org/dinky/context/ConsoleContextHolder.java @@ -121,7 +121,7 @@ public boolean clearProcessLog(String processName) { if (FileUtil.exist(filePath)) { return FileUtil.del(filePath); } - return false; + return true; } /** diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Service/Output/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Service/Output/index.tsx index 0e957561af..8e28fa6769 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Service/Output/index.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Service/Output/index.tsx @@ -37,6 +37,7 @@ import { SseData, Topic } from '@/models/UseWebSocketModel'; const { Text } = Typography; export interface ProcessStep extends DataNode { + key: any; status: string; type: string; startTime: string; @@ -71,7 +72,7 @@ export default (props: { taskId: number }) => { subscribeTopic: model?.subscribeTopic })); - const onUpdate = (data: ProcessStep) => { + const onUpdate = (data?: ProcessStep) => { setProcessNode((prevState: any) => { //如果key不一致代表重新提交了任务,清空旧状态 if ((prevState && prevState?.key != data?.key) || !data) { @@ -97,6 +98,7 @@ export default (props: { taskId: number }) => { ); const refreshProcess = () => { + onUpdate(undefined); subscribeTopic(Topic.PROCESS_CONSOLE, [process], (data: SseData) => onUpdate(data?.data[process]) ); diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx index 89d7d6f45e..85ed4e346b 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/Service/index.tsx @@ -296,7 +296,7 @@ const Service = (props: { showDesc: boolean; tabs: CenterTab[]; action: any }) = }, [tabs, selectedKey, props.action, tabActiveKey]); return ( - + Date: Wed, 27 Nov 2024 22:49:29 +0800 Subject: [PATCH 11/45] [Optimization-3959][core] Optimize submit task print error log (#3960) --- dinky-admin/pom.xml | 16 +++++ .../main/java/org/dinky/init/SystemInit.java | 6 ++ .../factory/CatalogueTreeSortFactory.java | 1 - .../catalogue/impl/CatalogueServiceImpl.java | 1 - .../dinky/service/impl/UDFServiceImpl.java | 4 +- dinky-app/dinky-app-1.20/pom.xml | 1 + dinky-app/dinky-app-base/pom.xml | 12 ---- dinky-assembly/src/main/assembly/package.xml | 8 +++ dinky-core/pom.xml | 39 ------------ .../dinky/data/result/MockResultRunnable.java | 8 +-- .../java/org/dinky/explainer/Explainer.java | 4 +- .../main/java/org/dinky/job/JobManager.java | 13 ++-- .../org/dinky/job/runner/JobDDLRunner.java | 7 +-- .../dinky/job/runner/JobPipelineRunner.java | 7 +-- .../org/dinky/job/runner/JobSetRunner.java | 7 +-- .../org/dinky/job/runner/JobSqlRunner.java | 21 +++---- .../main/java/org/dinky/trans/Operations.java | 29 --------- dinky-function/pom.xml | 5 +- .../org/dinky/function/FlinkUDFDiscover.java | 59 +++++++++++++++++++ dinky-gateway/pom.xml | 4 -- dinky-metadata/dinky-metadata-paimon/pom.xml | 2 + pom.xml | 2 +- 22 files changed, 125 insertions(+), 131 deletions(-) create mode 100644 dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java diff --git a/dinky-admin/pom.xml b/dinky-admin/pom.xml index 0621004116..8181ec7da1 100644 --- a/dinky-admin/pom.xml +++ b/dinky-admin/pom.xml @@ -359,10 +359,26 @@ org.dinky dinky-alert-dingtalk + + org.dinky + dinky-alert-feishu + + + org.dinky + dinky-alert-wechat + org.dinky dinky-alert-sms + + org.dinky + dinky-alert-email + + + org.dinky + dinky-alert-http + diff --git a/dinky-admin/src/main/java/org/dinky/init/SystemInit.java b/dinky-admin/src/main/java/org/dinky/init/SystemInit.java index bc1af97dd4..a2c04c7840 100644 --- a/dinky-admin/src/main/java/org/dinky/init/SystemInit.java +++ b/dinky-admin/src/main/java/org/dinky/init/SystemInit.java @@ -31,6 +31,7 @@ import org.dinky.data.model.Task; import org.dinky.data.model.job.JobInstance; import org.dinky.data.model.rbac.Tenant; +import org.dinky.function.FlinkUDFDiscover; import org.dinky.function.constant.PathConstant; import org.dinky.function.pool.UdfCodePool; import org.dinky.job.ClearJobHistoryTask; @@ -106,6 +107,7 @@ public void run(ApplicationArguments args) { initDaemon(); initDolphinScheduler(); registerUDF(); + discoverUDF(); updateGitBuildState(); registerURL(); } catch (NoClassDefFoundError e) { @@ -220,6 +222,10 @@ public void registerUDF() { UdfCodePool.updateGitPool(gitProjectService.getGitPool()); } + public void discoverUDF() { + FlinkUDFDiscover.getCustomStaticUDFs(); + } + public void updateGitBuildState() { String path = PathConstant.TMP_PATH + "/build.list"; if (FileUtil.exist(path)) { diff --git a/dinky-admin/src/main/java/org/dinky/service/catalogue/factory/CatalogueTreeSortFactory.java b/dinky-admin/src/main/java/org/dinky/service/catalogue/factory/CatalogueTreeSortFactory.java index 393a05f1b3..b3b0de57ba 100644 --- a/dinky-admin/src/main/java/org/dinky/service/catalogue/factory/CatalogueTreeSortFactory.java +++ b/dinky-admin/src/main/java/org/dinky/service/catalogue/factory/CatalogueTreeSortFactory.java @@ -55,7 +55,6 @@ public CatalogueTreeSortStrategy getStrategy(String strategyName) { CatalogueTreeSortStrategy catalogueTreeSortStrategy = Safes.of(catalogueTreeSortStrategyMap).get(strategyName); if (Objects.isNull(catalogueTreeSortStrategy)) { - log.warn("Strategy {} is not defined. Use DefaultStrategy", strategyName); catalogueTreeSortStrategy = Safes.of(catalogueTreeSortStrategyMap).get(CatalogueSortConstant.STRATEGY_DEFAULT); } diff --git a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java index 1f8f4e63b0..392bf968c4 100644 --- a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java @@ -121,7 +121,6 @@ public class CatalogueServiceImpl extends SuperServiceImpl getCatalogueTree(CatalogueTreeQueryDTO catalogueTreeQueryDto) { - log.info("getCatalogueTree, catalogueTreeQueryDto: {}", catalogueTreeQueryDto); List catalogueTree = buildCatalogueTree(this.list()); // sort CatalogueTreeSortStrategy strategy = catalogueTreeSortFactory.getStrategy(catalogueTreeQueryDto.getSortValue()); diff --git a/dinky-admin/src/main/java/org/dinky/service/impl/UDFServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/impl/UDFServiceImpl.java index 4819893d68..3c802b1904 100644 --- a/dinky-admin/src/main/java/org/dinky/service/impl/UDFServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/impl/UDFServiceImpl.java @@ -24,11 +24,11 @@ import org.dinky.data.model.udf.UDFManage; import org.dinky.data.vo.CascaderVO; import org.dinky.data.vo.UDFManageVO; +import org.dinky.function.FlinkUDFDiscover; import org.dinky.function.data.model.UDF; import org.dinky.mapper.UDFManageMapper; import org.dinky.service.UDFService; import org.dinky.service.resource.ResourcesService; -import org.dinky.trans.Operations; import org.dinky.utils.UDFUtils; import org.apache.flink.table.catalog.FunctionLanguage; @@ -182,7 +182,7 @@ public List getUDFFromUdfManage() { @Override public List getAllUdfsToCascader(List userDefinedReleaseUdfs) { // Get all UDFs of static UDFs and dynamic UDFs - List staticUdfs = Operations.getCustomStaticUdfs(); + List staticUdfs = FlinkUDFDiscover.getCustomStaticUDFs(); // get all UDFs of UDFManage table List udfManageDynamic = getUDFFromUdfManage().stream() diff --git a/dinky-app/dinky-app-1.20/pom.xml b/dinky-app/dinky-app-1.20/pom.xml index 8b69fc7600..d1ac0e0879 100644 --- a/dinky-app/dinky-app-1.20/pom.xml +++ b/dinky-app/dinky-app-1.20/pom.xml @@ -60,6 +60,7 @@ ${project.parent.parent.basedir}/build/extends + diff --git a/dinky-app/dinky-app-base/pom.xml b/dinky-app/dinky-app-base/pom.xml index 405114bfdd..c4cad0dd62 100644 --- a/dinky-app/dinky-app-base/pom.xml +++ b/dinky-app/dinky-app-base/pom.xml @@ -46,10 +46,6 @@ org.dinky dinky-core - - com.github.xiaoymin - knife4j-openapi2-spring-boot-starter - com.github.docker-java docker-java-core @@ -82,14 +78,6 @@ org.dinky dinky-gateway - - org.dinky - dinky-alert-sms - - - org.dinky - dinky-alert-dingtalk - diff --git a/dinky-assembly/src/main/assembly/package.xml b/dinky-assembly/src/main/assembly/package.xml index cabb063d48..7cb907dc29 100644 --- a/dinky-assembly/src/main/assembly/package.xml +++ b/dinky-assembly/src/main/assembly/package.xml @@ -122,6 +122,14 @@ dinky-client-1.19-${project.version}.jar + + ${project.parent.basedir}/build/extends/ + extends/flink1.20/dinky + + dinky-catalog-mysql-1.20-${project.version}.jar + dinky-client-1.20-${project.version}.jar + + ${project.parent.basedir}/build/extends/ extends diff --git a/dinky-core/pom.xml b/dinky-core/pom.xml index 819603f2d5..ce2d170444 100644 --- a/dinky-core/pom.xml +++ b/dinky-core/pom.xml @@ -32,11 +32,6 @@ 3.1.0 - org.dinky dinky-common @@ -54,36 +49,6 @@ dinky-metadata-base ${scope.runtime} - - org.dinky - dinky-alert-dingtalk - ${scope.runtime} - - - org.dinky - dinky-alert-wechat - ${scope.runtime} - - - org.dinky - dinky-alert-feishu - ${scope.runtime} - - - org.dinky - dinky-alert-sms - ${scope.runtime} - - - org.dinky - dinky-alert-email - ${scope.runtime} - - - org.dinky - dinky-alert-http - ${scope.runtime} - org.dinky dinky-metadata-paimon @@ -203,10 +168,6 @@ junit-jupiter test - - org.reflections - reflections - org.slf4j slf4j-log4j12 diff --git a/dinky-core/src/main/java/org/dinky/data/result/MockResultRunnable.java b/dinky-core/src/main/java/org/dinky/data/result/MockResultRunnable.java index 3f5cd041fd..28dc9ddda0 100644 --- a/dinky-core/src/main/java/org/dinky/data/result/MockResultRunnable.java +++ b/dinky-core/src/main/java/org/dinky/data/result/MockResultRunnable.java @@ -122,7 +122,7 @@ private void catchChangLog(SelectResult selectResult) { for (String tableIdentifier : tableIdentifierList) { if (!tableIdentifierIndexMap.containsKey(tableIdentifier)) { tableIdentifierIndexMap.put(tableIdentifier, 0); - } else if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum) { + } else if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum - 1) { allSinkFinished = true; continue; } @@ -145,7 +145,7 @@ private void catchChangLog(SelectResult selectResult) { rows.add(rowDataWithTableIdentifier); tableIdentifierIndexMap.put( tableIdentifier, tableIdentifierIndexMap.get(tableIdentifier) + 1); - if (tableIdentifierIndexMap.get(tableIdentifier) > maxRowNum) { + if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum) { break; } } @@ -190,7 +190,7 @@ private void catchData(SelectResult selectResult) { for (String tableIdentifier : tableIdentifierList) { if (!tableIdentifierIndexMap.containsKey(tableIdentifier)) { tableIdentifierIndexMap.put(tableIdentifier, 0); - } else if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum) { + } else if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum - 1) { allSinkFinished = true; continue; } @@ -219,7 +219,7 @@ private void catchData(SelectResult selectResult) { } tableIdentifierIndexMap.put( tableIdentifier, tableIdentifierIndexMap.get(tableIdentifier) + 1); - if (tableIdentifierIndexMap.get(tableIdentifier) > maxRowNum) { + if (tableIdentifierIndexMap.get(tableIdentifier) >= maxRowNum) { break; } } diff --git a/dinky-core/src/main/java/org/dinky/explainer/Explainer.java b/dinky-core/src/main/java/org/dinky/explainer/Explainer.java index 96bb6c6445..4fed7f4afd 100644 --- a/dinky-core/src/main/java/org/dinky/explainer/Explainer.java +++ b/dinky-core/src/main/java/org/dinky/explainer/Explainer.java @@ -41,6 +41,7 @@ import org.dinky.job.builder.JobUDFBuilder; import org.dinky.trans.Operations; import org.dinky.utils.DinkyClassLoaderUtil; +import org.dinky.utils.LogUtil; import org.dinky.utils.SqlUtil; import org.apache.flink.runtime.rest.messages.JobPlanInfo; @@ -141,8 +142,9 @@ public ExplainResult explainSql(String statement) { jobStatementPlan.buildFinalStatement(); jobManager.setJobStatementPlan(jobStatementPlan); } catch (Exception e) { + String error = LogUtil.getError("Exception in parsing FlinkSQL:\n" + SqlUtil.addLineNumber(statement), e); SqlExplainResult.Builder resultBuilder = SqlExplainResult.Builder.newBuilder(); - resultBuilder.error(e.getMessage()).parseTrue(false); + resultBuilder.error(error).parseTrue(false); sqlExplainRecords.add(resultBuilder.build()); log.error("Failed parseStatements:", e); return new ExplainResult(false, sqlExplainRecords.size(), sqlExplainRecords); diff --git a/dinky-core/src/main/java/org/dinky/job/JobManager.java b/dinky-core/src/main/java/org/dinky/job/JobManager.java index 4c4de9a488..f25fa56dd0 100644 --- a/dinky-core/src/main/java/org/dinky/job/JobManager.java +++ b/dinky-core/src/main/java/org/dinky/job/JobManager.java @@ -92,7 +92,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.text.StrFormatter; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -315,16 +314,14 @@ public JobResult executeSql(String statement) throws Exception { } } catch (Exception e) { String errorMessage = e.getMessage(); - if (errorMessage != null && errorMessage.contains("Only insert statement is supported now")) { - throw new BusException(Status.OPERATE_NOT_SUPPORT_QUERY.getMessage()); - } - String error = StrFormatter.format( - "Exception in executing FlinkSQL:\n{}\n{}", SqlUtil.addLineNumber(currentSql), errorMessage); job.setEndTime(LocalDateTime.now()); job.setStatus(Job.JobStatus.FAILED); - job.setError(error); + job.setError(errorMessage); failed(); - throw new Exception(error, e); + if (errorMessage != null && errorMessage.contains("Only insert statement is supported now")) { + throw new BusException(Status.OPERATE_NOT_SUPPORT_QUERY.getMessage()); + } + throw new Exception(errorMessage, e); } finally { close(); } diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java index c46fff071a..59bb856ee8 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java @@ -47,7 +47,6 @@ import java.util.Set; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; @@ -125,10 +124,8 @@ public SqlExplainResult explain(JobStatement jobStatement) { .sql(jobStatement.getStatement()) .index(jobStatement.getIndex()); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - LogUtil.getError(e)); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), e); resultBuilder .error(error) .explainTrue(false) diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java index 07cae22b8f..8c7c1f18e9 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java @@ -51,7 +51,6 @@ import java.util.ArrayList; import java.util.List; -import cn.hutool.core.text.StrFormatter; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -100,10 +99,8 @@ public SqlExplainResult explain(JobStatement jobStatement) { .explainTime(LocalDateTime.now()) .index(jobStatement.getIndex()); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - LogUtil.getError(e)); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), e); resultBuilder .parseTrue(false) .error(error) diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobSetRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobSetRunner.java index 277738cdc9..03e95f158a 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobSetRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobSetRunner.java @@ -29,7 +29,6 @@ import java.time.LocalDateTime; -import cn.hutool.core.text.StrFormatter; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -66,10 +65,8 @@ public SqlExplainResult explain(JobStatement jobStatement) { .explainTime(LocalDateTime.now()) .index(jobStatement.getIndex()); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - LogUtil.getError(e)); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), e); resultBuilder .parseTrue(false) .error(error) diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobSqlRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobSqlRunner.java index 9b2f1be2ee..f0d4bd268b 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobSqlRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobSqlRunner.java @@ -37,6 +37,7 @@ import org.dinky.job.Job; import org.dinky.job.JobConfig; import org.dinky.job.JobManager; +import org.dinky.utils.LogUtil; import org.dinky.utils.SqlUtil; import org.dinky.utils.URLUtils; @@ -54,7 +55,6 @@ import java.util.UUID; import java.util.stream.Collectors; -import cn.hutool.core.text.StrFormatter; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -89,10 +89,8 @@ public SqlExplainResult explain(JobStatement jobStatement) { jobManager.getExecutor().explainSqlRecord(jobStatement.getStatement())); resultBuilder.parseTrue(true).explainTrue(true); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - e.getMessage()); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), e); resultBuilder .type(jobStatement.getSqlType().getType()) .index(jobStatement.getIndex()) @@ -123,10 +121,9 @@ public SqlExplainResult explain(JobStatement jobStatement) { resultBuilder = SqlExplainResult.newBuilder(jobManager.getExecutor().explainStatementSet(statements)); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - e.getMessage()); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), + e); resultBuilder .sql(sqlSet) .index(jobStatement.getIndex()) @@ -152,10 +149,8 @@ public SqlExplainResult explain(JobStatement jobStatement) { jobManager.getExecutor().explainSqlRecord(jobStatement.getStatement())); resultBuilder.parseTrue(true).explainTrue(true); } catch (Exception e) { - String error = StrFormatter.format( - "Exception in explaining FlinkSQL:\n{}\n{}", - SqlUtil.addLineNumber(jobStatement.getStatement()), - e.getMessage()); + String error = LogUtil.getError( + "Exception in explaining FlinkSQL:\n" + SqlUtil.addLineNumber(jobStatement.getStatement()), e); resultBuilder .type(jobStatement.getSqlType().getType()) .index(jobStatement.getIndex()) diff --git a/dinky-core/src/main/java/org/dinky/trans/Operations.java b/dinky-core/src/main/java/org/dinky/trans/Operations.java index 76705eda2e..0bd5d362c3 100644 --- a/dinky-core/src/main/java/org/dinky/trans/Operations.java +++ b/dinky-core/src/main/java/org/dinky/trans/Operations.java @@ -20,23 +20,14 @@ package org.dinky.trans; import org.dinky.data.job.SqlType; -import org.dinky.function.data.model.UDF; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.flink.table.catalog.FunctionLanguage; -import org.apache.flink.table.functions.UserDefinedFunction; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; -import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; import org.reflections.Reflections; import org.reflections.scanners.Scanners; -import org.reflections.util.ClasspathHelper; -import org.reflections.util.ConfigurationBuilder; import lombok.extern.slf4j.Slf4j; @@ -54,7 +45,6 @@ private Operations() {} private static final Operation[] ALL_OPERATIONS = getAllOperations(); - private static final List JAVA_STATIC_UDF_LIST = getCustomStaticUdfs(); /** * get all {@link Operation} children ordinary class, * @@ -105,23 +95,4 @@ public static Operation buildOperation(String statement) { .map(p -> p.create(statement)) .orElse(null); } - - public static List getCustomStaticUdfs() { - if (CollectionUtils.isNotEmpty(JAVA_STATIC_UDF_LIST)) { - return JAVA_STATIC_UDF_LIST; - } - - Reflections reflections = - new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forJavaClassPath())); - Set> operations = - reflections.get(Scanners.SubTypes.of(UserDefinedFunction.class).asClass()); - return operations.stream() - .filter(operation -> - !operation.isInterface() && !operation.getName().startsWith("org.apache")) - .map(operation -> UDF.builder() - .className(operation.getName()) - .functionLanguage(FunctionLanguage.JAVA) - .build()) - .collect(Collectors.toList()); - } } diff --git a/dinky-function/pom.xml b/dinky-function/pom.xml index 5d542e360f..8afce1f9a8 100644 --- a/dinky-function/pom.xml +++ b/dinky-function/pom.xml @@ -74,7 +74,10 @@ lombok provided - + + org.reflections + reflections + org.junit.vintage diff --git a/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java b/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java new file mode 100644 index 0000000000..2b9ab4f595 --- /dev/null +++ b/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java @@ -0,0 +1,59 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.dinky.function; + +import org.dinky.function.data.model.UDF; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.flink.table.catalog.FunctionLanguage; +import org.apache.flink.table.functions.UserDefinedFunction; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; + +public class FlinkUDFDiscover { + + private static final List JAVA_STATIC_UDF_LIST = getCustomStaticUDFs(); + + public static List getCustomStaticUDFs() { + if (CollectionUtils.isNotEmpty(JAVA_STATIC_UDF_LIST)) { + return JAVA_STATIC_UDF_LIST; + } + + Reflections reflections = + new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forJavaClassPath())); + Set> operations = + reflections.get(Scanners.SubTypes.of(UserDefinedFunction.class).asClass()); + return operations.stream() + .filter(operation -> + !operation.isInterface() && !operation.getName().startsWith("org.apache")) + .map(operation -> UDF.builder() + .className(operation.getName()) + .functionLanguage(FunctionLanguage.JAVA) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/dinky-gateway/pom.xml b/dinky-gateway/pom.xml index eaf17b63c5..e60a16f066 100644 --- a/dinky-gateway/pom.xml +++ b/dinky-gateway/pom.xml @@ -31,10 +31,6 @@ Dinky : Gateway - - com.github.xiaoymin - knife4j-openapi2-spring-boot-starter - io.fabric8 kubernetes-client diff --git a/dinky-metadata/dinky-metadata-paimon/pom.xml b/dinky-metadata/dinky-metadata-paimon/pom.xml index 2aa1d5e6c3..afa612b728 100644 --- a/dinky-metadata/dinky-metadata-paimon/pom.xml +++ b/dinky-metadata/dinky-metadata-paimon/pom.xml @@ -40,12 +40,14 @@ org.apache.paimon paimon-bundle 0.8.1 + ${scope.runtime} org.apache.paimon paimon-s3 0.8.1 + ${scope.runtime} diff --git a/pom.xml b/pom.xml index 530f560fb2..00ceeb9c00 100644 --- a/pom.xml +++ b/pom.xml @@ -110,7 +110,7 @@ UTF-8 2.5.0 0.10.2 - 1.2.0 + 1.2.0-rc2 1.37.0 2.12.10 From 9ffea05066a326d30084d68597fbc411606c9497 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Wed, 27 Nov 2024 23:34:16 +0800 Subject: [PATCH 12/45] []Optimize][Web]Optimize flink jar form select (#3972) Co-authored-by: zackyoungh --- .../org/dinky/controller/TaskController.java | 2 +- dinky-web/src/locales/en-US/pages.ts | 1 + dinky-web/src/locales/zh-CN/pages.ts | 1 + .../CenterTabContent/SqlTask/index.tsx | 86 ++++++++++--------- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/controller/TaskController.java b/dinky-admin/src/main/java/org/dinky/controller/TaskController.java index bed837eca8..f9edef0b57 100644 --- a/dinky-admin/src/main/java/org/dinky/controller/TaskController.java +++ b/dinky-admin/src/main/java/org/dinky/controller/TaskController.java @@ -348,6 +348,6 @@ public Result flinkJarFormConvertSql(@RequestBody FlinkJarSqlConvertVO d .orElse(false) .toString()); String executeJarSql = ENGINE.getTemplate("executeJar.sql").render(objectMap); - return Result.succeed(dto.getInitSqlStatement() + "\n" + executeJarSql, ""); + return Result.succeed(Opt.ofNullable(dto.getInitSqlStatement()).orElse("") + "\n" + executeJarSql, ""); } } diff --git a/dinky-web/src/locales/en-US/pages.ts b/dinky-web/src/locales/en-US/pages.ts index de19d34911..6001e26e9b 100644 --- a/dinky-web/src/locales/en-US/pages.ts +++ b/dinky-web/src/locales/en-US/pages.ts @@ -157,6 +157,7 @@ export default { 'datastudio.sqlTask.flinkJar.tip': 'The code editor on the left is the FlinkSql pre-statement, and the current form item is the EXECUTE JAR WITH syntax', 'datastudio.sqlTask.flinkJar.uri': 'Program path', + 'datastudio.sqlTask.flinkJar.manualInput': 'Manual input', 'datastudio.sqlTask.flinkJar.uri.tip': 'Please enter the path to run the program (uri)', 'datastudio.sqlTask.flinkJar.mainClass': 'Program running class (mainClass)', 'datastudio.sqlTask.flinkJar.mainClass.tip': diff --git a/dinky-web/src/locales/zh-CN/pages.ts b/dinky-web/src/locales/zh-CN/pages.ts index 230e48a385..3c3751288a 100644 --- a/dinky-web/src/locales/zh-CN/pages.ts +++ b/dinky-web/src/locales/zh-CN/pages.ts @@ -144,6 +144,7 @@ export default { 'datastudio.project.import.tip': '点击或拖拽文件到此区域上传', 'datastudio.sqlTask.flinkJar.tip': '左边代码编辑器是 FlinkSql 前置语句,当前表单项是 EXECUTE JAR WITH 语法', + 'datastudio.sqlTask.flinkJar.manualInput': '手动输入', 'datastudio.sqlTask.flinkJar.uri': '程序路径', 'datastudio.sqlTask.flinkJar.uri.tip': '请输入运行程序路径(uri)', 'datastudio.sqlTask.flinkJar.mainClass': '程序运行类(mainClass)', diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index a426ab24a0..7d29ef1e90 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -46,6 +46,7 @@ import { connect, useModel } from '@umijs/max'; import CusPanelResizeHandle from '@/pages/DataStudio/components/CusPanelResizeHandle'; import { ProForm, + ProFormCheckbox, ProFormInstance, ProFormSwitch, ProFormText, @@ -93,13 +94,9 @@ import DiffModal from '@/pages/DataStudio/CenterTabContent/SqlTask/DiffModal'; import TaskConfig from '@/pages/DataStudio/CenterTabContent/SqlTask/TaskConfig'; import SelectDb from '@/pages/DataStudio/CenterTabContent/RunToolbar/SelectDb'; import { SseData, Topic } from '@/models/UseWebSocketModel'; -import WarpProFormTreeSelect from '@ant-design/pro-form/es/components/TreeSelect'; import { ResourceInfo } from '@/types/RegCenter/data'; -import { - buildResourceTreeData, - buildResourceTreeDataAtTreeForm -} from '@/pages/RegCenter/Resource/components/FileTree/function'; -import Paragraph from 'antd/es/typography/Paragraph'; +import { buildResourceTreeDataAtTreeForm } from '@/pages/RegCenter/Resource/components/FileTree/function'; +import { ProFormDependency } from '@ant-design/pro-form'; export type FlinkSqlProps = { showDesc: boolean; @@ -912,41 +909,51 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { })); }} > - {/**/} - { - return buildResourceTreeDataAtTreeForm( - tempData.resourceDataList as ResourceInfo[], - false, - [] + + + + {({ manualInput }) => { + return manualInput?.length > 0 ? ( + + ) : ( + { + return buildResourceTreeDataAtTreeForm( + tempData.resourceDataList as ResourceInfo[], + false, + [] + ); + }} + normalize={(value) => { + return value?.value ?? ''; + }} + name={'uri'} + label={l('datastudio.sqlTask.flinkJar.uri')} + placeholder={l('datastudio.sqlTask.flinkJar.uri.tip')} + fieldProps={{ + suffixIcon: null, + filterTreeNode: true, + showSearch: true, + treeIcon: true, + popupMatchSelectWidth: false, + labelInValue: true, + autoClearSearchValue: true, + treeLine: true, + treeDefaultExpandedKeys: ['rs:/'], + treeNodeLabelProp: 'value', + fieldNames: { + label: 'title' + } + }} + /> ); }} - normalize={(value) => { - return value.value; - }} - name={'uri'} - label={l('datastudio.sqlTask.flinkJar.uri')} - placeholder={l('datastudio.sqlTask.flinkJar.uri.tip')} - fieldProps={{ - suffixIcon: null, - filterTreeNode: true, - showSearch: true, - treeIcon: true, - popupMatchSelectWidth: false, - labelInValue: true, - autoClearSearchValue: true, - treeLine: true, - treeDefaultExpandedKeys: ['rs:/'], - treeNodeLabelProp: 'value', - fieldNames: { - label: 'title' - } - }} - /> + + { /> From c5558a7c43cb7bfe180f7df7d4fb3fe1512340ce Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Thu, 28 Nov 2024 20:25:55 +0800 Subject: [PATCH 13/45] [Optimize][Pom]Optimize app package size (#3978) Co-authored-by: zackyoungh --- dinky-app/dinky-app-1.15/pom.xml | 52 ++++++++++++++----- dinky-app/dinky-app-1.16/pom.xml | 52 ++++++++++++++----- dinky-app/dinky-app-1.17/pom.xml | 52 ++++++++++++++----- dinky-app/dinky-app-1.18/pom.xml | 52 ++++++++++++++----- dinky-app/dinky-app-1.19/pom.xml | 52 ++++++++++++++----- dinky-app/dinky-app-1.20/pom.xml | 51 +++++++++++++----- .../serializer/LocalDateTimeDeserializer.java | 2 +- .../serializer/LocalDateTimeSerializer.java | 2 +- .../main/java/org/dinky/utils/JsonUtils.java | 4 +- .../org/dinky/job/runner/JobDDLRunner.java | 1 + pom.xml | 2 +- 11 files changed, 239 insertions(+), 83 deletions(-) rename dinky-common/src/main/java/{ => org/dinky}/serializer/LocalDateTimeDeserializer.java (98%) rename dinky-common/src/main/java/{ => org/dinky}/serializer/LocalDateTimeSerializer.java (98%) diff --git a/dinky-app/dinky-app-1.15/pom.xml b/dinky-app/dinky-app-1.15/pom.xml index 0b3c9ee27d..948bc7e8b2 100644 --- a/dinky-app/dinky-app-1.15/pom.xml +++ b/dinky-app/dinky-app-1.15/pom.xml @@ -63,25 +63,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.16/pom.xml b/dinky-app/dinky-app-1.16/pom.xml index 7c5a83c133..6be6856c88 100644 --- a/dinky-app/dinky-app-1.16/pom.xml +++ b/dinky-app/dinky-app-1.16/pom.xml @@ -47,25 +47,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.17/pom.xml b/dinky-app/dinky-app-1.17/pom.xml index 7d1a452df3..391ef7abb3 100644 --- a/dinky-app/dinky-app-1.17/pom.xml +++ b/dinky-app/dinky-app-1.17/pom.xml @@ -47,25 +47,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.18/pom.xml b/dinky-app/dinky-app-1.18/pom.xml index d9f6606eae..c24aa73f87 100644 --- a/dinky-app/dinky-app-1.18/pom.xml +++ b/dinky-app/dinky-app-1.18/pom.xml @@ -47,25 +47,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.19/pom.xml b/dinky-app/dinky-app-1.19/pom.xml index 67e592eb08..248fba0f5d 100644 --- a/dinky-app/dinky-app-1.19/pom.xml +++ b/dinky-app/dinky-app-1.19/pom.xml @@ -47,25 +47,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.20/pom.xml b/dinky-app/dinky-app-1.20/pom.xml index d1ac0e0879..0de8c5ad21 100644 --- a/dinky-app/dinky-app-1.20/pom.xml +++ b/dinky-app/dinky-app-1.20/pom.xml @@ -47,26 +47,51 @@ org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + com.sun/** + META-INF/resources/** + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-common/src/main/java/serializer/LocalDateTimeDeserializer.java b/dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeDeserializer.java similarity index 98% rename from dinky-common/src/main/java/serializer/LocalDateTimeDeserializer.java rename to dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeDeserializer.java index 5383c24b57..7b25d94ad4 100644 --- a/dinky-common/src/main/java/serializer/LocalDateTimeDeserializer.java +++ b/dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeDeserializer.java @@ -17,7 +17,7 @@ * */ -package serializer; +package org.dinky.serializer; import java.io.IOException; import java.time.LocalDateTime; diff --git a/dinky-common/src/main/java/serializer/LocalDateTimeSerializer.java b/dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeSerializer.java similarity index 98% rename from dinky-common/src/main/java/serializer/LocalDateTimeSerializer.java rename to dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeSerializer.java index 23f7863e7d..69e963c6c1 100644 --- a/dinky-common/src/main/java/serializer/LocalDateTimeSerializer.java +++ b/dinky-common/src/main/java/org/dinky/serializer/LocalDateTimeSerializer.java @@ -17,7 +17,7 @@ * */ -package serializer; +package org.dinky.serializer; import java.io.IOException; import java.time.LocalDateTime; diff --git a/dinky-common/src/main/java/org/dinky/utils/JsonUtils.java b/dinky-common/src/main/java/org/dinky/utils/JsonUtils.java index 8347fd8396..b3110927b5 100644 --- a/dinky-common/src/main/java/org/dinky/utils/JsonUtils.java +++ b/dinky-common/src/main/java/org/dinky/utils/JsonUtils.java @@ -26,6 +26,8 @@ import static java.nio.charset.StandardCharsets.UTF_8; import org.dinky.assertion.Asserts; +import org.dinky.serializer.LocalDateTimeDeserializer; +import org.dinky.serializer.LocalDateTimeSerializer; import java.io.IOException; import java.time.LocalDateTime; @@ -62,8 +64,6 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import serializer.LocalDateTimeDeserializer; -import serializer.LocalDateTimeSerializer; /** * JsonUtils diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java index 59bb856ee8..8852ae023f 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobDDLRunner.java @@ -144,6 +144,7 @@ private void executeAdd(String statement) { allFilePath.forEach(t -> jobManager.getUdfPathContextHolder().addOtherPlugins(t)); (jobManager.getExecutor().getDinkyClassLoader()) .addURLs(URLUtils.getURLs(jobManager.getUdfPathContextHolder().getOtherPluginsFiles())); + jobManager.getExecutor().addJar(ArrayUtil.toArray(allFilePath, File.class)); } private void executeAddFile(String statement) { diff --git a/pom.xml b/pom.xml index 00ceeb9c00..784e2287fe 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ 3.0.0 3.4.0 3.3.0 - 3.4.1 + 3.6.0 3.0.0-M5 ${target.java.version} ${target.java.version} From 3a4aacadc6fae61fa265db6b183a43a79bbe970d Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Thu, 28 Nov 2024 20:27:02 +0800 Subject: [PATCH 14/45] [Optimize][Web] Optimize the responsive layout of the login interface (#3979) --- .../components/Flink/FlinkDag/functions.tsx | 3 +- .../src/pages/Other/Login/LoginForm/index.tsx | 94 ++++++++++--------- dinky-web/src/pages/Other/Login/index.tsx | 1 - 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/dinky-web/src/components/Flink/FlinkDag/functions.tsx b/dinky-web/src/components/Flink/FlinkDag/functions.tsx index 552aef63f8..cde1bbfa02 100644 --- a/dinky-web/src/components/Flink/FlinkDag/functions.tsx +++ b/dinky-web/src/components/Flink/FlinkDag/functions.tsx @@ -26,8 +26,7 @@ export const buildDag = (job: Jobs.JobPlan) => { const nodes: any = []; if (!job) return { nodes: nodes, edges: edges }; - - job.nodes.forEach((node) => { + job.nodes?.forEach((node) => { nodes.push({ id: node.id, shape: 'data-processing-dag-node', diff --git a/dinky-web/src/pages/Other/Login/LoginForm/index.tsx b/dinky-web/src/pages/Other/Login/LoginForm/index.tsx index 1d83bf60df..c12e470a3a 100644 --- a/dinky-web/src/pages/Other/Login/LoginForm/index.tsx +++ b/dinky-web/src/pages/Other/Login/LoginForm/index.tsx @@ -17,26 +17,26 @@ * */ -import { API_CONSTANTS } from '@/services/endpoints'; -import { l } from '@/utils/intl'; -import { GithubOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'; -import { DefaultFooter, ProForm, ProFormCheckbox, ProFormText } from '@ant-design/pro-components'; -import { SubmitterProps } from '@ant-design/pro-form/es/components'; -import { Col, Flex, Row } from 'antd'; -import React, { useState } from 'react'; +import {API_CONSTANTS} from '@/services/endpoints'; +import {l} from '@/utils/intl'; +import {GithubOutlined, LockOutlined, UserOutlined} from '@ant-design/icons'; +import {DefaultFooter, ProForm, ProFormCheckbox, ProFormText} from '@ant-design/pro-components'; +import {SubmitterProps} from '@ant-design/pro-form/es/components'; +import {Col, Flex, Row} from 'antd'; +import React, {useState} from 'react'; import style from '../../../../global.less'; import Lottie from 'react-lottie'; import DataPlatform from '../../../../../public/login_animation.json'; -import { useRequest } from '@@/exports'; -import { history } from '@umijs/max'; -import { GLOBAL_SETTING_KEYS } from '@/types/SettingCenter/data.d'; +import {useRequest} from '@@/exports'; +import {history} from '@umijs/max'; +import {GLOBAL_SETTING_KEYS} from '@/types/SettingCenter/data.d'; type LoginFormProps = { onSubmit: (values: any) => Promise; }; const LoginForm: React.FC = (props) => { - const { onSubmit } = props; + const {onSubmit} = props; const [form] = ProForm.useForm(); @@ -55,7 +55,7 @@ const LoginForm: React.FC = (props) => { const handleClickLogin = async () => { setSubmitting(true); - await onSubmit({ ...form.getFieldsValue() }); + await onSubmit({...form.getFieldsValue()}); setSubmitting(false); }; @@ -66,7 +66,7 @@ const LoginForm: React.FC = (props) => { name='username' fieldProps={{ size: 'large', - prefix: + prefix: }} required placeholder={l('login.username.placeholder')} @@ -81,7 +81,7 @@ const LoginForm: React.FC = (props) => { name='password' fieldProps={{ size: 'large', - prefix: + prefix: }} placeholder={l('login.password.placeholder')} rules={[ @@ -95,7 +95,7 @@ const LoginForm: React.FC = (props) => { {l('login.rememberMe')} - + @@ -106,7 +106,7 @@ const LoginForm: React.FC = (props) => { }; const proFormSubmitter: SubmitterProps = { - searchConfig: { submitText: l('menu.login') }, + searchConfig: {submitText: l('menu.login')}, resetButtonProps: false, submitButtonProps: { loading: submitting, @@ -114,7 +114,7 @@ const LoginForm: React.FC = (props) => { htmlType: 'submit', size: 'large', shape: 'round', - style: { width: '100%' } + style: {width: '100%'} } }; @@ -140,34 +140,40 @@ const LoginForm: React.FC = (props) => { }} > - - {''} -

{l('layouts.userLayout.title')}

-
+ + + + {''}/ +

{l('layouts.userLayout.title')}

+
+ - - {renderLoginForm()} - + + + {renderLoginForm()} + + +
= (props) => { }, { key: 'github', - title: , + title: , href: 'https://github.com/DataLinkDC/dinky', blankTarget: true } @@ -187,9 +193,9 @@ const LoginForm: React.FC = (props) => { = (props) => { height: '100%' }} > - + = (props) => { src={'./icons/footer-bg.svg'} width={'100%'} alt={''} - style={{ position: 'absolute', bottom: 0 }} + style={{position: 'absolute', bottom: 0}} /> ); diff --git a/dinky-web/src/pages/Other/Login/index.tsx b/dinky-web/src/pages/Other/Login/index.tsx index 4a0ee89c74..ef974db1dd 100644 --- a/dinky-web/src/pages/Other/Login/index.tsx +++ b/dinky-web/src/pages/Other/Login/index.tsx @@ -17,7 +17,6 @@ * */ -import Footer from '@/components/Footer'; import ChooseModal from '@/pages/Other/Login/ChooseModal'; import { gotoRedirectUrl, initSomeThing, redirectToLogin } from '@/pages/Other/Login/function'; import LangSwitch from '@/pages/Other/Login/LangSwitch'; From a4719f9185052c3a98bd61d42aee7a80ea8d4704 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Thu, 28 Nov 2024 20:27:50 +0800 Subject: [PATCH 15/45] [BugFix][web] Fixed an error when using the copy button in the Resource Center (#3980) --- dinky-web/src/utils/function.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dinky-web/src/utils/function.tsx b/dinky-web/src/utils/function.tsx index eaf8014ba7..1106ba0ed8 100644 --- a/dinky-web/src/utils/function.tsx +++ b/dinky-web/src/utils/function.tsx @@ -649,7 +649,7 @@ export const parseDateStringToDate = (dateString: Date) => { */ export async function handleCopyToClipboard(copyText: string) { // Adapting to browsers without the navigator.clipboard.writeText method can be done using the following code - if (!navigator) { + if (!navigator?.clipboard) { const textarea = document.createElement('textarea'); textarea.value = copyText; document.body.appendChild(textarea); From 9f44bcc833117d9af90488b0eae44151b9127207 Mon Sep 17 00:00:00 2001 From: Wink <32723967+aiwenmo@users.noreply.github.com> Date: Thu, 28 Nov 2024 21:40:05 +0800 Subject: [PATCH 16/45] [Feature-3973][*] Release 1.2.0-rc4 (#3981) --- .gitignore | 5 +- .../org/dinky/init/FlinkHistoryServer.java | 15 +- .../dinky/cdc/convert/DataTypeConverter.java | 5 +- .../dinky/resource/BaseResourceManager.java | 40 +++ .../java/org/dinky/executor/Executor.java | 6 + .../java/org/dinky/explainer/Explainer.java | 25 +- .../dinky/job/runner/JobPipelineRunner.java | 18 ++ .../org/dinky/function/FlinkUDFDiscover.java | 30 ++- .../org/dinky/function/util/Reflections.java | 227 ++++++++++++++++++ docs/download/dinky-1.2.0.md | 18 +- pom.xml | 2 +- 11 files changed, 349 insertions(+), 42 deletions(-) create mode 100644 dinky-function/src/main/java/org/dinky/function/util/Reflections.java diff --git a/.gitignore b/.gitignore index f642fdb5b1..ef3b6a8de2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,6 @@ dinky.db hs_err_pid* .idea/* !.idea/icon.svg -!.idea/vcs.xml build target/* *.iml @@ -63,4 +62,6 @@ tmp/* extends/* /.run/ -.idea \ No newline at end of file +.idea +.idea/vcs.xml +dinky-web/package-lock.json diff --git a/dinky-admin/src/main/java/org/dinky/init/FlinkHistoryServer.java b/dinky-admin/src/main/java/org/dinky/init/FlinkHistoryServer.java index 6aaf689bb4..f29966fbf3 100644 --- a/dinky-admin/src/main/java/org/dinky/init/FlinkHistoryServer.java +++ b/dinky-admin/src/main/java/org/dinky/init/FlinkHistoryServer.java @@ -19,10 +19,8 @@ package org.dinky.init; -import org.dinky.data.model.ResourcesModelEnum; -import org.dinky.data.model.S3Configuration; import org.dinky.data.model.SystemConfiguration; -import org.dinky.data.properties.OssProperties; +import org.dinky.resource.BaseResourceManager; import org.dinky.service.JobInstanceService; import org.dinky.service.SysConfigService; @@ -63,16 +61,7 @@ public FlinkHistoryServer(JobInstanceService jobInstanceService, SysConfigServic this.historyRunnable = () -> { Map flinkHistoryServerConfiguration = SystemConfiguration.getInstances().getFlinkHistoryServerConfiguration(); - if (systemConfiguration.getResourcesEnable().getValue()) { - if (systemConfiguration.getResourcesModel().getValue().equals(ResourcesModelEnum.OSS)) { - OssProperties ossProperties = systemConfiguration.getOssProperties(); - flinkHistoryServerConfiguration.put(S3Configuration.ENDPOINT, ossProperties.getEndpoint()); - flinkHistoryServerConfiguration.put(S3Configuration.ACCESS_KEY, ossProperties.getAccessKey()); - flinkHistoryServerConfiguration.put(S3Configuration.SECRET_KEY, ossProperties.getSecretKey()); - flinkHistoryServerConfiguration.put( - S3Configuration.PATH_STYLE_ACCESS, String.valueOf(ossProperties.getPathStyleAccess())); - } - } + flinkHistoryServerConfiguration.putAll(BaseResourceManager.convertFlinkResourceConfig()); HistoryServerUtil.run( (jobId) -> { diff --git a/dinky-cdc/dinky-cdc-core/src/main/java/org/dinky/cdc/convert/DataTypeConverter.java b/dinky-cdc/dinky-cdc-core/src/main/java/org/dinky/cdc/convert/DataTypeConverter.java index e12c0d6d8a..a1f80fde30 100644 --- a/dinky-cdc/dinky-cdc-core/src/main/java/org/dinky/cdc/convert/DataTypeConverter.java +++ b/dinky-cdc/dinky-cdc-core/src/main/java/org/dinky/cdc/convert/DataTypeConverter.java @@ -49,7 +49,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.util.Optional; import java.util.concurrent.TimeUnit; import javax.xml.bind.DatatypeConverter; @@ -117,7 +116,7 @@ public static LogicalType getLogicalType(Column column) { public static Object convertToRow(Object value, LogicalType logicalType, ZoneId timeZone) { if (Asserts.isNull(value)) { - return Optional.empty(); + return null; } switch (logicalType.getTypeRoot()) { case BOOLEAN: @@ -163,7 +162,7 @@ public static Object convertToRow(Object value, LogicalType logicalType, ZoneId public static Object convertToRowData(Object value, LogicalType logicalType, ZoneId timeZone) { if (Asserts.isNull(value)) { - return Optional.empty(); + return null; } switch (logicalType.getTypeRoot()) { case BOOLEAN: diff --git a/dinky-client/dinky-client-base/src/main/java/org/dinky/resource/BaseResourceManager.java b/dinky-client/dinky-client-base/src/main/java/org/dinky/resource/BaseResourceManager.java index af9b0e7935..e5e6d0e845 100644 --- a/dinky-client/dinky-client-base/src/main/java/org/dinky/resource/BaseResourceManager.java +++ b/dinky-client/dinky-client-base/src/main/java/org/dinky/resource/BaseResourceManager.java @@ -19,9 +19,13 @@ package org.dinky.resource; +import org.dinky.assertion.Asserts; import org.dinky.data.exception.DinkyException; +import org.dinky.data.model.ResourcesModelEnum; import org.dinky.data.model.ResourcesVO; +import org.dinky.data.model.S3Configuration; import org.dinky.data.model.SystemConfiguration; +import org.dinky.data.properties.OssProperties; import org.dinky.oss.OssTemplate; import org.dinky.resource.impl.HdfsResourceManager; import org.dinky.resource.impl.LocalResourceManager; @@ -34,7 +38,9 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -74,6 +80,9 @@ static BaseResourceManager getInstance() { } static void initResourceManager() { + if (Asserts.isNull(instances.getResourcesModel().getValue())) { + return; + } switch (instances.getResourcesModel().getValue()) { case LOCAL: Singleton.get(LocalResourceManager.class); @@ -106,6 +115,37 @@ static void initResourceManager() { } } + static Map convertFlinkResourceConfig() { + Map flinkConfig = new HashMap<>(); + if (!instances.getResourcesEnable().getValue()) { + return flinkConfig; + } + if (instances.getResourcesModel().getValue().equals(ResourcesModelEnum.OSS)) { + OssProperties ossProperties = instances.getOssProperties(); + flinkConfig.put(S3Configuration.ENDPOINT, ossProperties.getEndpoint()); + flinkConfig.put(S3Configuration.ACCESS_KEY, ossProperties.getAccessKey()); + flinkConfig.put(S3Configuration.SECRET_KEY, ossProperties.getSecretKey()); + flinkConfig.put(S3Configuration.PATH_STYLE_ACCESS, String.valueOf(ossProperties.getPathStyleAccess())); + } else if (instances.getResourcesModel().getValue().equals(ResourcesModelEnum.HDFS)) { + final Configuration configuration = new Configuration(); + Charset charset = Charset.defaultCharset(); + String coreSite = instances.getResourcesHdfsCoreSite().getValue(); + Opt.ofBlankAble(coreSite).ifPresent(x -> configuration.addResource(IoUtil.toStream(x, charset))); + String hdfsSite = instances.getResourcesHdfsHdfsSite().getValue(); + Opt.ofBlankAble(hdfsSite).ifPresent(x -> configuration.addResource(IoUtil.toStream(x, charset))); + configuration.reloadConfiguration(); + if (StrUtil.isEmpty(coreSite)) { + configuration.set( + "fs.defaultFS", instances.getResourcesHdfsDefaultFS().getValue()); + } + Map hadoopConfig = configuration.getValByRegex(".*"); + hadoopConfig.forEach((key, value) -> { + flinkConfig.put("flink.hadoop." + key, value); + }); + } + return flinkConfig; + } + default String getFilePath(String path) { return FileUtil.normalize(FileUtil.file(getBasePath(), path).toString()); } diff --git a/dinky-core/src/main/java/org/dinky/executor/Executor.java b/dinky-core/src/main/java/org/dinky/executor/Executor.java index acf43bf1d3..777918e434 100644 --- a/dinky-core/src/main/java/org/dinky/executor/Executor.java +++ b/dinky-core/src/main/java/org/dinky/executor/Executor.java @@ -31,6 +31,7 @@ import org.dinky.interceptor.FlinkInterceptor; import org.dinky.interceptor.FlinkInterceptorResult; import org.dinky.job.JobStatementPlan; +import org.dinky.resource.BaseResourceManager; import org.dinky.trans.Operations; import org.dinky.utils.KerberosUtil; @@ -169,6 +170,7 @@ private void initClassloader(DinkyClassLoader classLoader) { protected void init(DinkyClassLoader classLoader) { initClassloader(classLoader); + initFileSystem(); this.dinkyClassLoader = classLoader; Thread.currentThread().setContextClassLoader(classLoader); if (executorConfig.isValidParallelism()) { @@ -195,6 +197,10 @@ protected void init(DinkyClassLoader classLoader) { isMockTest = false; } + private void initFileSystem() { + BaseResourceManager.initResourceManager(); + } + abstract CustomTableEnvironment createCustomTableEnvironment(ClassLoader classLoader); public JobStatementPlan parseStatementIntoJobStatementPlan(String[] statements) { diff --git a/dinky-core/src/main/java/org/dinky/explainer/Explainer.java b/dinky-core/src/main/java/org/dinky/explainer/Explainer.java index 4fed7f4afd..39d86200e4 100644 --- a/dinky-core/src/main/java/org/dinky/explainer/Explainer.java +++ b/dinky-core/src/main/java/org/dinky/explainer/Explainer.java @@ -98,7 +98,20 @@ public Explainer initialize(JobConfig config, String statement) { } public JobStatementPlan parseStatements(String[] statements) { - JobStatementPlan jobStatementPlanWithUDFAndMock = new JobStatementPlan(); + JobStatementPlan jobStatementPlanWithMock = new JobStatementPlan(); + generateUDFStatement(jobStatementPlanWithMock); + + JobStatementPlan jobStatementPlan = executor.parseStatementIntoJobStatementPlan(statements); + jobStatementPlanWithMock.getJobStatementList().addAll(jobStatementPlan.getJobStatementList()); + if (!jobManager.isPlanMode() && jobManager.getConfig().isMockSinkFunction()) { + executor.setMockTest(true); + MockStatementExplainer.build(executor.getCustomTableEnvironment()) + .jobStatementPlanMock(jobStatementPlanWithMock); + } + return jobStatementPlanWithMock; + } + + private void generateUDFStatement(JobStatementPlan jobStatementPlan) { List udfStatements = new ArrayList<>(); Optional.ofNullable(jobManager.getConfig().getUdfRefer()) .ifPresent(t -> t.forEach((key, value) -> { @@ -106,16 +119,8 @@ public JobStatementPlan parseStatements(String[] statements) { udfStatements.add(sql); })); for (String udfStatement : udfStatements) { - jobStatementPlanWithUDFAndMock.addJobStatement(udfStatement, JobStatementType.DDL, SqlType.CREATE); - } - JobStatementPlan jobStatementPlan = executor.parseStatementIntoJobStatementPlan(statements); - jobStatementPlanWithUDFAndMock.getJobStatementList().addAll(jobStatementPlan.getJobStatementList()); - if (!jobManager.isPlanMode() && jobManager.getConfig().isMockSinkFunction()) { - executor.setMockTest(true); - MockStatementExplainer.build(executor.getCustomTableEnvironment()) - .jobStatementPlanMock(jobStatementPlanWithUDFAndMock); + jobStatementPlan.addJobStatement(udfStatement, JobStatementType.DDL, SqlType.CREATE); } - return jobStatementPlanWithUDFAndMock; } public List parseUDFFromStatements(String[] statements) { diff --git a/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java b/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java index 8c7c1f18e9..15cbb8e689 100644 --- a/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java +++ b/dinky-core/src/main/java/org/dinky/job/runner/JobPipelineRunner.java @@ -34,6 +34,7 @@ import org.dinky.job.Job; import org.dinky.job.JobConfig; import org.dinky.job.JobManager; +import org.dinky.trans.parse.ExecuteJarParseStrategy; import org.dinky.utils.FlinkStreamEnvironmentUtil; import org.dinky.utils.LogUtil; import org.dinky.utils.SqlUtil; @@ -66,6 +67,11 @@ public JobPipelineRunner(JobManager jobManager) { @Override public void run(JobStatement jobStatement) throws Exception { + if (ExecuteJarParseStrategy.INSTANCE.match(jobStatement.getStatement())) { + JobJarRunner jobJarRunner = new JobJarRunner(jobManager); + jobJarRunner.run(jobStatement); + return; + } statements.add(jobStatement); tableResult = jobManager.getExecutor().executeSql(jobStatement.getStatement()); if (statements.size() == 1) { @@ -83,6 +89,10 @@ public void run(JobStatement jobStatement) throws Exception { @Override public SqlExplainResult explain(JobStatement jobStatement) { + if (ExecuteJarParseStrategy.INSTANCE.match(jobStatement.getStatement())) { + JobJarRunner jobJarRunner = new JobJarRunner(jobManager); + return jobJarRunner.explain(jobStatement); + } SqlExplainResult.Builder resultBuilder = SqlExplainResult.Builder.newBuilder(); statements.add(jobStatement); // pipeline job execute to generate stream graph. @@ -131,6 +141,10 @@ public SqlExplainResult explain(JobStatement jobStatement) { @Override public StreamGraph getStreamGraph(JobStatement jobStatement) { + if (ExecuteJarParseStrategy.INSTANCE.match(jobStatement.getStatement())) { + JobJarRunner jobJarRunner = new JobJarRunner(jobManager); + return jobJarRunner.getStreamGraph(jobStatement); + } statements.add(jobStatement); // pipeline job execute to generate stream graph. jobManager.getExecutor().executeSql(jobStatement.getStatement()); @@ -144,6 +158,10 @@ public StreamGraph getStreamGraph(JobStatement jobStatement) { @Override public JobPlanInfo getJobPlanInfo(JobStatement jobStatement) { + if (ExecuteJarParseStrategy.INSTANCE.match(jobStatement.getStatement())) { + JobJarRunner jobJarRunner = new JobJarRunner(jobManager); + return jobJarRunner.getJobPlanInfo(jobStatement); + } statements.add(jobStatement); // pipeline job execute to generate stream graph. jobManager.getExecutor().executeSql(jobStatement.getStatement()); diff --git a/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java b/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java index 2b9ab4f595..89eaf67f19 100644 --- a/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java +++ b/dinky-function/src/main/java/org/dinky/function/FlinkUDFDiscover.java @@ -20,18 +20,21 @@ package org.dinky.function; import org.dinky.function.data.model.UDF; +import org.dinky.function.util.Reflections; import org.apache.commons.collections.CollectionUtils; import org.apache.flink.table.catalog.FunctionLanguage; import org.apache.flink.table.functions.UserDefinedFunction; +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.reflections.Reflections; import org.reflections.scanners.Scanners; -import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; public class FlinkUDFDiscover { @@ -42,9 +45,28 @@ public static List getCustomStaticUDFs() { if (CollectionUtils.isNotEmpty(JAVA_STATIC_UDF_LIST)) { return JAVA_STATIC_UDF_LIST; } + Collection urls = new ArrayList<>(); + String javaClassPath = System.getProperty("java.class.path"); + if (javaClassPath != null) { + for (String path : javaClassPath.split(File.pathSeparator)) { + if (path.contains("/*")) { + continue; + } + if (!path.contains("extends") && !path.contains("customJar")) { + continue; + } - Reflections reflections = - new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forJavaClassPath())); + try { + urls.add(new File(path).toURI().toURL()); + } catch (Exception e) { + if (Reflections.log != null) { + Reflections.log.warn("Could not get URL", e); + } + } + } + } + + Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(urls)); Set> operations = reflections.get(Scanners.SubTypes.of(UserDefinedFunction.class).asClass()); return operations.stream() diff --git a/dinky-function/src/main/java/org/dinky/function/util/Reflections.java b/dinky-function/src/main/java/org/dinky/function/util/Reflections.java new file mode 100644 index 0000000000..872b656e80 --- /dev/null +++ b/dinky-function/src/main/java/org/dinky/function/util/Reflections.java @@ -0,0 +1,227 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.dinky.function.util; + +import static java.lang.String.format; +import static org.reflections.scanners.Scanners.SubTypes; +import static org.reflections.scanners.Scanners.TypesAnnotated; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.lang.annotation.Annotation; +import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import javassist.bytecode.ClassFile; + +import javax.annotation.Nullable; + +import org.reflections.Configuration; +import org.reflections.ReflectionUtils; +import org.reflections.ReflectionsException; +import org.reflections.Store; +import org.reflections.scanners.Scanner; +import org.reflections.scanners.Scanners; +import org.reflections.util.NameHelper; +import org.reflections.util.QueryFunction; +import org.reflections.vfs.Vfs; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Reflections one-stop-shop object + */ +public class Reflections implements NameHelper { + public static final Logger log = LoggerFactory.getLogger(Reflections.class); + + protected final transient Configuration configuration; + protected final Store store; + + /** + * constructs Reflections instance and scan according to the given {@link Configuration} + *

it is preferred to use {@link org.reflections.util.ConfigurationBuilder}

{@code new Reflections(new ConfigurationBuilder()...)}
+ */ + public Reflections(Configuration configuration) { + this.configuration = configuration; + Map>> storeMap = scan(); + if (configuration.shouldExpandSuperTypes()) { + expandSuperTypes(storeMap.get(SubTypes.index()), storeMap.get(TypesAnnotated.index())); + } + store = new Store(storeMap); + } + + protected Map>> scan() { + long start = System.currentTimeMillis(); + Map>> collect = configuration.getScanners().stream() + .map(Scanner::index) + .distinct() + .collect(Collectors.toMap(s -> s, s -> Collections.synchronizedSet(new HashSet<>()))); + Set urls = configuration.getUrls(); + + (configuration.isParallel() ? urls.stream().parallel() : urls.stream()).forEach(url -> { + Vfs.Dir dir = null; + try { + dir = Vfs.fromURL(url); + for (Vfs.File file : dir.getFiles()) { + if (doFilter(file, configuration.getInputsFilter())) { + ClassFile classFile = null; + for (Scanner scanner : configuration.getScanners()) { + try { + if (doFilter(file, scanner::acceptsInput)) { + List> entries = scanner.scan(file); + if (entries == null) { + if (classFile == null) classFile = getClassFile(file); + entries = scanner.scan(classFile); + } + if (entries != null) + collect.get(scanner.index()).addAll(entries); + } + } catch (Exception e) { + if (log != null) + log.trace( + "could not scan file {} with scanner {}", + file.getRelativePath(), + scanner.getClass().getSimpleName(), + e); + } + } + } + } + } catch (Exception e) { + // nothing to do. + } finally { + if (dir != null) dir.close(); + } + }); + + // merge + Map>> storeMap = collect.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream() + .filter(e -> e.getKey() != null) + .collect(Collectors.groupingBy( + Map.Entry::getKey, + HashMap::new, + Collectors.mapping(Map.Entry::getValue, Collectors.toSet()))))); + if (log != null) { + int keys = 0, values = 0; + for (Map> map : storeMap.values()) { + keys += map.size(); + values += map.values().stream().mapToLong(Set::size).sum(); + } + log.info(format( + "Reflections took %d ms to scan %d urls, producing %d keys and %d values", + System.currentTimeMillis() - start, urls.size(), keys, values)); + } + return storeMap; + } + + private boolean doFilter(Vfs.File file, @Nullable Predicate predicate) { + String path = file.getRelativePath(); + String fqn = path.replace('/', '.'); + return predicate == null || predicate.test(path) || predicate.test(fqn); + } + + private ClassFile getClassFile(Vfs.File file) { + try (DataInputStream dis = new DataInputStream(new BufferedInputStream(file.openInputStream()))) { + return new ClassFile(dis); + } catch (Exception e) { + throw new ReflectionsException("could not create class object from file " + file.getRelativePath(), e); + } + } + + /** + * expand super types after scanning, for super types that were not scanned. + *
this is helpful for finding the transitive closure without scanning all 3rd party dependencies. + *

+ * for example, for classes A,B,C where A supertype of B, B supertype of C (A -> B -> C): + *
    + *
  • if scanning C resulted in B (B->C in store), but A was not scanned (although A is a supertype of B) - then getSubTypes(A) will not return C
  • + *
  • if expanding supertypes, B will be expanded with A (A->B in store) - then getSubTypes(A) will return C
  • + *
+ */ + public void expandSuperTypes(Map> subTypesStore, Map> typesAnnotatedStore) { + if (subTypesStore == null || subTypesStore.isEmpty()) return; + Set keys = new LinkedHashSet<>(subTypesStore.keySet()); + keys.removeAll( + subTypesStore.values().stream().flatMap(Collection::stream).collect(Collectors.toSet())); + keys.remove("java.lang.Object"); + for (String key : keys) { + Class type = forClass(key, loaders()); + if (type != null) { + expandSupertypes(subTypesStore, typesAnnotatedStore, key, type); + } + } + } + + private void expandSupertypes( + Map> subTypesStore, + Map> typesAnnotatedStore, + String key, + Class type) { + Set typeAnnotations = ReflectionUtils.getAnnotations(type); + if (typesAnnotatedStore != null && !typeAnnotations.isEmpty()) { + String typeName = type.getName(); + for (Annotation typeAnnotation : typeAnnotations) { + String annotationName = typeAnnotation.annotationType().getName(); + typesAnnotatedStore + .computeIfAbsent(annotationName, s -> new HashSet<>()) + .add(typeName); + } + } + for (Class supertype : ReflectionUtils.getSuperTypes(type)) { + String supertypeName = supertype.getName(); + if (subTypesStore.containsKey(supertypeName)) { + subTypesStore.get(supertypeName).add(key); + } else { + subTypesStore + .computeIfAbsent(supertypeName, s -> new HashSet<>()) + .add(key); + expandSupertypes(subTypesStore, typesAnnotatedStore, supertypeName, supertype); + } + } + } + + /** + * apply {@link QueryFunction} on {@link Store} + *
{@code Set ts = get(query)}
+ *

use {@link Scanners} and {@link ReflectionUtils} query functions, such as: + *

{@code
+     * Set annotated = get(Scanners.TypesAnnotated.with(A.class))
+     * Set> subtypes = get(Scanners.SubTypes.of(B.class).asClass())
+     * Set methods = get(ReflectionUtils.Methods.of(B.class))
+     * }
+ */ + public Set get(QueryFunction query) { + return query.apply(store); + } + + ClassLoader[] loaders() { + return configuration.getClassLoaders(); + } +} diff --git a/docs/download/dinky-1.2.0.md b/docs/download/dinky-1.2.0.md index 203759e05f..406ab0e33d 100644 --- a/docs/download/dinky-1.2.0.md +++ b/docs/download/dinky-1.2.0.md @@ -3,15 +3,15 @@ sidebar_position: 78 title: 1.2.0 release --- -| Dinky 版本 | Flink 版本 | 二进制程序 | Source | -|----------|----------|---------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| -| 1.2.0 | 1.14 | [dinky-release-1.14-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.14-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.15 | [dinky-release-1.15-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.15-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.16 | [dinky-release-1.16-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.16-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.17 | [dinky-release-1.17-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.17-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.18 | [dinky-release-1.18-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.18-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.19 | [dinky-release-1.19-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.19-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | -| 1.2.0 | 1.20 | [dinky-release-1.20-1.2.0.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.19-1.2.0.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| Dinky 版本 | Flink 版本 | 二进制程序 | Source | +|----------|----------|-------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| +| 1.2.0 | 1.14 | [dinky-release-1.14-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.14-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.15 | [dinky-release-1.15-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.15-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.16 | [dinky-release-1.16-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.16-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.17 | [dinky-release-1.17-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.17-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.18 | [dinky-release-1.18-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.18-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.19 | [dinky-release-1.19-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.19-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | +| 1.2.0 | 1.20 | [dinky-release-1.20-1.2.0-rc4.tar.gz](https://github.com/DataLinkDC/dinky/releases/download/v1.2.0/dinky-release-1.19-1.2.0-rc4.tar.gz) | [Source code (zip)](https://github.com/DataLinkDC/dinky/archive/refs/tags/v1.2.0.zip) | ## Dinky-1.2.0 发行说明 diff --git a/pom.xml b/pom.xml index 784e2287fe..cd73757a55 100644 --- a/pom.xml +++ b/pom.xml @@ -110,7 +110,7 @@ UTF-8 2.5.0 0.10.2 - 1.2.0-rc2 + 1.2.0-rc4 1.37.0 2.12.10 From 4ed0d19fe04c4bc74d076f357ba5b076f69b6fc7 Mon Sep 17 00:00:00 2001 From: MactavishCui <166927232+MactavishCui@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:04:45 +0800 Subject: [PATCH 17/45] [Optimization][Data Development] variable suggestion optimization (#3982) --- .../main/java/org/dinky/service/impl/SuggestionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dinky-admin/src/main/java/org/dinky/service/impl/SuggestionServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/impl/SuggestionServiceImpl.java index 3cef8b8d96..eb00b6b762 100644 --- a/dinky-admin/src/main/java/org/dinky/service/impl/SuggestionServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/impl/SuggestionServiceImpl.java @@ -91,7 +91,7 @@ private static void buildGlobalVariableSuggestions( .key(fragmentVariable.getId() + "_fragmentVariable") .label(suggestionLabelVO) .kind(4) - .insertText(fragmentVariable.getFragmentValue()) + .insertText(fragmentVariable.getName()) .detail(fragmentVariable.getNote()) .build(); }) From 737af39df5477f94228277527447f2f6b5708502 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Sun, 1 Dec 2024 21:07:10 +0800 Subject: [PATCH 18/45] [Feature][web] Add resource management to the datastudio page (#3986) Co-authored-by: zackyoungh --- .../CenterTabContent/SqlTask/index.tsx | 12 +- .../src/pages/DataStudio/DvaFunction.tsx | 5 + .../DataStudio/Toolbar/Resource/index.tsx | 396 ++++++++++++++++++ .../pages/DataStudio/Toolbar/ToolbarRoute.tsx | 9 + dinky-web/src/pages/DataStudio/index.tsx | 8 +- .../src/pages/Other/Login/LoginForm/index.tsx | 64 +-- .../SettingCenter/GlobalSetting/model.ts | 4 +- .../SettingCenter/GlobalSetting/service.ts | 6 +- 8 files changed, 464 insertions(+), 40 deletions(-) create mode 100644 dinky-web/src/pages/DataStudio/Toolbar/Resource/index.tsx diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index 7d29ef1e90..0004a37ca4 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -188,10 +188,6 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { if (taskDetail) { const statement = params.statement ?? taskDetail.statement; const newParams = { ...taskDetail, taskId: params.taskId, statement, mockSinkFunction: true }; - // @ts-ignore - setCurrentState(newParams); - updateCenterTab({ ...props.tabData, params: newParams }); - if (taskDetail.dialect.toLowerCase() === DIALECT.FLINKJAR) { const sqlConvertForm = await flinkJarSqlConvertForm(taskDetail.statement); setSqlForm({ enable: true, ...sqlConvertForm }); @@ -213,6 +209,9 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { } } else { setOriginStatementValue(statement); + // @ts-ignore + setCurrentState(newParams); + updateCenterTab({ ...props.tabData, params: newParams }); if (params?.statement && params?.statement !== taskDetail.statement) { setDiff([{ key: 'statement', server: taskDetail.statement, cache: params.statement }]); setOpenDiffModal(true); @@ -909,7 +908,10 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { })); }} > - + {({ manualInput }) => { diff --git a/dinky-web/src/pages/DataStudio/DvaFunction.tsx b/dinky-web/src/pages/DataStudio/DvaFunction.tsx index 4bae47f2bd..8ff71e7be1 100644 --- a/dinky-web/src/pages/DataStudio/DvaFunction.tsx +++ b/dinky-web/src/pages/DataStudio/DvaFunction.tsx @@ -125,6 +125,11 @@ export const mapDispatchToProps = (dispatch: Dispatch) => { type: CONFIG_MODEL_ASYNC.queryDsConfig, payload: params }), + queryResourceConfig: (params: string) => + dispatch({ + type: CONFIG_MODEL_ASYNC.queryResourceConfig, + payload: params + }), queryResource: () => dispatch({ type: STUDIO_MODEL_ASYNC.queryResource diff --git a/dinky-web/src/pages/DataStudio/Toolbar/Resource/index.tsx b/dinky-web/src/pages/DataStudio/Toolbar/Resource/index.tsx new file mode 100644 index 0000000000..331984a899 --- /dev/null +++ b/dinky-web/src/pages/DataStudio/Toolbar/Resource/index.tsx @@ -0,0 +1,396 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { connect, history } from '@@/exports'; +import { DataStudioState } from '@/pages/DataStudio/model'; +import { mapDispatchToProps } from '@/pages/DataStudio/DvaFunction'; +import React, { useCallback, useEffect, useState } from 'react'; +import { ResourceState } from '@/types/RegCenter/state'; +import { InitResourceState } from '@/types/RegCenter/init.d'; +import { API_CONSTANTS } from '@/services/endpoints'; +import { + handleGetOption, + handleOption, + handleRemoveById, + queryDataByParams +} from '@/services/BusinessCrud'; +import { ResourceInfo } from '@/types/RegCenter/data'; +import { SysConfigStateType } from '@/pages/SettingCenter/GlobalSetting/model'; +import { handleCopyToClipboard, unSupportView } from '@/utils/function'; +import { + ResourceRightMenuKey, + RIGHT_CONTEXT_FILE_MENU, + RIGHT_CONTEXT_FOLDER_MENU +} from '@/pages/RegCenter/Resource/components/constants'; +import { Button, Modal, Result } from 'antd'; +import { l } from '@/utils/intl'; +import { AuthorizedObject, useAccess } from '@/hooks/useAccess'; +import { ProCard } from '@ant-design/pro-components'; +import { WarningOutlined } from '@ant-design/icons'; +import FileTree from '@/pages/RegCenter/Resource/components/FileTree'; +import RightContextMenu from '@/components/RightContextMenu'; +import ResourceModal from '@/pages/RegCenter/Resource/components/ResourceModal'; +import ResourcesUploadModal from '@/pages/RegCenter/Resource/components/ResourcesUploadModal'; +import { MenuInfo } from 'rc-menu/es/interface'; + +const Resource = (props: { + enableResource: boolean; + resourcePhysicalDelete: boolean; + resourceDataList: ResourceInfo[]; + queryResource: any; +}) => { + const { resourceDataList, enableResource, queryResource, resourcePhysicalDelete } = props; + + const [resourceState, setResourceState] = useState({ + ...InitResourceState, + treeData: resourceDataList + }); + + const [editModal, setEditModal] = useState(''); + + const [uploadValue] = useState({ + url: API_CONSTANTS.BASE_URL + API_CONSTANTS.RESOURCE_UPLOAD, + pid: '', + description: '' + }); + useEffect(() => { + setResourceState((prevState) => ({ ...prevState, treeData: resourceDataList })); + }, [resourceDataList]); + + const refreshTree = async () => { + await queryResource(); + }; + + /** + * query content by id + * @type {(id: number) => Promise} + */ + const queryContent: (id: number) => Promise = useCallback(async (id: number) => { + await queryDataByParams(API_CONSTANTS.RESOURCE_GET_CONTENT_BY_ID, { + id + }).then((res) => setResourceState((prevState) => ({ ...prevState, content: res ?? '' }))); + }, []); + + /** + * the node click event + * @param info + * @returns {Promise} + */ + const handleNodeClick = async (info: any): Promise => { + const { + node: { id, isLeaf, key, name }, + node + } = info; + setResourceState((prevState) => ({ ...prevState, selectedKeys: [key], clickedNode: node })); + if (isLeaf && !unSupportView(name)) { + await queryContent(id); + } else { + setResourceState((prevState) => ({ ...prevState, content: '' })); + } + }; + + /** + * the node right click event OF upload, + */ + const handleCreateFolder = () => { + if (resourceState.rightClickedNode) { + setEditModal(ResourceRightMenuKey.CREATE_FOLDER); + const { id } = resourceState.rightClickedNode; + setResourceState((prevState) => ({ + ...prevState, + editOpen: true, + value: { id, fileName: '', description: '' }, + contextMenuOpen: false + })); + } + }; + const handleUpload = () => { + if (resourceState.rightClickedNode) { + uploadValue.pid = resourceState.rightClickedNode.id; + // todo: upload + setResourceState((prevState) => ({ ...prevState, uploadOpen: true, contextMenuOpen: false })); + } + }; + + const realDelete = async () => { + await handleRemoveById(API_CONSTANTS.RESOURCE_REMOVE, resourceState.rightClickedNode.id); + await refreshTree(); + }; + + /** + * the node right click event OF delete, + */ + const handleDelete = async () => { + if (resourceState.rightClickedNode) { + setResourceState((prevState) => ({ ...prevState, contextMenuOpen: false })); + if (resourcePhysicalDelete) { + Modal.confirm({ + title: l('rc.resource.delete'), + content: l('rc.resource.deleteConfirm'), + onOk: async () => realDelete() + }); + } else { + await realDelete(); + } + } + }; + + /** + * the node right click event OF rename, + */ + const handleRename = () => { + if (resourceState.rightClickedNode) { + setEditModal(ResourceRightMenuKey.RENAME); + const { id, name, desc } = resourceState.rightClickedNode; + setResourceState((prevState) => ({ + ...prevState, + editOpen: true, + value: { id, fileName: name, description: desc }, + contextMenuOpen: false + })); + } + }; + + const handleMenuClick = async (node: MenuInfo) => { + const { fullInfo } = resourceState.rightClickedNode; + switch (node.key) { + case ResourceRightMenuKey.CREATE_FOLDER: + handleCreateFolder(); + break; + case ResourceRightMenuKey.UPLOAD: + handleUpload(); + break; + case ResourceRightMenuKey.DELETE: + await handleDelete(); + break; + case ResourceRightMenuKey.RENAME: + handleRename(); + break; + case ResourceRightMenuKey.COPY_TO_ADD_CUSTOM_JAR: + if (fullInfo) { + const fillValue = `ADD CUSTOMJAR 'rs:${fullInfo.fullName}';`; + await handleCopyToClipboard(fillValue); + } + break; + case ResourceRightMenuKey.COPY_TO_ADD_JAR: + if (fullInfo) { + const fillValue = `ADD JAR 'rs:${fullInfo.fullName}';`; + await handleCopyToClipboard(fillValue); + } + break; + case ResourceRightMenuKey.COPY_TO_ADD_FILE: + if (fullInfo) { + const fillValue = `ADD FILE 'rs:${fullInfo.fullName}';`; + await handleCopyToClipboard(fillValue); + } + break; + case ResourceRightMenuKey.COPY_TO_ADD_RS_PATH: + if (fullInfo) { + const fillValue = `rs:${fullInfo.fullName}`; + await handleCopyToClipboard(fillValue); + } + break; + default: + break; + } + }; + + /** + * the right click event + * @param info + */ + const handleRightClick = (info: any) => { + // Obtain the node information for right-click + const { node, event } = info; + + // Determine if the position of the right button exceeds the screen. If it exceeds the screen, set it to the maximum value of the screen offset upwards by 75 (it needs to be reasonably set according to the specific number of right button menus) + if (event.clientY + 150 > window.innerHeight) { + event.clientY = window.innerHeight - 75; + } + + setResourceState((prevState) => ({ + ...prevState, + selectedKeys: [node.key], + rightClickedNode: node, + contextMenuOpen: true, + contextMenuPosition: { + ...prevState.contextMenuPosition, + top: event.clientY + 5, + left: event.clientX + 10, + screenX: event.screenX, + screenY: event.screenY + } + })); + }; + + const handleSync = async () => { + Modal.confirm({ + title: l('rc.resource.sync'), + content: l('rc.resource.sync.confirm'), + onOk: async () => { + await handleGetOption(API_CONSTANTS.RESOURCE_SYNC_DATA, l('rc.resource.sync'), {}); + await refreshTree(); + } + }); + }; + + /** + * the rename cancel + */ + const handleModalCancel = async () => { + setResourceState((prevState) => ({ ...prevState, editOpen: false })); + await refreshTree(); + }; + + /** + * the rename ok + */ + const handleModalSubmit = async (value: Partial) => { + const { id: pid } = resourceState.rightClickedNode; + if (editModal === ResourceRightMenuKey.CREATE_FOLDER) { + await handleOption( + API_CONSTANTS.RESOURCE_CREATE_FOLDER, + l('right.menu.createFolder'), + { + ...value, + pid + }, + () => handleModalCancel() + ); + } else if (editModal === ResourceRightMenuKey.RENAME) { + await handleOption( + API_CONSTANTS.RESOURCE_RENAME, + l('right.menu.rename'), + { ...value, pid }, + () => handleModalCancel() + ); + } + }; + const handleUploadCancel = async () => { + setResourceState((prevState) => ({ ...prevState, uploadOpen: false })); + await refreshTree(); + }; + const access = useAccess(); + + const renderRightMenu = () => { + if (!resourceState.rightClickedNode.isLeaf) { + return RIGHT_CONTEXT_FOLDER_MENU.filter( + (menu) => !menu.path || !!AuthorizedObject({ path: menu.path, children: menu, access }) + ); + } + return RIGHT_CONTEXT_FILE_MENU.filter( + (menu) => !menu.path || !!AuthorizedObject({ path: menu.path, children: menu, access }) + ); + }; + + /** + * render + */ + return ( + <> + {!enableResource ? ( + + } + title={l('rc.resource.enable')} + subTitle={l('rc.resource.enable.tips')} + extra={ + + } + /> + + ) : ( + <> + + handleNodeClick(info)} + onSync={handleSync} + /> + + setResourceState((prevState) => ({ ...prevState, contextMenuOpen: false })) + } + items={renderRightMenu()} + onClick={handleMenuClick} + /> + + {resourceState.editOpen && ( + + )} + {resourceState.uploadOpen && ( + + )} + + )} + + ); +}; + +export default connect( + ({ DataStudio, SysConfig }: { DataStudio: DataStudioState; SysConfig: SysConfigStateType }) => ({ + resourceDataList: DataStudio.tempData.resourceDataList, + enableResource: SysConfig.enableResource, + resourcePhysicalDelete: SysConfig.resourcePhysicalDelete + }), + mapDispatchToProps +)(Resource); diff --git a/dinky-web/src/pages/DataStudio/Toolbar/ToolbarRoute.tsx b/dinky-web/src/pages/DataStudio/Toolbar/ToolbarRoute.tsx index f22efa3972..52a6dc29c9 100644 --- a/dinky-web/src/pages/DataStudio/Toolbar/ToolbarRoute.tsx +++ b/dinky-web/src/pages/DataStudio/Toolbar/ToolbarRoute.tsx @@ -22,6 +22,7 @@ import { CodeOutlined, ConsoleSqlOutlined, DatabaseOutlined, + FileZipOutlined, FunctionOutlined, SettingOutlined, TableOutlined, @@ -41,6 +42,7 @@ const Service = lazy(() => import('@/pages/DataStudio/Toolbar/Service')); const Tool = lazy(() => import('@/pages/DataStudio/Toolbar/Tool')); const Catalog = lazy(() => import('@/pages/DataStudio/Toolbar/Catalog')); const FlinkSqlClient = lazy(() => import('@/pages/DataStudio/Toolbar/FlinkSqlClient')); +const Resource = lazy(() => import('@/pages/DataStudio/Toolbar/Resource')); export const ToolbarRoutes: ToolbarRoute[] = [ { key: 'quick-start', @@ -97,6 +99,13 @@ export const ToolbarRoutes: ToolbarRoute[] = [ icon: , position: 'leftBottom', content: () => lazyComponent() + }, + { + key: 'resource', + title: () => l('datastudio.middle.qg.resource'), + icon: , + position: 'leftTop', + content: () => lazyComponent() } ]; diff --git a/dinky-web/src/pages/DataStudio/index.tsx b/dinky-web/src/pages/DataStudio/index.tsx index 8ef1ff4c95..d71d7ffe28 100644 --- a/dinky-web/src/pages/DataStudio/index.tsx +++ b/dinky-web/src/pages/DataStudio/index.tsx @@ -79,7 +79,8 @@ const DataStudio: React.FC = (props: any) => { queryUserData, queryDsConfig, queryTaskOwnerLockingStrategy, - queryResource + queryResource, + queryResourceConfig } = props; const [_, token] = useToken(); @@ -140,10 +141,13 @@ const DataStudio: React.FC = (props: any) => { await queryUserData({ id: getTenantByLocalStorage() }); await queryDsConfig(); await queryTaskOwnerLockingStrategy(); + await queryResourceConfig(); + }, []); + useAsyncEffect(async () => { if (enableResource) { await queryResource(); } - }, []); + }, [enableResource]); useEffect(() => { const { actionType, params } = dataStudioState.action; if (actionType?.includes('task-run-')) { diff --git a/dinky-web/src/pages/Other/Login/LoginForm/index.tsx b/dinky-web/src/pages/Other/Login/LoginForm/index.tsx index c12e470a3a..aa987a048f 100644 --- a/dinky-web/src/pages/Other/Login/LoginForm/index.tsx +++ b/dinky-web/src/pages/Other/Login/LoginForm/index.tsx @@ -17,26 +17,26 @@ * */ -import {API_CONSTANTS} from '@/services/endpoints'; -import {l} from '@/utils/intl'; -import {GithubOutlined, LockOutlined, UserOutlined} from '@ant-design/icons'; -import {DefaultFooter, ProForm, ProFormCheckbox, ProFormText} from '@ant-design/pro-components'; -import {SubmitterProps} from '@ant-design/pro-form/es/components'; -import {Col, Flex, Row} from 'antd'; -import React, {useState} from 'react'; +import { API_CONSTANTS } from '@/services/endpoints'; +import { l } from '@/utils/intl'; +import { GithubOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'; +import { DefaultFooter, ProForm, ProFormCheckbox, ProFormText } from '@ant-design/pro-components'; +import { SubmitterProps } from '@ant-design/pro-form/es/components'; +import { Col, Flex, Row } from 'antd'; +import React, { useState } from 'react'; import style from '../../../../global.less'; import Lottie from 'react-lottie'; import DataPlatform from '../../../../../public/login_animation.json'; -import {useRequest} from '@@/exports'; -import {history} from '@umijs/max'; -import {GLOBAL_SETTING_KEYS} from '@/types/SettingCenter/data.d'; +import { useRequest } from '@@/exports'; +import { history } from '@umijs/max'; +import { GLOBAL_SETTING_KEYS } from '@/types/SettingCenter/data.d'; type LoginFormProps = { onSubmit: (values: any) => Promise; }; const LoginForm: React.FC = (props) => { - const {onSubmit} = props; + const { onSubmit } = props; const [form] = ProForm.useForm(); @@ -55,7 +55,7 @@ const LoginForm: React.FC = (props) => { const handleClickLogin = async () => { setSubmitting(true); - await onSubmit({...form.getFieldsValue()}); + await onSubmit({ ...form.getFieldsValue() }); setSubmitting(false); }; @@ -66,7 +66,7 @@ const LoginForm: React.FC = (props) => { name='username' fieldProps={{ size: 'large', - prefix: + prefix: }} required placeholder={l('login.username.placeholder')} @@ -81,7 +81,7 @@ const LoginForm: React.FC = (props) => { name='password' fieldProps={{ size: 'large', - prefix: + prefix: }} placeholder={l('login.password.placeholder')} rules={[ @@ -95,7 +95,7 @@ const LoginForm: React.FC = (props) => { {l('login.rememberMe')} - + @@ -106,7 +106,7 @@ const LoginForm: React.FC = (props) => { }; const proFormSubmitter: SubmitterProps = { - searchConfig: {submitText: l('menu.login')}, + searchConfig: { submitText: l('menu.login') }, resetButtonProps: false, submitButtonProps: { loading: submitting, @@ -114,7 +114,7 @@ const LoginForm: React.FC = (props) => { htmlType: 'submit', size: 'large', shape: 'round', - style: {width: '100%'} + style: { width: '100%' } } }; @@ -140,7 +140,13 @@ const LoginForm: React.FC = (props) => { }} > = (props) => { xxl={8} > - + - {''}/ -

{l('layouts.userLayout.title')}

+ {''} +

{l('layouts.userLayout.title')}

- + {renderLoginForm()} @@ -173,7 +179,7 @@ const LoginForm: React.FC = (props) => {
= (props) => { }, { key: 'github', - title: , + title: , href: 'https://github.com/DataLinkDC/dinky', blankTarget: true } @@ -203,7 +209,7 @@ const LoginForm: React.FC = (props) => { height: '100%' }} > - + = (props) => { src={'./icons/footer-bg.svg'} width={'100%'} alt={''} - style={{position: 'absolute', bottom: 0}} + style={{ position: 'absolute', bottom: 0 }} /> ); diff --git a/dinky-web/src/pages/SettingCenter/GlobalSetting/model.ts b/dinky-web/src/pages/SettingCenter/GlobalSetting/model.ts index 8f297cb0a6..f6fb589460 100644 --- a/dinky-web/src/pages/SettingCenter/GlobalSetting/model.ts +++ b/dinky-web/src/pages/SettingCenter/GlobalSetting/model.ts @@ -101,8 +101,8 @@ const ConfigModel: ConfigModelType = { }); } }, - *queryResourceConfig({ payload }, { call, put }) { - const response: BaseConfigProperties[] = yield call(queryResourceConfig, payload); + *queryResourceConfig({}, { call, put }) { + const response: BaseConfigProperties[] = yield call(queryResourceConfig); yield put({ type: 'saveDsConfig', payload: response || [] diff --git a/dinky-web/src/pages/SettingCenter/GlobalSetting/service.ts b/dinky-web/src/pages/SettingCenter/GlobalSetting/service.ts index 679443b584..5cd0f79cb5 100644 --- a/dinky-web/src/pages/SettingCenter/GlobalSetting/service.ts +++ b/dinky-web/src/pages/SettingCenter/GlobalSetting/service.ts @@ -27,8 +27,10 @@ export async function queryDsConfig() { }); } -export async function queryResourceConfig(keyword: string) { - return await queryDataByParams(API_CONSTANTS.SYSTEM_GET_ONE_TYPE_CONFIG, { type: keyword }); +export async function queryResourceConfig() { + return await queryDataByParams(API_CONSTANTS.SYSTEM_GET_ONE_TYPE_CONFIG, { + type: SettingConfigKeyEnum.RESOURCE.toLowerCase() + }); } export async function queryTaskOwnerLockingStrategy() { From d69b4a37c07a5c1b70fb7cd8edd5a41166d0cc76 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Sun, 1 Dec 2024 21:15:40 +0800 Subject: [PATCH 19/45] [Optimize][Admin] Optimized the package size of the App and the rs protocol (#3985) Co-authored-by: zackyoungh --- .../dinky/url/RsURLStreamHandlerFactory.java | 21 ++++--- dinky-app/dinky-app-1.14/pom.xml | 57 ++++++++++++++----- dinky-app/dinky-app-1.15/pom.xml | 7 ++- dinky-app/dinky-app-1.16/pom.xml | 7 ++- dinky-app/dinky-app-1.17/pom.xml | 7 ++- dinky-app/dinky-app-1.18/pom.xml | 7 ++- dinky-app/dinky-app-1.19/pom.xml | 7 ++- dinky-app/dinky-app-1.20/pom.xml | 7 ++- .../org/dinky/app/flinksql/Submitter.java | 2 +- .../dinky/url/RsURLStreamHandlerFactory.java | 21 +++---- dinky-metadata/dinky-metadata-paimon/pom.xml | 2 +- 11 files changed, 105 insertions(+), 40 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java b/dinky-admin/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java index 81e3b10d16..c996d6dc97 100644 --- a/dinky-admin/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java +++ b/dinky-admin/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java @@ -23,27 +23,30 @@ import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; -import java.util.Arrays; -import java.util.List; import org.springframework.context.annotation.Profile; import cn.hutool.core.lang.Singleton; -import cn.hutool.core.util.StrUtil; @Profile("!test") public class RsURLStreamHandlerFactory implements URLStreamHandlerFactory { - private final List notContains = Arrays.asList("jar", "file", "http", "https"); + private static final String PREFIX = "sun.net.www.protocol"; @Override public URLStreamHandler createURLStreamHandler(String protocol) { - if ("rs".equals(protocol)) { + if ("rs".equalsIgnoreCase(protocol)) { return new RsURLStreamHandler(); } - for (String tempProtocol : notContains) { - if (tempProtocol.equals(StrUtil.sub(protocol, 0, tempProtocol.length()))) { - return null; - } + String name = PREFIX + "." + protocol + ".Handler"; + try { + @SuppressWarnings("deprecation") + Object o = Class.forName(name).newInstance(); + return (URLStreamHandler) o; + } catch (ClassNotFoundException x) { + // ignore + } catch (Exception e) { + // For compatibility, all Exceptions are ignored. + // any number of exceptions can get thrown here } try { diff --git a/dinky-app/dinky-app-1.14/pom.xml b/dinky-app/dinky-app-1.14/pom.xml index 7203f9783d..09679c952b 100644 --- a/dinky-app/dinky-app-1.14/pom.xml +++ b/dinky-app/dinky-app-1.14/pom.xml @@ -64,25 +64,56 @@ org.apache.maven.plugins - maven-assembly-plugin - 2.6 + maven-shade-plugin - - jar-with-dependencies - - - - - org.dinky.app.MainApp - - + ${project.build.finalName}-jar-with-dependencies ${project.parent.parent.basedir}/build/extends + true + false + + + org.dinky:* + + org/dinky/** + org/apache/flink/** + org/apache/calcite/** + META-INF/** + + + + *:* + + tpch/** + tpcds/** + support/** + springfox/** + org/slf4j/** + org/springframework/** + javax/** + javassist/** + Class50/** + lombok/** + freemarker/** + META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** + + + + + + + + org.dinky.app.MainApp + + - make-assembly - single + shade package diff --git a/dinky-app/dinky-app-1.15/pom.xml b/dinky-app/dinky-app-1.15/pom.xml index 948bc7e8b2..f20db97a70 100644 --- a/dinky-app/dinky-app-1.15/pom.xml +++ b/dinky-app/dinky-app-1.15/pom.xml @@ -74,6 +74,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -91,8 +93,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-1.16/pom.xml b/dinky-app/dinky-app-1.16/pom.xml index 6be6856c88..b66832fc87 100644 --- a/dinky-app/dinky-app-1.16/pom.xml +++ b/dinky-app/dinky-app-1.16/pom.xml @@ -58,6 +58,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -75,8 +77,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-1.17/pom.xml b/dinky-app/dinky-app-1.17/pom.xml index 391ef7abb3..ddaf4d3a24 100644 --- a/dinky-app/dinky-app-1.17/pom.xml +++ b/dinky-app/dinky-app-1.17/pom.xml @@ -58,6 +58,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -75,8 +77,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-1.18/pom.xml b/dinky-app/dinky-app-1.18/pom.xml index c24aa73f87..2516336720 100644 --- a/dinky-app/dinky-app-1.18/pom.xml +++ b/dinky-app/dinky-app-1.18/pom.xml @@ -58,6 +58,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -75,8 +77,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-1.19/pom.xml b/dinky-app/dinky-app-1.19/pom.xml index 248fba0f5d..cf75c56bd9 100644 --- a/dinky-app/dinky-app-1.19/pom.xml +++ b/dinky-app/dinky-app-1.19/pom.xml @@ -58,6 +58,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -75,8 +77,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-1.20/pom.xml b/dinky-app/dinky-app-1.20/pom.xml index 0de8c5ad21..a9dd099378 100644 --- a/dinky-app/dinky-app-1.20/pom.xml +++ b/dinky-app/dinky-app-1.20/pom.xml @@ -58,6 +58,8 @@ org.dinky:* org/dinky/** + org/apache/flink/** + org/apache/calcite/** META-INF/** @@ -75,8 +77,11 @@ Class50/** lombok/** freemarker/** - com.sun/** META-INF/resources/** + META-INF/spring/** + META-INF/services/javax** + META-INF/services/lombok** + META-INF/services/org.apache.logging** diff --git a/dinky-app/dinky-app-base/src/main/java/org/dinky/app/flinksql/Submitter.java b/dinky-app/dinky-app-base/src/main/java/org/dinky/app/flinksql/Submitter.java index 79c22d7c78..b37ba9afc7 100644 --- a/dinky-app/dinky-app-base/src/main/java/org/dinky/app/flinksql/Submitter.java +++ b/dinky-app/dinky-app-base/src/main/java/org/dinky/app/flinksql/Submitter.java @@ -259,7 +259,7 @@ public static Optional executeJarJob(String type, Executor executor, ReadableConfig configuration = executor.getStreamExecutionEnvironment().getConfiguration(); List jars = configuration.get(PipelineOptions.JARS); - List jarsUrl = jars.stream().map(URLUtil::getURL).collect(Collectors.toList()); + List jarsUrl = jars.stream().map(URLUtil::url).collect(Collectors.toList()); Pipeline pipeline = executeJarOperation.getStreamGraph(executor.getCustomTableEnvironment(), jarsUrl); if (pipeline instanceof StreamGraph) { // stream job diff --git a/dinky-client/dinky-client-base/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java b/dinky-client/dinky-client-base/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java index 7a7dc3c6c2..9bb607f544 100644 --- a/dinky-client/dinky-client-base/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java +++ b/dinky-client/dinky-client-base/src/main/java/org/dinky/url/RsURLStreamHandlerFactory.java @@ -21,22 +21,24 @@ import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; -import java.util.Arrays; -import java.util.List; - -import cn.hutool.core.util.StrUtil; public class RsURLStreamHandlerFactory implements URLStreamHandlerFactory { private static final String PREFIX = "sun.net.www.protocol"; - private final List notContains = Arrays.asList("jar", "file", "http", "https"); @Override public URLStreamHandler createURLStreamHandler(String protocol) { - for (String tempProtocol : notContains) { - if (tempProtocol.equals(StrUtil.sub(protocol, 0, tempProtocol.length()))) { - return null; - } + String name = PREFIX + "." + protocol + ".Handler"; + try { + @SuppressWarnings("deprecation") + Object o = Class.forName(name).newInstance(); + return (URLStreamHandler) o; + } catch (ClassNotFoundException x) { + // ignore + } catch (Exception e) { + // For compatibility, all Exceptions are ignored. + // any number of exceptions can get thrown here } + if (ResourceFileSystem.URI_SCHEMA.getScheme().equals(protocol)) { return new RsURLStreamHandler(); } @@ -45,7 +47,6 @@ public URLStreamHandler createURLStreamHandler(String protocol) { } catch (Throwable e) { return null; } - String name = PREFIX + "." + protocol + ".Handler"; try { @SuppressWarnings("deprecation") Object o = Class.forName(name).newInstance(); diff --git a/dinky-metadata/dinky-metadata-paimon/pom.xml b/dinky-metadata/dinky-metadata-paimon/pom.xml index afa612b728..25596c82cf 100644 --- a/dinky-metadata/dinky-metadata-paimon/pom.xml +++ b/dinky-metadata/dinky-metadata-paimon/pom.xml @@ -39,7 +39,7 @@ org.apache.paimon paimon-bundle - 0.8.1 + 0.9.0 ${scope.runtime} From fed6f3c0704d9dfa2f17d95cda140535cb7b5290 Mon Sep 17 00:00:00 2001 From: zhangyuhang <2827528315@qq.com> Date: Sun, 1 Dec 2024 21:31:55 +0800 Subject: [PATCH 20/45] [Bug] [dinky-web] Issue with creating a new task with a subdirectory of the same name (#3993) Co-authored-by: yuhang2.zhang --- .../org/dinky/controller/CatalogueController.java | 3 +++ .../dinky/service/catalogue/CatalogueService.java | 7 +++++++ .../catalogue/impl/CatalogueServiceImpl.java | 13 +++++++++++++ .../src/main/java/org/dinky/data/enums/Status.java | 1 + 4 files changed, 24 insertions(+) diff --git a/dinky-admin/src/main/java/org/dinky/controller/CatalogueController.java b/dinky-admin/src/main/java/org/dinky/controller/CatalogueController.java index 2ed07d9aaf..c822e03cfd 100644 --- a/dinky-admin/src/main/java/org/dinky/controller/CatalogueController.java +++ b/dinky-admin/src/main/java/org/dinky/controller/CatalogueController.java @@ -128,6 +128,9 @@ public Result upload(MultipartFile file, @PathVariable Integer id) { dataType = "Catalogue", dataTypeClass = Catalogue.class) public Result saveOrUpdateCatalogue(@RequestBody Catalogue catalogue) { + if (catalogueService.checkNameIsExistByParentId(catalogue)) { + return Result.failed(Status.NAME_IS_EXIST); + } if (catalogueService.saveOrUpdateOrRename(catalogue)) { return Result.succeed(Status.SAVE_SUCCESS); } else { diff --git a/dinky-admin/src/main/java/org/dinky/service/catalogue/CatalogueService.java b/dinky-admin/src/main/java/org/dinky/service/catalogue/CatalogueService.java index 5a9fa7e5bb..57641eb35d 100644 --- a/dinky-admin/src/main/java/org/dinky/service/catalogue/CatalogueService.java +++ b/dinky-admin/src/main/java/org/dinky/service/catalogue/CatalogueService.java @@ -144,6 +144,13 @@ public interface CatalogueService extends ISuperService { */ Boolean saveOrUpdateOrRename(Catalogue catalogue); + /** + * Check if the catalogue name is exist + * @param catalogue catalogue + * @return true if the catalogue name is exist + */ + Boolean checkNameIsExistByParentId(Catalogue catalogue); + /** * Check if the catalogue task name is exist * @param name catalogue task name diff --git a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java index 392bf968c4..395fc74c71 100644 --- a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java @@ -582,6 +582,19 @@ public Boolean saveOrUpdateOrRename(Catalogue catalogue) { return saveOrUpdate(catalogue); } + /** + * Check if the catalogue name is exist + * @param catalogue catalogue + * @return true if the catalogue name is exist + */ + @Override + public Boolean checkNameIsExistByParentId(Catalogue catalogue) { + return getBaseMapper() + .exists(new LambdaQueryWrapper() + .eq(Catalogue::getName, catalogue.getName()) + .ne(catalogue.getParentId() != null, Catalogue::getParentId, catalogue.getParentId())); + } + private CatalogueTaskDTO getCatalogueTaskDTO(String name, Integer parentId) { CatalogueTaskDTO catalogueTaskDTO = new CatalogueTaskDTO(); catalogueTaskDTO.setName(UUID.randomUUID().toString().substring(0, 6) + name); diff --git a/dinky-common/src/main/java/org/dinky/data/enums/Status.java b/dinky-common/src/main/java/org/dinky/data/enums/Status.java index 24f516a9a9..efe2711db5 100644 --- a/dinky-common/src/main/java/org/dinky/data/enums/Status.java +++ b/dinky-common/src/main/java/org/dinky/data/enums/Status.java @@ -196,6 +196,7 @@ public enum Status { CATALOGUE_NOT_EXIST(12017, "catalogue.not.exist"), CATALOGUE_IS_EXIST(12018, "catalogue.is.exist"), TASK_NAME_NOT_MATCH_CATALOGUE_NAME(12019, "task.name.not.match.catalogue.name"), + NAME_IS_EXIST(12021, "A task and a directory cannot have the same name under the same parent directory."), /** * alert instance From 2b9c8b7af73418a68f8113f0b11e5c821b1d7f16 Mon Sep 17 00:00:00 2001 From: zhangyuhang <2827528315@qq.com> Date: Mon, 2 Dec 2024 09:23:11 +0800 Subject: [PATCH 21/45] [Optimization][dinky-getaway] Add Deployment status monitoring. (#3989) Co-authored-by: yuhang2.zhang --- .../kubernetes/utils/K8sClientHelper.java | 17 +++-- .../watcher/DeploymentStatusWatcher.java | 70 +++++++++++++++++++ 2 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/watcher/DeploymentStatusWatcher.java diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/utils/K8sClientHelper.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/utils/K8sClientHelper.java index 8e4eab48a0..58e1084101 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/utils/K8sClientHelper.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/utils/K8sClientHelper.java @@ -20,6 +20,7 @@ package org.dinky.gateway.kubernetes.utils; import org.dinky.gateway.kubernetes.decorate.DinkySqlConfigMapDecorate; +import org.dinky.gateway.kubernetes.watcher.DeploymentStatusWatcher; import org.dinky.utils.TextUtil; import org.apache.flink.configuration.Configuration; @@ -49,6 +50,7 @@ import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.RollableScalableResource; import io.fabric8.kubernetes.client.utils.Serialization; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -65,9 +67,11 @@ public class K8sClientHelper { private KubernetesClient kubernetesClient; protected Configuration configuration; private DinkySqlConfigMapDecorate sqlFileDecorate; + private DeploymentStatusWatcher deploymentStatusWatch; public K8sClientHelper(Configuration configuration, String kubeConfig) { this.configuration = configuration; + deploymentStatusWatch = new DeploymentStatusWatcher(); initKubeClient(kubeConfig); } @@ -113,12 +117,12 @@ private void initKubeClient(String kubeConfig) { */ public Deployment createDinkyResource() { log.info("createDinkyResource"); - Deployment deployment = kubernetesClient + RollableScalableResource deploymentRollableScalableResource = kubernetesClient .apps() .deployments() .inNamespace(configuration.get(KubernetesConfigOptions.NAMESPACE)) - .withName(configuration.get(KubernetesConfigOptions.CLUSTER_ID)) - .get(); + .withName(configuration.get(KubernetesConfigOptions.CLUSTER_ID)); + Deployment deployment = deploymentRollableScalableResource.get(); List resources = getSqlFileDecorate().buildResources(); // set owner reference OwnerReference deploymentOwnerReference = new OwnerReferenceBuilder() @@ -134,6 +138,7 @@ public Deployment createDinkyResource() { resource.getMetadata().setOwnerReferences(Collections.singletonList(deploymentOwnerReference))); // create resources resources.forEach(resource -> log.info(Serialization.asYaml(resource))); + deploymentRollableScalableResource.watch(deploymentStatusWatch); kubernetesClient.resourceList(resources).createOrReplace(); return deployment; } @@ -141,6 +146,7 @@ public Deployment createDinkyResource() { /** * initPodTemplate * Preprocess the pod template + * * @param sqlStatement * @return */ @@ -166,8 +172,7 @@ public Pod decoratePodTemplate(String sqlStatement, String podTemplate) { /** * dumpPod2Str - * - * */ + */ public String dumpPod2Str(Pod pod) { // use snakyaml to serialize the pod Representer representer = new IgnoreNullRepresenter(); @@ -179,9 +184,11 @@ public String dumpPod2Str(Pod pod) { Yaml yaml = new Yaml(representer, options); return yaml.dump(pod); } + /** * close * delete the temporary directory and close the client + * * @return */ public boolean close() { diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/watcher/DeploymentStatusWatcher.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/watcher/DeploymentStatusWatcher.java new file mode 100644 index 0000000000..521967f3a0 --- /dev/null +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/watcher/DeploymentStatusWatcher.java @@ -0,0 +1,70 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.dinky.gateway.kubernetes.watcher; + +import org.apache.hadoop.util.StringUtils; + +import java.util.List; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.fabric8.kubernetes.api.model.apps.DeploymentCondition; +import io.fabric8.kubernetes.client.Watcher; +import io.fabric8.kubernetes.client.WatcherException; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DeploymentStatusWatcher implements Watcher { + + @Override + public void eventReceived(Action action, Deployment deployment) { + String deploymentName = deployment.getMetadata().getName(); + log.info("deployment name: {}, deployment action: {}", deploymentName, action); + if (ObjectUtil.isNotNull(deployment.getStatus()) + && CollectionUtil.isNotEmpty(deployment.getStatus().getConditions())) { + List conditions = deployment.getStatus().getConditions(); + conditions.forEach(condition -> { + if (StringUtils.equalsIgnoreCase(condition.getStatus(), "true")) { + log.info( + "deployment name: {}, deployment status: {}, message: {}", + deploymentName, + condition.getStatus(), + condition.getMessage()); + } else { + log.warn( + "deployment name: {}, deployment status: {}, message: {}", + deploymentName, + condition.getStatus(), + condition.getMessage()); + } + }); + } + } + + @Override + public void onClose(WatcherException cause) { + if (cause != null) { + log.error("Watcher closed due to exception: {}", cause.getMessage()); + } else { + log.info("Watcher closed gracefully."); + } + } +} From c210fc5bba04ab504675c9600e78c9dd6f299529 Mon Sep 17 00:00:00 2001 From: zhangyuhang <2827528315@qq.com> Date: Mon, 2 Dec 2024 16:12:57 +0800 Subject: [PATCH 22/45] [Bug] [dinky-gateway] Restrictions on task names when running in Kubernetes mode. (#3994) Co-authored-by: yuhang2.zhang --- .../gateway/kubernetes/KubernetesGateway.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index 7357696947..00ac157999 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -46,7 +46,10 @@ import java.lang.reflect.Method; import java.util.Collections; import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import alluxio.shaded.client.org.apache.commons.lang3.StringUtils; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrFormatter; @@ -84,10 +87,10 @@ public void init() { protected void initConfig() { flinkConfigPath = config.getClusterConfig().getFlinkConfigPath(); flinkConfig = config.getFlinkConfig(); - String jobName = flinkConfig.getJobName(); - if (null != jobName && jobName.contains("_")) { - jobName = jobName.replace("_", "-"); - flinkConfig.setJobName(jobName); + if (!isValidTaskName(flinkConfig.getJobName())) { + throw new GatewayException( + "In Kubernetes mode, task names must start and end with a lowercase letter or a digit, " + + "and can contain lowercase letters, digits, dots, and hyphens in between."); } k8sConfig = config.getKubernetesConfig(); @@ -135,6 +138,21 @@ protected void initConfig() { } } + /** + * Check if the jobName is valid + * @param jobName jobName + * @return true if the jobName is valid + */ + boolean isValidTaskName(String jobName) { + String JOB_NAME_PATTERN = "^[a-z0-9][a-z0-9.-]*[a-z0-9]$"; + Pattern pattern = Pattern.compile(JOB_NAME_PATTERN); + if (StringUtils.isBlank(jobName)) { + return false; + } + Matcher matcher = pattern.matcher(jobName); + return matcher.matches(); + } + protected void preparPodTemplate(String podTemplate, ConfigOption option) { if (!TextUtil.isEmpty(podTemplate)) { String filePath = String.format("%s/%s.yaml", tmpConfDir, option.key()); @@ -155,7 +173,7 @@ public SavePointResult savepointCluster(String savePoint) { String clusterId = clusterClientFactory.getClusterId(configuration); if (Asserts.isNull(clusterId)) { throw new GatewayException( - "No cluster id was specified. Please specify a cluster to which you would like" + " to connect."); + "No cluster id was specified. Please specify a cluster to which you would like to connect."); } KubernetesClusterDescriptor clusterDescriptor = clusterClientFactory.createClusterDescriptor(configuration); @@ -167,7 +185,7 @@ public SavePointResult savepointJob(String savePoint) { initConfig(); if (Asserts.isNull(config.getFlinkConfig().getJobId())) { throw new GatewayException( - "No job id was specified. Please specify a job to which you would like to" + " savepont."); + "No job id was specified. Please specify a job to which you would like to savepont."); } addConfigParas( @@ -176,7 +194,7 @@ public SavePointResult savepointJob(String savePoint) { String clusterId = clusterClientFactory.getClusterId(configuration); if (Asserts.isNull(clusterId)) { throw new GatewayException( - "No cluster id was specified. Please specify a cluster to which you would like" + " to connect."); + "No cluster id was specified. Please specify a cluster to which you would like to connect."); } KubernetesClusterDescriptor clusterDescriptor = clusterClientFactory.createClusterDescriptor(configuration); @@ -218,7 +236,7 @@ public void killCluster() { String clusterId = clusterClientFactory.getClusterId(configuration); if (Asserts.isNull(clusterId)) { throw new GatewayException( - "No cluster id was specified. Please specify a cluster to which you would like" + " to connect."); + "No cluster id was specified. Please specify a cluster to which you would like to connect."); } if (k8sClientHelper.getClusterIsPresent(clusterId)) { try (KubernetesClusterDescriptor clusterDescriptor = From 5995aef8a88d743a920cf749f26324fd265e78bd Mon Sep 17 00:00:00 2001 From: gaoyan Date: Tue, 3 Dec 2024 14:48:47 +0800 Subject: [PATCH 23/45] [Bug] Fix k8s test bug (#3997) Co-authored-by: gaoyan1998 --- .../dinky/gateway/kubernetes/KubernetesGateway.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java index 00ac157999..2821583367 100644 --- a/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java +++ b/dinky-gateway/src/main/java/org/dinky/gateway/kubernetes/KubernetesGateway.java @@ -87,10 +87,14 @@ public void init() { protected void initConfig() { flinkConfigPath = config.getClusterConfig().getFlinkConfigPath(); flinkConfig = config.getFlinkConfig(); - if (!isValidTaskName(flinkConfig.getJobName())) { - throw new GatewayException( - "In Kubernetes mode, task names must start and end with a lowercase letter or a digit, " - + "and can contain lowercase letters, digits, dots, and hyphens in between."); + String jobName = flinkConfig.getJobName(); + if (TextUtil.isEmpty(jobName)) { + jobName = this.configuration.getString(KubernetesConfigOptions.CLUSTER_ID.key(), null); + } + if (!isValidTaskName(jobName)) { + throw new GatewayException(jobName + + " is not Valid. In Kubernetes mode, task names must start and end with a lowercase letter or a digit, " + + "and can contain lowercase letters, digits, dots, and hyphens in between."); } k8sConfig = config.getKubernetesConfig(); From fcd472dc0ddf9a4c769df6444d3e429ff8d9df1d Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Tue, 3 Dec 2024 17:58:31 +0800 Subject: [PATCH 24/45] [BugFix][Web]Fix data development and introduce LESS to cause the global CSS style confusion (#4001) Co-authored-by: zackyoungh --- .../CenterTabContent/SqlTask/index.tsx | 2 +- .../DataStudio/CenterTabContent/index.less | 4 --- .../Toolbar/FlinkSqlClient/index.less | 12 ------- .../Toolbar/FlinkSqlClient/index.tsx | 2 +- .../Toolbar/Service/Result/index.tsx | 4 +-- .../DataStudio/Toolbar/Service/index.less | 12 ------- .../DataStudio/Toolbar/Service/index.tsx | 3 +- .../pages/DataStudio/Toolbar/Tool/index.less | 7 ---- .../pages/DataStudio/Toolbar/Tool/index.tsx | 3 +- dinky-web/src/pages/DataStudio/css/index.less | 36 ++++++++++++++----- 10 files changed, 33 insertions(+), 52 deletions(-) delete mode 100644 dinky-web/src/pages/DataStudio/Toolbar/FlinkSqlClient/index.less delete mode 100644 dinky-web/src/pages/DataStudio/Toolbar/Service/index.less delete mode 100644 dinky-web/src/pages/DataStudio/Toolbar/Tool/index.less diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index 0004a37ca4..231e149c20 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -633,7 +633,7 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { onValuesChange={debounce(onValuesChange, 500)} syncToInitialValues > - + { }; return ( { @@ -330,7 +330,7 @@ export default (props: { items={tabItems()} tabBarStyle={{ marginBottom: '5px' }} /> - {dataList.length == 0 ?? } + {dataList.length == 0 ? : <>} + { const items = [ @@ -36,7 +35,7 @@ export default () => { } ]; return ( -
+
); diff --git a/dinky-web/src/pages/DataStudio/css/index.less b/dinky-web/src/pages/DataStudio/css/index.less index b34139db81..8dfe7aa966 100644 --- a/dinky-web/src/pages/DataStudio/css/index.less +++ b/dinky-web/src/pages/DataStudio/css/index.less @@ -46,18 +46,33 @@ .datastudio-theme { background-color: var(--main-background-color); -} -.datastudio-theme .ant-pro-card { - background-color: var(--main-background-color); -} + .ant-pro-card { + background-color: var(--main-background-color); + } -.datastudio-theme .ant-pro-form-group-container { - justify-content: center; -} + .ant-pro-form-group-container { + justify-content: center; + } -.ant-pro-list-row-subTitle { - color: var(--text-color); + .ant-pro-list-row-subTitle { + color: var(--text-color); + } + .ant-form-item { + margin-bottom: 0; + } + .ant-tabs-content { + height: 100%; + overflow-y: auto; + } + .ant-tabs-tabpane { + height: 100%; + } + + .ant-tree { + height: 100%; + overflow-y: auto; + } } // scrollbar style --- start ---- @@ -167,6 +182,7 @@ body > .dragging-layer > div:last-child { .dock-tab-btn .drag-initiator { display: flex; } + .drag-initiator { user-select: none; -webkit-user-select: none; @@ -344,9 +360,11 @@ body > .dragging-layer > div:last-child { background-image: var(--close-btn-img); background-position: center; } + .dock-tab-close-btn:before { content: ''; } + .dock-tab-close-btn:hover { background-size: 14px; border: 1px solid #0b7ec4; From 6bb67c13d0fbf7f6c4c62698b32fa714fe753aaf Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Tue, 3 Dec 2024 19:05:26 +0800 Subject: [PATCH 25/45] [Feature] Provide init tools (#3999) Co-authored-by: Zzm0809 Co-authored-by: GH Action - Upstream Sync --- deploy/docker/Dockerfile | 2 +- dinky-admin/src/main/assembly/package.xml | 2 +- dinky-assembly/src/main/assembly/package.xml | 4 +- script/bin/auto.sh | 4 +- script/bin/init_check_network.sh | 17 ++ script/bin/init_db.sh | 65 +++++ script/bin/init_flink_dependences.sh | 104 ++++++++ script/bin/init_hadoop_dependences.sh | 35 +++ script/bin/init_tools_main.sh | 238 +++++++++++++++++++ 9 files changed, 465 insertions(+), 6 deletions(-) create mode 100644 script/bin/init_check_network.sh create mode 100644 script/bin/init_db.sh create mode 100644 script/bin/init_flink_dependences.sh create mode 100644 script/bin/init_hadoop_dependences.sh create mode 100644 script/bin/init_tools_main.sh diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index 68502ff200..afa40b4379 100755 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -52,4 +52,4 @@ RUN mkdir /opt/dinky/customJar && chmod -R 777 /opt/dinky/ && sed -i 's/-Xms512M EXPOSE 8888 -CMD ./auto.sh startOnPending \ No newline at end of file +CMD ./bin/auto.sh startOnPending \ No newline at end of file diff --git a/dinky-admin/src/main/assembly/package.xml b/dinky-admin/src/main/assembly/package.xml index 8285c49490..423bb9fce1 100644 --- a/dinky-admin/src/main/assembly/package.xml +++ b/dinky-admin/src/main/assembly/package.xml @@ -16,7 +16,7 @@ ${basedir}/src/main/bin unix - + bin 755 *.sh diff --git a/dinky-assembly/src/main/assembly/package.xml b/dinky-assembly/src/main/assembly/package.xml index 7cb907dc29..e3294655f4 100644 --- a/dinky-assembly/src/main/assembly/package.xml +++ b/dinky-assembly/src/main/assembly/package.xml @@ -26,11 +26,11 @@ ${project.parent.basedir}/script/bin - ./ + ./bin unix 0755 - auto.sh + *.sh diff --git a/script/bin/auto.sh b/script/bin/auto.sh index 55e65745fe..339b5374c8 100644 --- a/script/bin/auto.sh +++ b/script/bin/auto.sh @@ -5,7 +5,7 @@ FLINK_VERSION=${2} -DINKY_HOME=${DINKY_HOME:-$(cd `dirname $0`; pwd)} +DINKY_HOME=${DINKY_HOME:-$(cd "$(dirname "$0")"; cd ..; pwd)} JAVA_VERSION=$(java -version 2>&1 | sed '1!d' | sed -e 's/"//g' | awk '{print $3}' | awk -F'.' '{print $1"."$2}') APP_HOME="${DINKY_HOME}" @@ -34,7 +34,7 @@ if [ -z "${FLINK_VERSION}" ]; then fi fi -echo "DINKY_HOME : ${DINKY_HOME} , JAVA_VERSION : ${JAVA_VERSION} , FLINK_VERSION : ${FLINK_VERSION}" +echo "DINKY_HOME : ${APP_HOME} , JAVA_VERSION : ${JAVA_VERSION} , FLINK_VERSION : ${FLINK_VERSION}" # Check whether the flink version is specified assertIsInputVersion() { diff --git a/script/bin/init_check_network.sh b/script/bin/init_check_network.sh new file mode 100644 index 0000000000..92335059a9 --- /dev/null +++ b/script/bin/init_check_network.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +EXTERNAL_CONNECTIVITY_CHECK_URL="www.baidu.com" + +echo -e "${YELLOW}Checking whether your network can connect to the Internet properly (${EXTERNAL_CONNECTIVITY_CHECK_URL}) ...${RESET}" +if ! ping -c 1 ${EXTERNAL_CONNECTIVITY_CHECK_URL} &> /dev/null; then + echo -e "${RED}Your network cannot connect to the Internet using ping mode, please check whether your network environment is normal, and the program will try to use curl mode to detect the network connection again...${RESET}" + if ! curl -I -s --connect-timeout 5 ${EXTERNAL_CONNECTIVITY_CHECK_URL} -w '%{http_code}' | tail -n1 | grep "200" &> /dev/null; then + echo -e "${RED}Your network cannot be connected to the Internet using curl mode, please check whether your network environment is normal。${RESET}" + echo -e "${YELLOW}Note that in some network environments, firewalls or security policies may block ICMP requests (i.e., pings). If this happens, you can use curl to detect the network connection.${RESET}" + exit 1 + else + echo -e "${GREEN}Your network can use curl to connect to the Internet and proceed to the next step...${RESET}" + fi +else + echo -e "${GREEN}Your network can use ping to connect to the Internet and proceed to the next step...${RESET}" +fi \ No newline at end of file diff --git a/script/bin/init_db.sh b/script/bin/init_db.sh new file mode 100644 index 0000000000..6c706dd4fc --- /dev/null +++ b/script/bin/init_db.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +DINKY_HOME=$1 + +echo -e "${GREEN}====================== The database configuration file is initialized ======================${RESET}" + +if [ -z "$DINKY_HOME" ]; then + echo -e "${RED}The parameter is wrong, please check!${RESET}" + exit 1 +fi + +while true; do + read -p "Please select a database type (1.MySQL 2.PostgresSQL):" db_type + read -p "Please enter the database address (hostname or IP, default localhost): " -i "localhost" db_host + read -p "Please enter the database port (default 3306): " -i 3306 db_port + read -p "Please enter a database name (default dinky): " -i "dinky" db_name + read -p "Please enter the database username (default dinky):" -i "dinky" db_username + read -s -p "Please enter the database password (default dinky):" -i "dinky" db_password + echo + + db_type=$(echo "$db_type" | tr -d '[:space:]') + db_host=$(echo "$db_host" | tr -d '[:space:]') + db_port=$(echo "$db_port" | tr -d '[:space:]') + db_name=$(echo "$db_name" | tr -d '[:space:]') + db_username=$(echo "$db_username" | tr -d '[:space:]') + db_password=$(echo "$db_password" | tr -d '[:space:]') + + case $db_type in + 1) + echo -e "${YELLOW}Configuring MySQL database related information...${RESET}" + config_file="${DINKY_HOME}/config/application-mysql.yml" + echo -e "${GREEN} The automatic initialization script uses the export environment variable method to support the loading of environment variables of the data source. The configuration file is:${config_file} ${RESET}" + echo "export DB_ACTIVE=mysql" >> /etc/profile + echo "export MYSQL_ADDR=${db_host}:${db_port}" >> /etc/profile + echo "export MYSQL_DATABASE=${db_name}" >> /etc/profile + echo "export MYSQL_USERNAME=${db_username}" >> /etc/profile + echo "export MYSQL_PASSWORD=${db_password}" >> /etc/profile + source /etc/profile + + echo -e "${GREEN}MySQLThe configuration of database related information is completed. Please confirm whether the following configuration is correct:${RESET}" + grep -E '^(export DB_ACTIVE|export MYSQL_ADDR|export MYSQL_DATABASE|export MYSQL_USERNAME|export MYSQL_PASSWORD)' /etc/profile | grep -v "^#" | grep -v "^$" + break + ;; + 2) + echo -e "${YELLOW}Configuring PostgresSQL database related information...${RESET}" + config_file="${DINKY_HOME}/config/application-pgsql.yml" + + echo -e "${GREEN}The automatic initialization script uses the export environment variable method to support the loading of environment variables from the data source configuration file. The configuration file is:${config_file} ${RESET}" + + echo "export DB_ACTIVE=pgsql" >> /etc/profile + echo "export POSTGRES_ADDR=${db_host}:${db_port}" >> /etc/profile + echo "export POSTGRES_DB=${db_name}" >> /etc/profile + echo "export POSTGRES_USER=${db_username}" >> /etc/profile + echo "export POSTGRES_PASSWORD=${db_password}" >> /etc/profile + source /etc/profile + + echo -e "${GREEN}PostgresSQL The configuration of database related information is completed. Please confirm whether the following configuration is correct:${RESET}" + grep -E '^(export DB_ACTIVE|export POSTGRES_ADDR|export POSTGRES_DB|export POSTGRES_USER|export POSTGRES_PASSWORD)' /etc/profile | grep -v "^#" | grep -v "^$" + break + ;; + *) + echo -e "${RED}The entered database type is incorrect, please select the correct database type again.${RESET}" + ;; + esac +done \ No newline at end of file diff --git a/script/bin/init_flink_dependences.sh b/script/bin/init_flink_dependences.sh new file mode 100644 index 0000000000..4b7092e93f --- /dev/null +++ b/script/bin/init_flink_dependences.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +CURRENT_FLINK_FULL_VERSION=$1 +FLINK_VERSION_SCAN=$2 +DINKY_TMP_DIR=$3 +EXTENDS_HOME=$4 +DINKY_HOME=$5 + +echo -e "${GREEN}====================== Flink dependency initialization ======================${RESET}" + +echo -e "${BLUE}Parameters: The current Flink version is:${CURRENT_FLINK_FULL_VERSION},The scanned Flink version is:${FLINK_VERSION_SCAN} ,The temporary directory is:${DINKY_TMP_DIR} ,The expansion package directory is:${EXTENDS_HOME} ,Dinky The root directory is:${DINKY_HOME}${RESET}" + +if [ -z "$CURRENT_FLINK_FULL_VERSION" ] || [ -z "$FLINK_VERSION_SCAN" ] || [ -z "$DINKY_TMP_DIR" ] || [ -z "$EXTENDS_HOME" ] || [ -z "$DINKY_HOME" ]; then + echo -e "${RED}Parameter error, please check!${RESET}" + exit 1 +fi + +if [ -f "$DINKY_TMP_DIR/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz" ]; then + echo -e "${YELLOW}$DINKY_TMP_DIR ALREADY EXISTS flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz file,To ensure completeness, delete first ${DINKY_TMP_DIR}/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz Download the file again${RESET}" + rm -rf ${DINKY_TMP_DIR}/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz + if [ -d "$DINKY_TMP_DIR/flink-${CURRENT_FLINK_FULL_VERSION}" ]; then + echo -e "${YELLOW}The flink directory already exists, delete it $DINKY_TMP_DIR/flink-${CURRENT_FLINK_FULL_VERSION}" + rm -rf $DINKY_TMP_DIR/flink-${CURRENT_FLINK_FULL_VERSION} + fi +fi + +try_tsinghua_mirror() { + local tsinghua_url="https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-${CURRENT_FLINK_FULL_VERSION}/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz" + local apache_url="https://archive.apache.org/dist/flink/flink-${CURRENT_FLINK_FULL_VERSION}/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz" + + echo -e "${GREEN}Start downloading the Flink-${FLINK_VERSION_SCAN} installation package... Store it in the ${DINKY_TMP_DIR} directory${RESET}" + if download_file "$tsinghua_url" "$DINKY_TMP_DIR"; then + echo -e "${BLUE}The address of the currently downloaded Flink installation package is:${tsinghua_url}${RESET}" + return 0 + else + echo -e "${YELLOW}File not found in Tsinghua University mirror, try downloading from Apache official source...${RESET}" + if download_file "$apache_url" "$DINKY_TMP_DIR"; then + echo -e "${BLUE}The address of the currently downloaded Flink installation package is:${apache_url}${RESET}" + return 0 + else + echo -e "${RED}Downloading from Apache official source also failed, please check the network or download manually。${RESET}" + return 1 + fi + fi +} + +if ! try_tsinghua_mirror; then + exit 0 +fi + + +echo -e "${GREEN}Flink installation package download completed。${RESET}" +echo -e "\n${GREEN}===============================================================${RESET}\n" +echo -e "${GREEN}Start decompressing the Flink installation package...${RESET}" +tar -zxvf ${DINKY_TMP_DIR}/flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz -C ${DINKY_TMP_DIR}/ +if [ $? -eq 0 ]; then + echo -e "${GREEN}Flink installation package decompression completed。${RESET}" +else + echo -e "${RED}Flink installation package failed to decompress, please check。${RESET}" + exit 1 +fi + +echo -e "\n${GREEN}===============================================================${RESET}\n" + +flink_dir_tmp=$(ls -n ${DINKY_TMP_DIR} | grep '^d' | grep flink | awk '{print $9}') +full_flink_dir_tmp="${DINKY_TMP_DIR}/${flink_dir_tmp}" +echo -e "${BLUE}Unzipped directory name:${full_flink_dir_tmp}${RESET}" + + + +echo -e "${GREEN}Process ${full_flink_dir_tmp}/lib/flink-table-planner-loader* file...${RESET}" +rm -rf ${full_flink_dir_tmp}/lib/flink-table-planner-loader* +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN}Process ${full_flink_dir_tmp}/opt/flink-table-planner_2.12-*.jar file...${RESET}" +mv ${full_flink_dir_tmp}/opt/flink-table-planner_2.12-*.jar ${full_flink_dir_tmp}/lib/ +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN}Process flink jar dependencies into dinky...${RESET}" +cp -r ${full_flink_dir_tmp}/lib/*.jar ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ +echo -e "${GREEN}jar dependency processing completed。${RESET}" + +echo -e "${GREEN}Process flink-sql-client ...${RESET}" +cp -r ${full_flink_dir_tmp}/opt/flink-sql-client-*.jar ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN}Process flink-cep-scala ...${RESET}" +cp -r ${full_flink_dir_tmp}/opt/flink-cep-scala*.jar ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN}Process flink-queryable-state-runtime ...${RESET}" +cp -r ${full_flink_dir_tmp}/opt/flink-queryable-state-runtime*.jar ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN}Process flink-state-processor-api ...${RESET}" +cp -r ${full_flink_dir_tmp}/opt/flink-state-processor-api*.jar ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ +echo -e "${GREEN}Processing completed。${RESET}" + +echo -e "${GREEN} ================= List files in the ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ directory ==============${RESET}" +ls -l ${EXTENDS_HOME}/flink${FLINK_VERSION_SCAN}/ + +echo -e "${YELLOW}Please check the above dependent files。${RESET}" + +echo -e "${GREEN}The basic dependency processing is completed, please perform subsequent operations according to the actual situation.${RESET}" \ No newline at end of file diff --git a/script/bin/init_hadoop_dependences.sh b/script/bin/init_hadoop_dependences.sh new file mode 100644 index 0000000000..e61526413c --- /dev/null +++ b/script/bin/init_hadoop_dependences.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +EXTENDS_HOME=$1 + + +echo -e "${GREEN}====================== Hadoop dependency initialization ======================${RESET}" + +read -p "Please select the Hadoop-uber version to download (enter 2 or 3):" hadoop_uber_version +hadoop_uber_version=$(echo "$hadoop_uber_version" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + +case $hadoop_uber_version in + 2) + echo -e "${YELLOW}Start downloading Hadoop-uber 2 version package...${RESET}" + if [ -f "$EXTENDS_HOME/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar" ]; then + echo -e "${YELLOW}The flink-shaded-hadoop-2-uber-2.8.3-10.0.jar file already exists and there is no need to download it again.${RESET}" + else + download_url="https://repo1.maven.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar" + download_file "$download_url" "$EXTENDS_HOME" + fi + ;; + 3) + if [ -f "$EXTENDS_HOME/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar" ]; then + echo -e "${YELLOW}The flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar file already exists and there is no need to download it again.${RESET}" + else + echo -e "${YELLOW}Start downloading Hadoop-uber 3 version package...${RESET}" + download_url="https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/flink/flink-shaded-hadoop-3-uber/3.1.1.7.2.9.0-173-9.0/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar" + download_file "$download_url" "$EXTENDS_HOME" + fi + ;; + *) + echo -e "${RED}The entered version number is incorrect, please re-run the script to select the correct version.${RESET}" + ;; +esac + +echo -e "${GREEN}After the download is completed, subsequent installation and configuration operations can be performed as needed.${RESET}" \ No newline at end of file diff --git a/script/bin/init_tools_main.sh b/script/bin/init_tools_main.sh new file mode 100644 index 0000000000..dea59e73ac --- /dev/null +++ b/script/bin/init_tools_main.sh @@ -0,0 +1,238 @@ +#!/bin/bash + +export RED='\033[31m' +export GREEN='\033[32m' +export YELLOW='\033[33m' +export BLUE='\033[34m' +export MAGENTA='\033[35m' +export CYAN='\033[36m' +export RESET='\033[0m' + +echo -e "${GREEN}=====================================================================${RESET}" +echo -e "${GREEN}=====================================================================${RESET}" +echo -e "${GREEN}============ Welcome to the Dinky initialization script =============${RESET}" +echo -e "${GREEN}======================================================================${RESET}" +echo -e "${GREEN}======================================================================${RESET}" + +APP_HOME=${DINKY_HOME:-$(cd "$(dirname "$0")"; cd ..; pwd)} +export DINKY_HOME=${APP_HOME} + +sudo chmod +x "${APP_HOME}"/bin/init_*.sh + + + +EXTENDS_HOME="${APP_HOME}/extends" +if [ ! -d "${EXTENDS_HOME}" ]; then + echo -e "${RED} ${EXTENDS_HOME} Directory does not exist, please check${RESET}" + exit 1 +fi + +FLINK_VERSION_SCAN=$(ls -n "${EXTENDS_HOME}" | grep '^d' | grep flink | awk -F 'flink' '{print $2}') +if [ -z "${FLINK_VERSION_SCAN}" ]; then + echo -e "${RED}There is no Flink related version in ${EXTENDS_HOME} in the directory where Dinky is deployed. The initialization operation cannot be performed. Please check. ${RESET}" + exit 1 +fi + +DINKY_TMP_DIR="${APP_HOME}/tmp" +if [ ! -d "${DINKY_TMP_DIR}" ]; then + echo -e "${YELLOW}Create temporary directory ${DINKY_TMP_DIR}...${RESET}" + mkdir -p "${DINKY_TMP_DIR}" + echo -e "${GREEN}The temporary directory is created${RESET}" +fi + +# LIB +DINKY_LIB="${APP_HOME}/lib" +if [ ! -d "${DINKY_LIB}" ]; then + echo -e "${RED}${DINKY_LIB} Directory does not exist, please check. ${RESET}" + exit 1 +fi + +# 函数:检查命令是否存在,不存在则尝试安装 +check_command() { + local cmd="$1" + echo -e "${BLUE}Check if command: $cmd exists...${RESET}" + if ! command -v "$cmd" &> /dev/null; then + if [ "$cmd" == "yum" ]; then + echo -e "${YELLOW} Try using yum to install the missing command...${RESET}" + sudo yum install -y "$cmd" + elif [ "$cmd" == "apt-get" ]; then + echo -e "${YELLOW}Try using apt-get to install the missing command...${RESET}" + sudo apt-get install -y "$cmd" + else + echo -e "${RED} $cmd The command was not found. Please install it manually and then run this script.。${RESET}" + exit 1 + fi + fi + echo -e "${GREEN}========== Command $cmd check completed. OK, continue executing the script. ==========${RESET}" +} + +sh "${APP_HOME}/bin/init_check_network.sh" + +check_command "wget" + +echo -e "${GREEN}The pre-check is completed. Welcome to use the Dinky initialization script. The current Dinky root path is:${APP_HOME} ${RESET}" + +function download_file() { + source_url=$1 + target_file_dir=$2 + echo -e "${GREEN}Start downloading $source_url to $target_file_dir...${RESET}" + wget -P "${target_file_dir}" "${source_url}" + echo -e "${GREEN}Download completed. The downloaded file storage address is: $target_file_dir ${RESET}" +} + +export -f download_file + +echo +echo +echo -e "${GREEN} ====================== Data source driver initialization script -> Start ====================== ${RESET}" + +while true; do + echo -e "${BLUE} ========================= Please enter your database type ================================ ${RESET}" + echo -e "${BLUE} ======== (h2 comes with it by default and does not need to perform this step)=========== ${RESET}" + echo -e "${BLUE} ============================== Please select 1, 2, 3 ====================================== ${RESET}" + echo -e "${BLUE} ==================================== 1. mysql ============================================= ${RESET}" + echo -e "${BLUE} ==================================== 2. pgsql ========================================= ${RESET}" + echo -e "${BLUE} ================================ 3. Skip this step ========================================== ${RESET}" + echo -e "${BLUE} ================================ Enter number selection ================================== ${RESET}" + read -p "Please enter your database type:" db_type + case $db_type in + 1) + echo -e "${GREEN}Start downloading the mysql driver package...${RESET}" + if [ -f "${DINKY_LIB}/mysql-connector-j-8.4.0.jar" ]; then + echo -e "${GREEN}mysql The driver package already exists, no need to download it again. Skip this step。${RESET}" + else + download_file https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.4.0/mysql-connector-j-8.4.0.jar "${DINKY_LIB}" + echo -e "${GREEN}Download is complete, please verify. The downloaded file storage address is: ${DINKY_LIB}/mysql-connector-j-8.4.0.jar${RESET}" + if [ -f "${DINKY_LIB}/mysql-connector-j-8.4.0.jar" ]; then + echo -e "${GREEN}mysql driver package downloaded successfully。${RESET}" + else + echo -e "${RED}Mysql driver package download failed, please check the network or download manually。${RESET}" + exit 1 + fi + echo -e "${GREEN}After the verification is completed, subsequent installation and configuration operations can be performed as needed.。${RESET}" + fi + break + ;; + 2) + echo -e "${GREEN}It seems that pgsql has been integrated by default, so there is no need to perform this step. Please perform subsequent installation and configuration operations as needed.${RESET}" + break + ;; + 3) + echo -e "${GREEN}Skip this step。${RESET}" + break + ;; + *) + echo -e "${RED}The entered database type is incorrect, please rerun the script to select the correct database type.${RESET}" + ;; + esac +done +echo -e "${GREEN} ====================== Data source driver initialization script -> end====================== ${RESET}" + +echo +echo + +echo -e "${GREEN} ====================== Flink depends on initialization script -> start ====================== ${RESET}" + +declare -A version_map +version_map["1.14"]="1.14.6" +version_map["1.15"]="1.15.4" +version_map["1.16"]="1.16.3" +version_map["1.17"]="1.17.2" +version_map["1.18"]="1.18.1" +version_map["1.19"]="1.19.1" +version_map["1.20"]="1.20.0" + +FLINK_VERSION_SCAN=$(ls -n "${EXTENDS_HOME}" | grep '^d' | grep flink | awk -F 'flink' '{print $2}') +if [ -z "${FLINK_VERSION_SCAN}" ]; then + echo -e "${RED}There is no Flink related version in ${EXTENDS_HOME} in the directory where Dinky is deployed. The initialization operation cannot be performed. Please check.${RESET}" + exit 1 +else + echo -e "${GREEN}The current Flink version number deployed by Dinky:${FLINK_VERSION_SCAN}${RESET}" +fi + +# 根据 Dinky 部署的Flink对应的版本号,获取对应的 Flink 版本 +CURRENT_FLINK_FULL_VERSION=${version_map[$FLINK_VERSION_SCAN]} + +echo -e "${GREEN}Obtain the version number corresponding to the deployed Flink (full version number) based on the scanned current Flink version number: flink-${CURRENT_FLINK_FULL_VERSION}${RESET}" + +# 步骤2:获取Dinky部署的Flink对应的版本号,然后下载Flink安装包 +while true; do + read -p "It is detected that the Flink version number deployed by Dinky is: ${FLINK_VERSION_SCAN}, and the Flink installation package version number that needs to be downloaded is: flink-${CURRENT_FLINK_FULL_VERSION}-bin-scala_2.12.tgz. Please choose whether to initialize Flink related dependencies?(yes/no/exit)" is_init_flink + is_init_flink=$(echo "$is_init_flink" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + + case $is_init_flink in + yes | y ) + sh "${APP_HOME}"/bin/init_flink_dependences.sh "${CURRENT_FLINK_FULL_VERSION}" "${FLINK_VERSION_SCAN}" "${DINKY_TMP_DIR}" "${EXTENDS_HOME}" "${APP_HOME}" + break + ;; + no | n ) + echo -e "${GREEN}The Flink installation package download operation has been skipped. Please download manually${RESET}" + break + ;; + exit | e ) + echo -e "${GREEN}If you choose exit, the program will exit。${RESET}" + exit 0 + ;; + *) + echo -e "${RED}Invalid input, please re-enter yes/no/exit。${RESET}" + ;; + esac +done +echo -e "${GREEN} ====================== Flink depends on initialization script -> end ====================== ${RESET}" + +echo +echo + +echo -e "${GREEN} ====================== Hadoop dependency initialization script -> Start ====================== ${RESET}" + +while true; do + read -p "Is your deployment environment a Hadoop environment??(yes/no/exit)" is_hadoop + is_hadoop=$(echo "$is_hadoop" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + case $is_hadoop in + yes | y ) + sh "${APP_HOME}/bin/init_hadoop_dependences.sh" "${EXTENDS_HOME}" + break + ;; + no | n ) + echo -e "${GREEN}Hadoop related operations skipped ${RESET}" + break + ;; + exit | e ) + echo -e "${GREEN}If you choose exit, the program will exit${RESET}" + exit 0 + ;; + *) + echo -e "${RED}Invalid input, please re-enter yes/no/exit。${RESET}" + ;; + esac +done +echo -e "${GREEN} ======================Hadoop dependency initialization script -> end ====================== ${RESET}" +echo + +echo -e "${GREEN} === After the environment initialization is completed, you can configure the application configuration file in Dinky's config directory to perform database-related configuration, or execute the initialization configuration file.。==== ${RESET}" +echo + +echo -e "${GREEN} ====================== Database configuration file initialization script -> Start ====================== ${RESET}" + +while true; do + read -p "Do you need to initialize the database configuration file??(yes/no):" is_init_db + is_init_db=$(echo "$is_init_db" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]') + case $is_init_db in + yes | y ) + sh "${APP_HOME}/bin/init_db.sh" "${DINKY_HOME}" + break + ;; + no | n ) + echo -e "${GREEN}The database initialization operation has been skipped, please manually configure the database ${DINKY_HOME}/config/application.yml file and ${DINKY_HOME}/config/application-[mysql/pgsql].yml file。${RESET}" + break + ;; + exit | e ) + echo -e "${GREEN}The script has exited, please manually configure the database ${DINKY_HOME}/config/application.yml file and ${DINKY_HOME}/config/application-[mysql/pgsql].yml file。${RESET}" + exit 0 + ;; + *) + echo -e "${RED}Invalid input, please re-enter yes/no/exit。${RESET}" + ;; + esac +done +echo -e "${GREEN} ====================== Database configuration file initialization script -> End ====================== ${RESET}" \ No newline at end of file From 7c0e38e0549c82bf2d3c94fcd571f7535a267615 Mon Sep 17 00:00:00 2001 From: ZackYoung Date: Wed, 4 Dec 2024 11:04:23 +0800 Subject: [PATCH 26/45] [BugFix][Web]Fix data development, Flink jar task toolbar display (#4002) --- .../src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx index 231e149c20..687f4a37f1 100644 --- a/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx +++ b/dinky-web/src/pages/DataStudio/CenterTabContent/SqlTask/index.tsx @@ -191,10 +191,10 @@ export const SqlTask = memo((props: FlinkSqlProps & any) => { if (taskDetail.dialect.toLowerCase() === DIALECT.FLINKJAR) { const sqlConvertForm = await flinkJarSqlConvertForm(taskDetail.statement); setSqlForm({ enable: true, ...sqlConvertForm }); - setCurrentState((prevState) => ({ - ...prevState, + setCurrentState({ + ...newParams, statement: sqlConvertForm?.initSqlStatement ?? '' - })); + }); setOriginStatementValue(sqlConvertForm?.initSqlStatement ?? ''); if (params?.statement && params?.statement !== sqlConvertForm?.initSqlStatement) { setDiff([ From 9254e4c5e1edaa7712057f0ecdfed9df5ddbafae Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Wed, 4 Dec 2024 16:46:59 +0800 Subject: [PATCH 27/45] [Feature] support pgsql catalog (#4000) Co-authored-by: Zzm0809 Co-authored-by: GH Action - Upstream Sync --- .github/workflows/code-review.yml | 44 - .../java/org/dinky/mapper/TaskMapper.java | 2 - .../catalogue/impl/CatalogueServiceImpl.java | 3 +- .../dinky/service/impl/TaskServiceImpl.java | 50 +- ...n-pgsql.yml => application-postgresql.yml} | 0 .../src/main/resources/application.yml | 6 +- .../pgsql/V20241127.1.3.0__release.sql | 78 - .../R20240708.1.1.0__release.sql | 0 .../R20240729.1.1.0__release.sql | 0 .../V20240506.1.0.2__baseline.sql | 0 .../V20240708.1.1.0__release.sql | 0 .../V20240729.1.1.0__release.sql | 0 .../V20240827.1.2.0__release.sql | 0 .../postgresql/V20241127.1.3.0__release.sql | 0 .../postgresql/V20241203.1.2.0__release.sql | 41 + .../src/main/resources/mapper/TaskMapper.xml | 6 +- dinky-assembly/src/main/assembly/package.xml | 7 + .../dinky-catalog-postgres-1.14/pom.xml | 61 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.15/pom.xml | 60 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.16/pom.xml | 44 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.17/pom.xml | 44 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.18/pom.xml | 44 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.19/pom.xml | 44 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + .../dinky-catalog-postgres-1.20/pom.xml | 44 + .../flink/catalog/DinkyPostgresCatalog.java | 1542 +++++++++++++++++ .../factory/DinkyPostgresCatalogFactory.java | 70 + .../DinkyPostgresCatalogFactoryOptions.java | 41 + .../org.apache.flink.table.factories.Factory | 16 + .../catalog/DinkyPostgresSQLCatalogTest.java | 62 + .../DinkyPostgresSQLCatalogFactoryTest.java | 79 + dinky-catalog/dinky-catalog-postgres/pom.xml | 54 + dinky-catalog/pom.xml | 1 + .../data/enums/CatalogTypeMappingEnum.java | 65 + .../java/org/dinky/data/job/SqlCategory.java | 2 +- .../main/java/org/dinky/data/job/SqlType.java | 4 +- dinky-core/pom.xml | 57 + pom.xml | 37 + 73 files changed, 13313 insertions(+), 155 deletions(-) delete mode 100644 .github/workflows/code-review.yml rename dinky-admin/src/main/resources/{application-pgsql.yml => application-postgresql.yml} (100%) delete mode 100644 dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/R20240708.1.1.0__release.sql (100%) rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/R20240729.1.1.0__release.sql (100%) rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/V20240506.1.0.2__baseline.sql (100%) rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/V20240708.1.1.0__release.sql (100%) rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/V20240729.1.1.0__release.sql (100%) rename dinky-admin/src/main/resources/db/migration/{pgsql => postgresql}/V20240827.1.2.0__release.sql (100%) create mode 100644 dinky-admin/src/main/resources/db/migration/postgresql/V20241127.1.3.0__release.sql create mode 100644 dinky-admin/src/main/resources/db/migration/postgresql/V20241203.1.2.0__release.sql create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.14/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.15/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.16/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.17/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.18/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.19/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/pom.xml create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/main/java/org/dinky/flink/catalog/DinkyPostgresCatalog.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactory.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/main/java/org/dinky/flink/catalog/factory/DinkyPostgresCatalogFactoryOptions.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/test/java/org/dinky/flink/catalog/DinkyPostgresSQLCatalogTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/dinky-catalog-postgres-1.20/src/test/java/org/dinky/flink/catalog/factory/DinkyPostgresSQLCatalogFactoryTest.java create mode 100644 dinky-catalog/dinky-catalog-postgres/pom.xml create mode 100644 dinky-common/src/main/java/org/dinky/data/enums/CatalogTypeMappingEnum.java diff --git a/.github/workflows/code-review.yml b/.github/workflows/code-review.yml deleted file mode 100644 index 4630e40094..0000000000 --- a/.github/workflows/code-review.yml +++ /dev/null @@ -1,44 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: Code Review Robot - -permissions: - contents: read - pull-requests: write - -on: - pull_request: - types: [opened, reopened, synchronize] - -jobs: - code-review: - # if: ${{ contains(github.event.*.labels.*.name, 'gpt review') }} # Optional; to run only when a label is attached - runs-on: ubuntu-latest - steps: - - name: Code Review - uses: anc95/ChatGPT-CodeReview@main - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - # Optional - LANGUAGE: Chinese - OPENAI_API_ENDPOINT: https://api.openai.com/v1 - MODEL: gpt-3.5-turbo # https://platform.openai.com/docs/models - PROMPT: Please check if there are any confusions or irregularities in the following code diffs. If there are, please point them out. If not, please reply with "No problem". # https://platform.openai.com/docs/api-reference/completions/create#completions/create-prompt - top_p: 1 # https://platform.openai.com/docs/api-reference/chat/create#chat/create-top_p - temperature: 1 # https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature - max_tokens: 10000 - MAX_PATCH_LENGTH: 10000 # if the patch/diff length is large than MAX_PATCH_LENGTH, will be ignored and won't review. By default, with no MAX_PATCH_LENGTH set, there is also no limit for the patch/diff length. \ No newline at end of file diff --git a/dinky-admin/src/main/java/org/dinky/mapper/TaskMapper.java b/dinky-admin/src/main/java/org/dinky/mapper/TaskMapper.java index 5c6b32b33e..60b57c77ea 100644 --- a/dinky-admin/src/main/java/org/dinky/mapper/TaskMapper.java +++ b/dinky-admin/src/main/java/org/dinky/mapper/TaskMapper.java @@ -39,8 +39,6 @@ @Mapper public interface TaskMapper extends SuperMapper { - Integer queryAllSizeByName(String name); - List queryOnLineTaskByDoneStatus( @Param("parentIds") List parentIds, @Param("stepIds") List stepIds, diff --git a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java index 395fc74c71..8f644c2b18 100644 --- a/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/catalogue/impl/CatalogueServiceImpl.java @@ -472,7 +472,7 @@ private String getFileText(File sourceFile) { } } } catch (Exception e) { - log.error("read file error, {} ", e); + log.error("read file error, {} ", e.getMessage(), e); } return sb.toString(); } @@ -555,7 +555,6 @@ public Result deleteCatalogueById(Integer catalogueId) { if (CollUtil.isNotEmpty(metricListByTaskId)) { metricListByTaskId.forEach(metrics -> monitorService.removeById(metrics.getId())); - // todo: 需要删除 paimon 中的监控数据, 但是 paimon 中没有提供删除接口 } } diff --git a/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java index 56f206396f..b0bb24b11a 100644 --- a/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java @@ -33,6 +33,7 @@ import org.dinky.data.dto.TaskDTO; import org.dinky.data.dto.TaskRollbackVersionDTO; import org.dinky.data.dto.TaskSubmitDto; +import org.dinky.data.enums.CatalogTypeMappingEnum; import org.dinky.data.enums.GatewayType; import org.dinky.data.enums.JobLifeCycle; import org.dinky.data.enums.JobStatus; @@ -87,11 +88,9 @@ import org.dinky.service.SavepointsService; import org.dinky.service.TaskService; import org.dinky.service.TaskVersionService; -import org.dinky.service.UDFService; import org.dinky.service.UDFTemplateService; import org.dinky.service.UserService; import org.dinky.service.catalogue.CatalogueService; -import org.dinky.service.resource.ResourcesService; import org.dinky.service.task.BaseTask; import org.dinky.utils.FragmentVariableUtils; import org.dinky.utils.JsonUtils; @@ -119,6 +118,7 @@ import javax.annotation.Resource; +import org.jetbrains.annotations.NotNull; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Lazy; @@ -126,6 +126,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; @@ -164,8 +165,7 @@ public class TaskServiceImpl extends SuperServiceImpl implemen private final DataSourceProperties dsProperties; private final UserService userService; private final ApplicationContext applicationContext; - private final UDFService udfService; - private final ResourcesService resourcesService; + private final DruidDataSource druidProperties; @Resource @Lazy @@ -685,19 +685,7 @@ public Task initDefaultFlinkSQLEnv(Integer tenantId) { Task defaultFlinkSQLEnvTask = getTaskByNameAndTenantId(name, tenantId); - String sql = String.format( - "create catalog my_catalog with(\n " - + "'type' = 'dinky_mysql',\n" - + " 'username' = " - + "'%s',\n " - + "'password' = '%s',\n" - + " 'url' = '%s'\n" - + ")%suse catalog my_catalog%s", - dsProperties.getUsername(), - dsProperties.getPassword(), - dsProperties.getUrl(), - FlinkSQLConstant.SEPARATOR, - FlinkSQLConstant.SEPARATOR); + String sql = getStatementByCatalogType(CatalogTypeMappingEnum.ofDbType(druidProperties.getDbType())); if (null != defaultFlinkSQLEnvTask) { defaultFlinkSQLEnvTask.setStatement(sql); @@ -720,6 +708,31 @@ public Task initDefaultFlinkSQLEnv(Integer tenantId) { return defaultFlinkSQLEnvTask; } + private @NotNull String getStatementByCatalogType(CatalogTypeMappingEnum catalogTypeMappingEnum) { + String sql = String.format( + "create catalog my_catalog_%s with(\n " + + "'type' = '%s',\n" + + " 'username' = " + + "'%s',\n " + + "'password' = '%s',\n" + + " 'url' = '%s'\n" + + ")%suse catalog my_catalog_%s %s", + catalogTypeMappingEnum.getCatalogTypeName(), + catalogTypeMappingEnum.getCatalogTypeName(), + dsProperties.getUsername(), + dsProperties.getPassword(), + dsProperties.getUrl(), + FlinkSQLConstant.SEPARATOR, + catalogTypeMappingEnum.getCatalogTypeName(), + FlinkSQLConstant.SEPARATOR); + log.debug( + "Init default flink sql env sql:{}, yours dbType is:{}, catalogName is:{}", + sql, + catalogTypeMappingEnum.getDbType(), + catalogTypeMappingEnum.getCatalogTypeName()); + return sql; + } + @Override public Task getTaskByNameAndTenantId(String name, Integer tenantId) { return baseMapper.getTaskByNameAndTenantId(name, tenantId); @@ -778,7 +791,8 @@ public String getTaskAPIAddress() { @Override public Integer queryAllSizeByName(String name) { - return baseMapper.queryAllSizeByName(name); + Long value = baseMapper.selectCount(new LambdaQueryWrapper().likeRight(Task::getName, name + "-")); + return Math.toIntExact(value); } @Override diff --git a/dinky-admin/src/main/resources/application-pgsql.yml b/dinky-admin/src/main/resources/application-postgresql.yml similarity index 100% rename from dinky-admin/src/main/resources/application-pgsql.yml rename to dinky-admin/src/main/resources/application-postgresql.yml diff --git a/dinky-admin/src/main/resources/application.yml b/dinky-admin/src/main/resources/application.yml index 0855ab1b26..a71804ab9e 100644 --- a/dinky-admin/src/main/resources/application.yml +++ b/dinky-admin/src/main/resources/application.yml @@ -11,12 +11,12 @@ spring: application: name: Dinky profiles: - # The h2 database is used by default. If you need to use other databases, please set the configuration active to: mysql, currently supports [mysql, pgsql, h2] + # The h2 database is used by default. If you need to use other databases, please set the configuration active to: mysql, currently supports [mysql, postgresql, h2] # If you use mysql database, please configure mysql database connection information in application-mysql.yml - # If you use pgsql database, please configure pgsql database connection information in application-pgsql.yml + # If you use pgsql database, please configure pgsql database connection information in application-postgresql.yml # If you use the h2 database, please configure the h2 database connection information in application-h2.yml, # note: the h2 database is only for experience use, and the related data that has been created cannot be migrated, please use it with caution - active: ${DB_ACTIVE:h2} #[h2,mysql,pgsql] + active: ${DB_ACTIVE:h2} #[h2,mysql,postgresql] include: - jmx - flyway diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql deleted file mode 100644 index d5b522e889..0000000000 --- a/dinky-admin/src/main/resources/db/migration/pgsql/V20241127.1.3.0__release.sql +++ /dev/null @@ -1,78 +0,0 @@ - -SELECT add_column_if_not_exists('public','dinky_alert_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_job_history', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_job_instance', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_sys_menu', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_sys_role_menu', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_row_permissions', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_user_role', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_user_tenant', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_udf_manage', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_udf_template', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_catalogue', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_cluster_configuration', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_cluster', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_dashboard', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_database', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_flink_document', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_fragment', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_git_project', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_metrics', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_sys_operate_log', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_resources', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_savepoints', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_sys_token', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_task', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_task_version', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_alert_group', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_alert_instance', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_alert_rules', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','dinky_alert_template', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -ALTER TABLE public.dinky_alert_history DROP COLUMN IF EXISTS is_deleted; -SELECT add_column_if_not_exists('public','dinky_sys_login_log', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - -SELECT add_column_if_not_exists('public','metadata_column', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); -SELECT add_column_if_not_exists('public','metadata_database', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); -SELECT add_column_if_not_exists('public','metadata_database_property', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); -SELECT add_column_if_not_exists('public','metadata_function', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); -SELECT add_column_if_not_exists('public','metadata_table', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); -SELECT add_column_if_not_exists('public','metadata_table_property', 'is_delete', 'BOOLEAN', 'FALSE', 'is delete '); - - -CREATE UNIQUE INDEX unx_metadata_column ON metadata_column (table_id, column_name, is_delete); -CREATE UNIQUE INDEX unx_metadata_database ON metadata_database (database_name, is_delete); -CREATE UNIQUE INDEX unx_metadata_database_property ON metadata_database_property (database_id, key, is_delete); -CREATE UNIQUE INDEX unx_metadata_function ON metadata_function (function_name, database_id, is_delete); -CREATE UNIQUE INDEX unx_metadata_table ON metadata_table (table_name, database_id, is_delete); -CREATE UNIQUE INDEX unx_metadata_table_property ON metadata_table_property (table_id, key, is_delete); diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/R20240708.1.1.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/R20240708.1.1.0__release.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/R20240708.1.1.0__release.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/R20240708.1.1.0__release.sql diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/R20240729.1.1.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/R20240729.1.1.0__release.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/R20240729.1.1.0__release.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/R20240729.1.1.0__release.sql diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20240506.1.0.2__baseline.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20240506.1.0.2__baseline.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/V20240506.1.0.2__baseline.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/V20240506.1.0.2__baseline.sql diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20240708.1.1.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20240708.1.1.0__release.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/V20240708.1.1.0__release.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/V20240708.1.1.0__release.sql diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20240729.1.1.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20240729.1.1.0__release.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/V20240729.1.1.0__release.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/V20240729.1.1.0__release.sql diff --git a/dinky-admin/src/main/resources/db/migration/pgsql/V20240827.1.2.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20240827.1.2.0__release.sql similarity index 100% rename from dinky-admin/src/main/resources/db/migration/pgsql/V20240827.1.2.0__release.sql rename to dinky-admin/src/main/resources/db/migration/postgresql/V20240827.1.2.0__release.sql diff --git a/dinky-admin/src/main/resources/db/migration/postgresql/V20241127.1.3.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20241127.1.3.0__release.sql new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dinky-admin/src/main/resources/db/migration/postgresql/V20241203.1.2.0__release.sql b/dinky-admin/src/main/resources/db/migration/postgresql/V20241203.1.2.0__release.sql new file mode 100644 index 0000000000..0e45e82425 --- /dev/null +++ b/dinky-admin/src/main/resources/db/migration/postgresql/V20241203.1.2.0__release.sql @@ -0,0 +1,41 @@ + + + +-- Table structure for public.dinky_user + +CREATE TABLE IF NOT EXISTS public.dinky_user_backup +( + id serial PRIMARY KEY NOT NULL, + username varchar(50) NOT NULL, + user_type int DEFAULT 1, + password varchar(50), + nickname varchar(50), + worknum varchar(50), + avatar bytea, + mobile varchar(20), + enabled boolean NOT NULL DEFAULT true, + super_admin_flag boolean DEFAULT false, + is_delete boolean NOT NULL DEFAULT false, + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE public.dinky_user_backup IS 'user'; +COMMENT ON COLUMN public.dinky_user_backup.id IS 'id'; +COMMENT ON COLUMN public.dinky_user_backup.username IS 'username'; +COMMENT ON COLUMN public.dinky_user_backup.password IS 'password'; +COMMENT ON COLUMN public.dinky_user_backup.nickname IS 'nickname'; +COMMENT ON COLUMN public.dinky_user_backup.worknum IS 'worknum'; +COMMENT ON COLUMN public.dinky_user_backup.avatar IS 'avatar'; +COMMENT ON COLUMN public.dinky_user_backup.mobile IS 'mobile phone'; +COMMENT ON COLUMN public.dinky_user_backup.enabled IS 'enabled'; +COMMENT ON COLUMN public.dinky_user_backup.super_admin_flag IS 'is super admin(0:false,1true)'; + + +insert into public.dinky_user_backup(id, username, user_type, password, nickname, worknum, avatar, mobile, enabled, super_admin_flag, is_delete, create_time, update_time) +select id, username, user_type, password, nickname, worknum, avatar, mobile, enabled, + case when super_admin_flag = 0 then false else true end as super_admin_flag + , is_delete, create_time, update_time +from public.dinky_user; + +drop table if exists public.dinky_user; +alter table public.dinky_user_backup rename to dinky_user; diff --git a/dinky-admin/src/main/resources/mapper/TaskMapper.xml b/dinky-admin/src/main/resources/mapper/TaskMapper.xml index 4f1f731d7e..031633ab65 100644 --- a/dinky-admin/src/main/resources/mapper/TaskMapper.xml +++ b/dinky-admin/src/main/resources/mapper/TaskMapper.xml @@ -46,11 +46,7 @@ - + diff --git a/dinky-admin/src/main/resources/mapper/ClusterInstanceMapper.xml b/dinky-admin/src/main/resources/mapper/ClusterInstanceMapper.xml index d4ab493196..7019e393eb 100644 --- a/dinky-admin/src/main/resources/mapper/ClusterInstanceMapper.xml +++ b/dinky-admin/src/main/resources/mapper/ClusterInstanceMapper.xml @@ -63,7 +63,7 @@ a.* from dinky_cluster a - where enabled = 1 + where enabled = 1 and is_delete = false and `type` in( 'standalone' , 'yarn-session' , 'kubernetes-session') diff --git a/dinky-admin/src/main/resources/mapper/JobHistoryMapper.xml b/dinky-admin/src/main/resources/mapper/JobHistoryMapper.xml index 2ad1c75dc1..c56f472cb6 100644 --- a/dinky-admin/src/main/resources/mapper/JobHistoryMapper.xml +++ b/dinky-admin/src/main/resources/mapper/JobHistoryMapper.xml @@ -5,7 +5,7 @@ diff --git a/dinky-admin/src/main/resources/mapper/JobInstanceMapper.xml b/dinky-admin/src/main/resources/mapper/JobInstanceMapper.xml index a5ee9ed2dd..88b907d343 100644 --- a/dinky-admin/src/main/resources/mapper/JobInstanceMapper.xml +++ b/dinky-admin/src/main/resources/mapper/JobInstanceMapper.xml @@ -5,7 +5,7 @@ @@ -69,9 +69,10 @@ from dinky_job_instance a inner join ( select max(ji.id) as id - from dinky_job_instance ji + from dinky_job_instance ji where ji.is_delete=false group by ji.task_id ) snap on snap.id = a.id + where a.is_delete = false group by status @@ -79,28 +80,30 @@ select sum(case when b.batch then 1 else 0 end ) as batchJobCount, sum(case when b.batch then 0 else 1 end ) as streamingJobCount from (select batch_model as batch - from (select max(ji.id) as id from dinky_job_instance ji group by ji.task_id) as a + from (select max(ji.id) as id from dinky_job_instance ji where ji.is_delete=false group by ji.task_id) as a left join dinky_job_instance dji on dji.id = a.id - left join dinky_history dh on dji.history_id = dh.id) b + left join dinky_history dh on dji.history_id = dh.id + where dji.is_delete=false and dh.is_delete=false + ) b diff --git a/dinky-admin/src/main/resources/mapper/MenuMapper.xml b/dinky-admin/src/main/resources/mapper/MenuMapper.xml index 4a7cbe6196..4c250d66f7 100644 --- a/dinky-admin/src/main/resources/mapper/MenuMapper.xml +++ b/dinky-admin/src/main/resources/mapper/MenuMapper.xml @@ -23,7 +23,7 @@ select id, name, parent_id, order_num, path, component, type, display, ifnull(perms,'') as perms, icon, create_time, update_time - from dinky_sys_menu + from dinky_sys_menu where is_delete = false - - @@ -58,7 +45,7 @@ left join dinky_sys_role_menu rm on m.id = rm.menu_id left join dinky_user_role ur on rm.role_id = ur.role_id left join dinky_role ro on ur.role_id = ro.role_id - where ur.user_id = #{params.userId} + where ur.user_id = #{params.userId} and m.is_delete = false and rm.is_delete = false and ur.is_delete = false and ro.is_delete = false AND m.`name` like concat('%', #{name}, '%') @@ -74,54 +61,34 @@ left join dinky_sys_role_menu rm on m.id = rm.menu_id left join dinky_user_role ur on rm.role_id = ur.role_id left join dinky_role ro on ur.role_id = ro.role_id - left join sys_user u on ur.user_id = u.user_id - where u.user_id = #{userId} + left join dinky_user u on ur.user_id = u.id + where u.id = #{userId} and m.type in ('0', '1') - AND ro.is_delete = 0 + AND ro.is_delete = false and m.is_delete = false and rm.is_delete = false and ur.is_delete = false and ro.is_delete = false and u.is_delete = false order by m.parent_id, m.order_num - - - - - select a.* @@ -54,53 +43,16 @@ - - - \ No newline at end of file diff --git a/dinky-admin/src/main/resources/mapper/RoleMenuMapper.xml b/dinky-admin/src/main/resources/mapper/RoleMenuMapper.xml index d0b18cbd65..5b5aa96a94 100644 --- a/dinky-admin/src/main/resources/mapper/RoleMenuMapper.xml +++ b/dinky-admin/src/main/resources/mapper/RoleMenuMapper.xml @@ -11,18 +11,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - delete from dinky_sys_role_menu where role_id=#{roleId} - - - - insert into dinky_sys_role_menu(role_id, menu_id) values - - (#{item.roleId},#{item.menuId}) - - \ No newline at end of file diff --git a/dinky-admin/src/main/resources/mapper/TaskMapper.xml b/dinky-admin/src/main/resources/mapper/TaskMapper.xml index 031633ab65..7aa88b2edf 100644 --- a/dinky-admin/src/main/resources/mapper/TaskMapper.xml +++ b/dinky-admin/src/main/resources/mapper/TaskMapper.xml @@ -51,7 +51,7 @@ @@ -59,39 +59,9 @@ - @@ -114,7 +84,7 @@ from (select case a.batch_model when 0 then 'streaming' when 1 then 'batch' end as batch_model, coalesce(count(1), 0) as cnt from dinky_task a - where a.batch_model is not null + where a.batch_model is not null and a.enabled = 1 and a.is_delete = false and a.dialect in ( 'FlinkSql', 'FlinkJar', diff --git a/dinky-admin/src/main/resources/mapper/TenantMapper.xml b/dinky-admin/src/main/resources/mapper/TenantMapper.xml index 5ea158c7fa..0e7ae54efb 100644 --- a/dinky-admin/src/main/resources/mapper/TenantMapper.xml +++ b/dinky-admin/src/main/resources/mapper/TenantMapper.xml @@ -28,18 +28,4 @@ - \ No newline at end of file diff --git a/dinky-admin/src/main/resources/mapper/UserMapper.xml b/dinky-admin/src/main/resources/mapper/UserMapper.xml index c2ad372028..f8ec667a93 100644 --- a/dinky-admin/src/main/resources/mapper/UserMapper.xml +++ b/dinky-admin/src/main/resources/mapper/UserMapper.xml @@ -33,20 +33,6 @@ - - update dinky_user set is_delete = 0 where id = #{id} From 8b1021f7b52aac412de5cc2bdc19c976aa8107db Mon Sep 17 00:00:00 2001 From: Zzm0809 Date: Sun, 8 Dec 2024 03:35:18 +0000 Subject: [PATCH 44/45] Spotless Apply --- .../main/java/org/dinky/mapper/MenuMapper.java | 2 -- .../main/java/org/dinky/mapper/RoleMapper.java | 2 -- .../java/org/dinky/mapper/RoleMenuMapper.java | 4 ---- .../main/java/org/dinky/mapper/TenantMapper.java | 6 +----- .../dinky/service/impl/DocumentServiceImpl.java | 16 +++++++++------- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/mapper/MenuMapper.java b/dinky-admin/src/main/java/org/dinky/mapper/MenuMapper.java index dfc0fec252..95e1a56814 100644 --- a/dinky-admin/src/main/java/org/dinky/mapper/MenuMapper.java +++ b/dinky-admin/src/main/java/org/dinky/mapper/MenuMapper.java @@ -41,9 +41,7 @@ public interface MenuMapper extends SuperMapper { List selectMenuTreeByUserId(@Param("userId") Integer userId); - int hasChildByMenuId(Integer menuId); - List selectMenuPermsByRoleId(Integer roleId); } diff --git a/dinky-admin/src/main/java/org/dinky/mapper/RoleMapper.java b/dinky-admin/src/main/java/org/dinky/mapper/RoleMapper.java index b4ae3faceb..da274f62a8 100644 --- a/dinky-admin/src/main/java/org/dinky/mapper/RoleMapper.java +++ b/dinky-admin/src/main/java/org/dinky/mapper/RoleMapper.java @@ -23,10 +23,8 @@ import org.dinky.mybatis.mapper.SuperMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; -import java.util.Set; /** role mapper interface */ @Mapper diff --git a/dinky-admin/src/main/java/org/dinky/mapper/RoleMenuMapper.java b/dinky-admin/src/main/java/org/dinky/mapper/RoleMenuMapper.java index d46d7a8561..8e91c0ec59 100644 --- a/dinky-admin/src/main/java/org/dinky/mapper/RoleMenuMapper.java +++ b/dinky-admin/src/main/java/org/dinky/mapper/RoleMenuMapper.java @@ -24,13 +24,9 @@ import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** MenuMapper */ @Mapper public interface RoleMenuMapper extends SuperMapper { int checkMenuExistRole(Integer menuId); - - } diff --git a/dinky-admin/src/main/java/org/dinky/mapper/TenantMapper.java b/dinky-admin/src/main/java/org/dinky/mapper/TenantMapper.java index 6db2b17421..04b8234370 100644 --- a/dinky-admin/src/main/java/org/dinky/mapper/TenantMapper.java +++ b/dinky-admin/src/main/java/org/dinky/mapper/TenantMapper.java @@ -23,11 +23,7 @@ import org.dinky.mybatis.mapper.SuperMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; -import java.util.Set; /** tenant mapper interface */ @Mapper -public interface TenantMapper extends SuperMapper { } +public interface TenantMapper extends SuperMapper {} diff --git a/dinky-admin/src/main/java/org/dinky/service/impl/DocumentServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/impl/DocumentServiceImpl.java index fc3c92e7a5..f542f88472 100644 --- a/dinky-admin/src/main/java/org/dinky/service/impl/DocumentServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/impl/DocumentServiceImpl.java @@ -38,14 +38,16 @@ public class DocumentServiceImpl extends SuperServiceImpl getFillAllByVersion(String version) { if (Asserts.isNotNullString(version)) { - return baseMapper.selectList( - new QueryWrapper().lambda().eq(Document::getVersion, version).eq(Document::getEnabled, true) - .eq(Document::getIsDelete, false) - ); + return baseMapper.selectList(new QueryWrapper() + .lambda() + .eq(Document::getVersion, version) + .eq(Document::getEnabled, true) + .eq(Document::getIsDelete, false)); } else { - return baseMapper.selectList(new QueryWrapper().lambda().eq(Document::getEnabled, true) - .eq(Document::getIsDelete, false) - ); + return baseMapper.selectList(new QueryWrapper() + .lambda() + .eq(Document::getEnabled, true) + .eq(Document::getIsDelete, false)); } } From 3854c828b8d64baefff4faea1468893596e7a11c Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Sun, 8 Dec 2024 11:45:52 +0800 Subject: [PATCH 45/45] =?UTF-8?q?=E5=A4=84=E7=90=86=20postgresql=20?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dinky/interceptor/PostgreSQLPrepareInterceptor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dinky-admin/src/main/java/org/dinky/interceptor/PostgreSQLPrepareInterceptor.java b/dinky-admin/src/main/java/org/dinky/interceptor/PostgreSQLPrepareInterceptor.java index 9fb624ea3c..4a8bb4c8ba 100644 --- a/dinky-admin/src/main/java/org/dinky/interceptor/PostgreSQLPrepareInterceptor.java +++ b/dinky-admin/src/main/java/org/dinky/interceptor/PostgreSQLPrepareInterceptor.java @@ -48,10 +48,8 @@ public Object intercept(final Invocation invocation) throws Throwable { Field field = boundSql.getClass().getDeclaredField("sql"); field.setAccessible(true); field.set(boundSql, boundSql.getSql().replace("`", "\"").toLowerCase()); - // 拿出逻辑删除的字段 is_delete 将 is_delete = 0 改为 is_delete = false 防止逻辑删除失效 用正则匹配 因为不能保证空格的位置 field.set(boundSql, boundSql.getSql().replaceAll("is_delete = 0", "is_delete = false")); field.set(boundSql, boundSql.getSql().replaceAll("is_delete = 1", "is_delete = true")); - // 将 set is_delete = 0 改为 set is_delete = false 防止逻辑删除失效 用正则匹配 因为不能保证空格的位置 field.set(boundSql, boundSql.getSql().replaceAll("set is_delete = 0", "set is_delete = false")); field.set(boundSql, boundSql.getSql().replaceAll("set is_delete = 1", "set is_delete = true")); return invocation.proceed();