From f016fd0f215400395d736343cfb43e5419c0cced Mon Sep 17 00:00:00 2001 From: Jiale Date: Mon, 23 Jun 2025 09:10:52 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=A8=A1=E5=9E=8BAPI=E5=B9=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 2 +- src/api/alert/model/models.ts | 2 + src/views/model/list/step/Step3.vue | 124 +++++------ src/views/model/train/index.vue | 331 +++++++++++++++++++++------- 4 files changed, 321 insertions(+), 138 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5c0f4e1..33edcab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -120,7 +120,7 @@ "source.organizeImports": "never", "source.fixAll.stylelint": "explicit" }, - "editor.defaultFormatter": "stylelint.vscode-stylelint" + "editor.defaultFormatter": "octref.vetur" }, "i18n-ally.localesPaths": ["src/locales/lang"], "i18n-ally.keystyle": "nested", diff --git a/src/api/alert/model/models.ts b/src/api/alert/model/models.ts index 3a5ae12..522139c 100644 --- a/src/api/alert/model/models.ts +++ b/src/api/alert/model/models.ts @@ -9,6 +9,7 @@ enum Api { CALCULATE_BACK = '/alert/model/data/calculate/', OPTIMISTIC = '/alert/optimistic', TRAIN_MODEL = '/alert/model/train', + TEST_MODEL = '/alert/model/test', } export function modelCardListApi(params?: ModelQueryParams) { return defHttp.get({ url: Api.MODEL_CARD_LIST, params }) @@ -34,3 +35,4 @@ export function calculateBackApi(id: any, params: any) { export const getOptimisticApi = (params: any) => defHttp.get({ url: Api.OPTIMISTIC, params }) export const trainModelApi = (params: any) => defHttp.post({ url: Api.TRAIN_MODEL, data: params }) +export const testModelApi = (params: any) => defHttp.post({ url: Api.TEST_MODEL, data: params }) diff --git a/src/views/model/list/step/Step3.vue b/src/views/model/list/step/Step3.vue index 295d3f0..943c595 100644 --- a/src/views/model/list/step/Step3.vue +++ b/src/views/model/list/step/Step3.vue @@ -1,14 +1,14 @@ diff --git a/src/views/model/train/index.vue b/src/views/model/train/index.vue index 5c663a8..b38e783 100644 --- a/src/views/model/train/index.vue +++ b/src/views/model/train/index.vue @@ -3,7 +3,7 @@ import type { ComponentPublicInstance } from 'vue' import type { Dayjs } from 'dayjs' import { debounce } from 'lodash-es' import dayjs from 'dayjs' -import { computed, defineComponent, onMounted, ref, watch } from 'vue' +import { computed, defineComponent, onMounted, ref, toRaw, watch } from 'vue' import { useRoute } from 'vue-router' import { Button, @@ -17,15 +17,20 @@ import { InputNumber, Modal, RangePicker, + Spin, Steps, Tabs, } from 'ant-design-vue' import VueECharts from 'vue-echarts' -import { func } from 'vue-types' import { pointTableSchema, sampleInfoTableSchema } from './data' import { BasicTable, useTable } from '@/components/Table' import { PageWrapper } from '@/components/Page' -import { modelInfoApi, trainModelApi, updateModelInfo } from '@/api/alert/model/models' +import { + modelInfoApi, + testModelApi, + trainModelApi, + updateModelInfo, +} from '@/api/alert/model/models' import { getExaHistorys } from '@/api/alert/exa/index' import { useECharts } from '@/hooks/web/useECharts' @@ -50,13 +55,14 @@ export default defineComponent({ ACheckbox: Checkbox, AInputNumber: InputNumber, AButton: Button, + ASpin: Spin, }, setup() { const route = useRoute() const id = route.params.id const model = ref(null) const brushActivated = ref>(new Set()) - + const spinning = ref(false) const fetchModelInfo = async () => { const modelInfo = await modelInfoApi(id) model.value = modelInfo @@ -83,7 +89,10 @@ export default defineComponent({ type RangeValue = [Dayjs, Dayjs] const currentDate: Dayjs = dayjs() const lastMonthDate: Dayjs = currentDate.subtract(1, 'day') - const rangeValue: RangeValue = [dayjs('2023-10-28 00:00:00'), dayjs('2023-10-28 23:59:59')] + const rangeValue: RangeValue = [ + dayjs('2025-2-24 00:00:00'), + dayjs('2025-2-24 23:59:59'), + ] const historyTime = ref(rangeValue) const historyList = ref([]) const echartsRefs = ref([]) @@ -91,33 +100,116 @@ export default defineComponent({ async function getHistory() { if (!historyTime.value) return + spinning.value = true + if (model.value.para) { + getTestData() + } + else { + const params = { + startTime: historyTime.value[0].format('YYYY-MM-DD HH:mm:ss'), + endTime: historyTime.value[1].format('YYYY-MM-DD HH:mm:ss'), + itemName: model.value?.pointInfo + .map(item => item.pointId) + .join(','), + interval: model.value.sampling, + } + console.log(params) + const history = await getExaHistorys(params) + historyList.value = history.map((item, index) => { + const point = model.value?.pointInfo[index] + return { + data: [item], + name: `${index + 1}.${point?.description}(${point?.pointId})`, + } + }) + echartsRefs.value = Array.from({ length: historyList.value.length }) + brushActivated.value = new Set() + } + + spinning.value = false + } + + async function getTestData() { const params = { - startTime: historyTime.value[0].format('YYYY-MM-DD HH:mm:ss'), - endTime: historyTime.value[1].format('YYYY-MM-DD HH:mm:ss'), - itemName: model.value?.pointInfo.map(item => item.pointId).join(','), + Model_id: 118, + version: model.value?.Cur_Version ? model.value?.Cur_Version : 'v-test', + Test_Data: { + time: historyTime.value + .map(t => dayjs(t).format('YYYY-MM-DD HH:mm:ss')) + .join(','), + points: model.value.pointInfo.map(t => t.pointId).join(','), + interval: model.value.sampling * 1000, + }, } - console.log(params) - const history = await getExaHistorys(params) - historyList.value = history.map((item, index) => { + const result = await testModelApi(params) + const sampleData = result.sampleData + const reconData = result.reconData + const xData = generateTimeList( + historyTime.value, + model.value.sampling * 1000, + ) + historyList.value = sampleData.map((item, index) => { const point = model.value?.pointInfo[index] + const bias = item.map((t, i) => { + if ( + Math.abs(t - reconData[index][i]) + > model.value.para.Model_info.QCUL_99_line[i] + ) + return 1 + else return null + }) return { - data: item, - name: `${index}.${point?.description}(${point?.pointId})`, + data: [ + item.map((t, i) => { + return [xData[i], t] + }), + reconData[index].map((t, i) => { + return [xData[i], t] + }), + bias.map((t, i) => { + return [xData[i], t] + }), + ], + name: `${index + 1}.${point?.description}(${point?.pointId})`, } }) - echartsRefs.value = Array.from({ length: historyList.value.length }) - console.log('echartsRefs', echartsRefs.value) - brushActivated.value = new Set() + console.log(historyList.value) + } + + function generateTimeList(time: RangeValue, intervalMs: number) { + const [t1, t2] = time + const count = Math.floor(t2.diff(t1, 'millisecond') / intervalMs) + 1 + return Array.from({ length: count }, (_, i) => + t1.add(i * intervalMs, 'millisecond').valueOf()) } function getOption(item: any) { - console.log('getOption', item) - return { + const name = ['测量值', '模型值', ''] + const color = ['blue', '#ff6f00', 'red'] + const yIndex = [0, 0, 1] + const option = { xAxis: { type: 'time', + axisLabel: { + formatter(value) { + const date = new Date(value) + return date.toLocaleString() + }, + }, }, - yAxis: { type: 'value' }, - series: [{ data: item.data, type: 'line', smooth: true, symbol: 'none' }], + yAxis: [{ type: 'value' }, { type: 'value', max: 10, show: false }], + series: item.data.map((item, index) => { + return { + data: item, + type: 'line', + smooth: true, + symbol: 'none', + name: name[index], + color: color[index], + yAxisIndex: yIndex[index], + } + }), + legend: {}, dataZoom: [{}], brush: { toolbox: ['lineX'], @@ -133,6 +225,8 @@ export default defineComponent({ }, ], } + console.log('option', option) + return option } function setChartRef( @@ -161,7 +255,6 @@ export default defineComponent({ const chart = echartsRefs.value[index] if (!chart) return - console.log('chart', index, chart) chart.dispatchAction({ type: 'takeGlobalCursor', key: 'brush', @@ -173,7 +266,10 @@ export default defineComponent({ const areas = (model.value?.trainTime || []).map(row => ({ brushType: 'lineX', xAxisIndex: 0, - coordRange: [dayjs(row.st).valueOf(), dayjs(row.et).valueOf()], + coordRange: [ + dayjs(row.st).format('YYYY-MM-DD HH:mm:ss'), + dayjs(row.et).format('YYYY-MM-DD HH:mm:ss'), + ], })) chart.dispatchAction({ type: 'brush', @@ -191,7 +287,6 @@ export default defineComponent({ isInitBrush.value = false return } - console.log('brush selected:', params.batch) const selected = params.batch[0].selected if (selected.length > 0) { const areas = mergeAreas(params.batch[0].areas).map(area => ({ @@ -201,6 +296,7 @@ export default defineComponent({ })) const trainTime = areas.map((area) => { const [st, et] = area.coordRange + console.log('Selected area:', { st, et }, area) return { st: dayjs(st).format('YYYY-MM-DD HH:mm:ss'), et: dayjs(et).format('YYYY-MM-DD HH:mm:ss'), @@ -261,14 +357,18 @@ export default defineComponent({ if (val && val.id) updateModelInfo(val) }, 500) - + const modelInfoBack = ref(null) // 监听 model 变化 watch( model, (newVal, oldVal) => { - console.log('model changed:', newVal, oldVal) - if (oldVal === null) + if (modelInfoBack.value === null) { + modelInfoBack.value = JSON.stringify(newVal) + return + } + if (JSON.stringify(newVal) === modelInfoBack.value) return + modelInfoBack.value = JSON.stringify(newVal) updateModelInfoDebounced(newVal) }, { deep: true }, @@ -311,24 +411,37 @@ export default defineComponent({ return } const params = { - condition: '1==1', + conditon: modelInfo.alarmmodelset?.alarmcondition || '1==1', Hyper_para: { percent: modelInfo.rate, }, Train_Data: { points: pointInfo.map(item => item.pointId).join(','), - dead: pointInfo.map(item => item.dead ? '1' : '0').join(','), - limit: pointInfo.map(item => item.limit ? '1' : '0').join(','), - uplow: pointInfo.map(item => `${item.Upper},${item.Lower}`).join(';'), + dead: pointInfo.map(item => (item.dead ? '1' : '0')).join(','), + limit: pointInfo.map(item => (item.limit ? '1' : '0')).join(','), + uplow: pointInfo + .map( + item => + `${item.Upper ? item.Upper : null},${ + item.Lower ? item.Lower : null + }`, + ) + .join(';'), interval: modelInfo.sampling * 1000, - time: modelInfo.trainTime.map(item => `${item.st},${item.et}`).join(';'), + time: modelInfo.trainTime + .map(item => `${item.st},${item.et}`) + .join(';'), }, type: 'PCA', - smote_config: '[]', + smote_config: [], smote: true, } + spinning.value = true const response = await trainModelApi(params) - console.log('模型训练结果:', response) + model.value.para = response + model.value.principal = response.Model_info.K + getTestData() + spinning.value = false } const editForm = ref({ index: -1, @@ -336,14 +449,13 @@ export default defineComponent({ Lower: '', lowerBound: '', upperBound: '', - dead: false, - limit: true, + dead: true, + limit: false, }) const openEditPointModal = ref(false) let pointEditRecord = null function editPoint() { // 这里可以添加编辑点的逻辑 - console.log('编辑点') model.value.pointInfo[editForm.value.index] = { ...model.value.pointInfo[editForm.value.index], Upper: editForm.value.Upper, @@ -377,7 +489,7 @@ export default defineComponent({ } const mode = ref({ - alarmcondition: '1=1', + alarmcondition: '1==1', alarmname: '全工况运行', }) const openEditModeModal = ref(false) @@ -385,7 +497,7 @@ export default defineComponent({ function openEditMode() { openEditModeModal.value = true mode.value = { - alarmcondition: model.value?.alarmmodelset?.alarmcondition || '1=1', + alarmcondition: model.value?.alarmmodelset?.alarmcondition || '1==1', alarmname: model.value?.alarmmodelset?.alarmname || '全工况运行', } } @@ -394,10 +506,10 @@ export default defineComponent({ } function handleEditMode() { // 这里可以添加编辑模式的逻辑 - console.log('编辑模式') model.value.alarmmodelset = mode.value closeEditMode() } + return { pointTable, model, @@ -423,6 +535,7 @@ export default defineComponent({ closeEditMode, handleEditMode, mode, + spinning, } }, }) @@ -443,10 +556,10 @@ export default defineComponent({ {{ model?.name }} - {{ model?.description || '暂无描述' }} + {{ model?.description || "暂无描述" }} - {{ model?.Cur_Version || 'v-test' }} + {{ model?.Cur_Version || "v-test" }} 暂无 @@ -458,22 +571,22 @@ export default defineComponent({ {{ model?.creatTime }} - {{ model?.Modifier || '暂无' }} + {{ model?.Modifier || "暂无" }} - {{ model?.modifiedTime || '暂无' }} + {{ model?.modifiedTime || "暂无" }} - {{ model?.algorithm || 'PCA' }} + {{ model?.algorithm || "PCA" }} {{ model?.sampling }} - {{ model?.pointInfo.length || '暂无' }} + {{ model?.pointInfo.length || "暂无" }} {{ model?.rate }} @@ -485,14 +598,25 @@ export default defineComponent({ {{ model?.precision }} - {{ (model?.trainTime.reduce((total, item) => total + item.duration, 0) / 3600).toFixed(2) || '暂无' }} + {{ + ( + model?.trainTime.reduce( + (total, item) => total + item.duration, + 0, + ) / 3600 + ).toFixed(2) || "暂无" + }} {{ model?.principal }} - + {{ model?.alarmmodelset.alarmname }} @@ -503,7 +627,11 @@ export default defineComponent({ @@ -522,46 +650,84 @@ export default defineComponent({ -
- +
+ - + - + 模型训练
-
- - - - -
+ +
+ + + + +
+
- - + + - + - + - + - + - + 死区清洗 @@ -571,13 +737,28 @@ export default defineComponent({ - - + + - + - + From 41c7f01c9370954f901e9c3b72641a5a6129a9e9 Mon Sep 17 00:00:00 2001 From: Jiale Date: Fri, 27 Jun 2025 17:23:53 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E8=AE=AD=E7=BB=83=E7=BB=93=E6=9E=9C=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E6=A8=A1=E5=9E=8B=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/model/train/index.vue | 66 +++++++++++++++++---------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/views/model/train/index.vue b/src/views/model/train/index.vue index b38e783..1ad1f71 100644 --- a/src/views/model/train/index.vue +++ b/src/views/model/train/index.vue @@ -33,6 +33,7 @@ import { } from '@/api/alert/model/models' import { getExaHistorys } from '@/api/alert/exa/index' import { useECharts } from '@/hooks/web/useECharts' +import { useMessage } from '@/hooks/web/useMessage' export default defineComponent({ components: { @@ -58,6 +59,7 @@ export default defineComponent({ ASpin: Spin, }, setup() { + const { createMessage } = useMessage() const route = useRoute() const id = route.params.id const model = ref(null) @@ -150,14 +152,6 @@ export default defineComponent({ ) historyList.value = sampleData.map((item, index) => { const point = model.value?.pointInfo[index] - const bias = item.map((t, i) => { - if ( - Math.abs(t - reconData[index][i]) - > model.value.para.Model_info.QCUL_99_line[i] - ) - return 1 - else return null - }) return { data: [ item.map((t, i) => { @@ -166,9 +160,6 @@ export default defineComponent({ reconData[index].map((t, i) => { return [xData[i], t] }), - bias.map((t, i) => { - return [xData[i], t] - }), ], name: `${index + 1}.${point?.description}(${point?.pointId})`, } @@ -316,6 +307,7 @@ export default defineComponent({ isInitBrush.value = true } }) + updateModelInfoDebounced() } }, 300) @@ -353,26 +345,11 @@ export default defineComponent({ } // 防抖更新 - const updateModelInfoDebounced = debounce((val) => { + const updateModelInfoDebounced = debounce(() => { + const val = toRaw(model.value) if (val && val.id) updateModelInfo(val) }, 500) - const modelInfoBack = ref(null) - // 监听 model 变化 - watch( - model, - (newVal, oldVal) => { - if (modelInfoBack.value === null) { - modelInfoBack.value = JSON.stringify(newVal) - return - } - if (JSON.stringify(newVal) === modelInfoBack.value) - return - modelInfoBack.value = JSON.stringify(newVal) - updateModelInfoDebounced(newVal) - }, - { deep: true }, - ) function handleDeleteTrainTime(index: number) { if (!model.value?.trainTime) @@ -397,6 +374,12 @@ export default defineComponent({ isInitBrush.value = true } }) + updateModelInfoDebounced() + } + async function clearModel() { + model.value.para = null + updateModelInfoDebounced() + await getHistory() } async function trainModel() { @@ -437,10 +420,19 @@ export default defineComponent({ smote: true, } spinning.value = true - const response = await trainModelApi(params) - model.value.para = response - model.value.principal = response.Model_info.K - getTestData() + try { + const response = await trainModelApi(params) + model.value.para = response + model.value.principal = response.Model_info.K + updateModelInfoDebounced() + getTestData() + createMessage.success('模型训练成功') + } + catch (error) { + console.error('模型训练失败:', error) + createMessage.error('模型训练失败') + } + spinning.value = false } const editForm = ref({ @@ -465,6 +457,7 @@ export default defineComponent({ dead: editForm.value.dead, limit: editForm.value.limit, } + updateModelInfoDebounced() pointEditRecord.Upper = editForm.value.Upper pointEditRecord.Lower = editForm.value.Lower pointEditRecord.lowerBound = editForm.value.lowerBound @@ -507,6 +500,7 @@ export default defineComponent({ function handleEditMode() { // 这里可以添加编辑模式的逻辑 model.value.alarmmodelset = mode.value + updateModelInfoDebounced() closeEditMode() } @@ -536,6 +530,7 @@ export default defineComponent({ handleEditMode, mode, spinning, + clearModel, } }, }) @@ -667,6 +662,13 @@ export default defineComponent({ > 模型训练 + + 清除训练结果 + From ef628de5150f7a157a4b89aa3f8ec8929437b642 Mon Sep 17 00:00:00 2001 From: CJL6015 <1253368419@qq.com> Date: Sun, 6 Jul 2025 17:49:06 +0800 Subject: [PATCH 3/6] feat: add model editing functionality with transfer component and update pagination --- src/views/model/train/index.vue | 185 +++++++++++++++++++++++++++++--- 1 file changed, 169 insertions(+), 16 deletions(-) diff --git a/src/views/model/train/index.vue b/src/views/model/train/index.vue index 1ad1f71..6f1f8e3 100644 --- a/src/views/model/train/index.vue +++ b/src/views/model/train/index.vue @@ -9,6 +9,7 @@ import { Button, Card, Checkbox, + Col, Descriptions, Divider, Form, @@ -17,9 +18,11 @@ import { InputNumber, Modal, RangePicker, + Row, Spin, Steps, Tabs, + Transfer, } from 'ant-design-vue' import VueECharts from 'vue-echarts' import { pointTableSchema, sampleInfoTableSchema } from './data' @@ -34,6 +37,7 @@ import { import { getExaHistorys } from '@/api/alert/exa/index' import { useECharts } from '@/hooks/web/useECharts' import { useMessage } from '@/hooks/web/useMessage' +import { pointListApi } from '@/api/alert/model/select' export default defineComponent({ components: { @@ -57,6 +61,9 @@ export default defineComponent({ AInputNumber: InputNumber, AButton: Button, ASpin: Spin, + ATransfer: Transfer, + ARow: Row, + ACol: Col, }, setup() { const { createMessage } = useMessage() @@ -65,16 +72,18 @@ export default defineComponent({ const model = ref(null) const brushActivated = ref>(new Set()) const spinning = ref(false) + let trainTimeCopy = '' const fetchModelInfo = async () => { const modelInfo = await modelInfoApi(id) model.value = modelInfo + trainTimeCopy = JSON.stringify(model.value.trainTime) getHistory() } const pointData = computed(() => model.value?.pointInfo || []) const [pointTable] = useTable({ columns: pointTableSchema, - pagination: false, + pagination: true, dataSource: pointData, scroll: { y: 300 }, }) @@ -82,7 +91,6 @@ export default defineComponent({ const trainTime = computed(() => model.value?.trainTime || []) const [trainTimeTable] = useTable({ columns: sampleInfoTableSchema, - pagination: false, dataSource: trainTime, scroll: { y: 300 }, }) @@ -92,8 +100,8 @@ export default defineComponent({ const currentDate: Dayjs = dayjs() const lastMonthDate: Dayjs = currentDate.subtract(1, 'day') const rangeValue: RangeValue = [ - dayjs('2025-2-24 00:00:00'), - dayjs('2025-2-24 23:59:59'), + lastMonthDate, + currentDate, ] const historyTime = ref(rangeValue) const historyList = ref([]) @@ -115,7 +123,6 @@ export default defineComponent({ .join(','), interval: model.value.sampling, } - console.log(params) const history = await getExaHistorys(params) historyList.value = history.map((item, index) => { const point = model.value?.pointInfo[index] @@ -164,14 +171,13 @@ export default defineComponent({ name: `${index + 1}.${point?.description}(${point?.pointId})`, } }) - console.log(historyList.value) + brushActivated.value = new Set() } function generateTimeList(time: RangeValue, intervalMs: number) { const [t1, t2] = time const count = Math.floor(t2.diff(t1, 'millisecond') / intervalMs) + 1 - return Array.from({ length: count }, (_, i) => - t1.add(i * intervalMs, 'millisecond').valueOf()) + return Array.from({ length: count }, (_, i) => t1.add(i * intervalMs, 'millisecond').valueOf()) } function getOption(item: any) { @@ -216,7 +222,6 @@ export default defineComponent({ }, ], } - console.log('option', option) return option } @@ -286,7 +291,9 @@ export default defineComponent({ coordRange: area.coordRange, })) const trainTime = areas.map((area) => { - const [st, et] = area.coordRange + const [stRaw, etRaw] = area.coordRange + const st = typeof stRaw === 'string' ? dayjs(stRaw).valueOf() : stRaw + const et = typeof etRaw === 'string' ? dayjs(etRaw).valueOf() : etRaw console.log('Selected area:', { st, et }, area) return { st: dayjs(st).format('YYYY-MM-DD HH:mm:ss'), @@ -297,7 +304,11 @@ export default defineComponent({ mode: '', // 有效样本数(如有数据可补充) } }) + console.log('Selected train time:', trainTime) + if (trainTimeCopy === JSON.stringify(trainTime)) + return model.value.trainTime = trainTime + trainTimeCopy = JSON.stringify(trainTime) echartsRefs.value.forEach((chart, index) => { if (chart) { chart.dispatchAction({ @@ -504,6 +515,86 @@ export default defineComponent({ closeEditMode() } + const openEditModelModal = ref(false) + const editModelForm = ref({ + sampling: 0, + rate: 0, + selectedKeys: [], + }) + + // 穿梭框数据源示例 + const transferData = ref([]) // 穿梭框数据源 + + // 初始化时获取全部测点 + async function fetchAllPoints(keyword = '') { + // 这里调用你的后端接口,传递 keyword + // const res = await fetchPointsApi({ keyword }) + // 示例数据 + const data = await pointListApi({ keyword }) + console.log('Fetched points:', data) + transferData.value = transferData.value.filter(item => editModelForm.value.selectedKeys.includes(item.key)) + .concat(data.map(item => ({ + key: item.id, + title: item.name, + }))) + console.log('Transfer data:', transferData.value) + } + onMounted(() => { + fetchAllPoints() + }) + + function handleTransferSearch(dir, value) { + if (dir === 'left') { + // 左侧:后端接口查询 + fetchAllPoints(value) + } + else { + // 右侧:前端过滤 + transferData.value = (model.value?.pointInfo || []) + .filter(item => + editModelForm.value.selectedKeys.includes(`${item.description}|${item.pointId}|${item.unit}|${item.Lower}|${item.Upper}`) + && (`${item.description || ''}(${item.pointId})`).includes(value), + ) + .map(item => ({ + key: `${item.description}|${item.pointId}|${item.unit}|${item.Lower}|${item.Upper}`, + title: `${item.description || ''} (${item.pointId})`, + })) + } + } + + function openEditModel() { + editModelForm.value.sampling = model.value?.sampling || 0 + editModelForm.value.rate = model.value?.rate || 0 + editModelForm.value.selectedKeys = (model.value?.pointInfo || []).map(item => `${item.description}|${item.pointId}|${item.unit}|${item.Lower}|${item.Upper}`) + transferData.value = (model.value?.pointInfo || []).map(item => ({ + key: `${item.description}|${item.pointId}|${item.unit}|${item.Lower}|${item.Upper}`, + title: `${item.description || ''} (${item.pointId})`, + })) + console.log('transferData:', transferData.value) + openEditModelModal.value = true + } + function handleEditModelOk() { + model.value.sampling = editModelForm.value.sampling + model.value.rate = editModelForm.value.rate + model.value.pointInfo = editModelForm.value.selectedKeys.map((key) => { + const [description, pointId, unit, Lower, Upper] = key.split('|') + return { + description, + pointId, + unit, + Lower, + Upper, + dead: true, + limit: false, + } + }) + clearModel() + openEditModelModal.value = false + } + function handleEditModelCancel() { + openEditModelModal.value = false + } + return { pointTable, model, @@ -531,6 +622,13 @@ export default defineComponent({ mode, spinning, clearModel, + openEditModelModal, + editModelForm, + transferData, + handleTransferSearch, + openEditModel, + handleEditModelOk, + handleEditModelCancel, } }, }) @@ -540,12 +638,6 @@ export default defineComponent({
- {{ model?.name }} @@ -669,6 +761,15 @@ export default defineComponent({ > 清除训练结果 + + 修改模型 + + + 下装 +
@@ -764,6 +865,58 @@ export default defineComponent({
+ + + + + + + + + + + + + + +
+ +
+
+
From 99e38cf13d16c75ccf207c3ab4dca76477435648 Mon Sep 17 00:00:00 2001 From: Jiale Date: Fri, 11 Jul 2025 18:56:47 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E6=A8=A1=E5=9E=8B=E8=8E=B7=E5=8F=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/alert/model/models.ts | 4 ++++ src/views/model/train/index.vue | 33 +++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/api/alert/model/models.ts b/src/api/alert/model/models.ts index 522139c..d88f12e 100644 --- a/src/api/alert/model/models.ts +++ b/src/api/alert/model/models.ts @@ -10,6 +10,7 @@ enum Api { OPTIMISTIC = '/alert/optimistic', TRAIN_MODEL = '/alert/model/train', TEST_MODEL = '/alert/model/test', + BOTTOM_MODEL = '/alert/model/bottom/', } export function modelCardListApi(params?: ModelQueryParams) { return defHttp.get({ url: Api.MODEL_CARD_LIST, params }) @@ -35,4 +36,7 @@ export function calculateBackApi(id: any, params: any) { export const getOptimisticApi = (params: any) => defHttp.get({ url: Api.OPTIMISTIC, params }) export const trainModelApi = (params: any) => defHttp.post({ url: Api.TRAIN_MODEL, data: params }) + export const testModelApi = (params: any) => defHttp.post({ url: Api.TEST_MODEL, data: params }) + +export const bottomModelApi = (id: any) => defHttp.post({ url: Api.BOTTOM_MODEL + id }) diff --git a/src/views/model/train/index.vue b/src/views/model/train/index.vue index 6f1f8e3..5522c0e 100644 --- a/src/views/model/train/index.vue +++ b/src/views/model/train/index.vue @@ -29,6 +29,7 @@ import { pointTableSchema, sampleInfoTableSchema } from './data' import { BasicTable, useTable } from '@/components/Table' import { PageWrapper } from '@/components/Page' import { + bottomModelApi, modelInfoApi, testModelApi, trainModelApi, @@ -140,7 +141,7 @@ export default defineComponent({ async function getTestData() { const params = { - Model_id: 118, + Model_id: 530, version: model.value?.Cur_Version ? model.value?.Cur_Version : 'v-test', Test_Data: { time: historyTime.value @@ -479,16 +480,22 @@ export default defineComponent({ } function openPointModal(index, record) { + // 当前页 index + const pageIndex = index + // 全局 index + const globalIndex = model.value.pointInfo.findIndex( + item => item.pointId === record.pointId, + ) openEditPointModal.value = true pointEditRecord = record editForm.value = { - index, + index: globalIndex, Upper: record?.Upper ?? '', Lower: record?.Lower ?? '', lowerBound: record?.lowerBound ?? '', upperBound: record?.upperBound ?? '', - dead: record?.dead ?? false, - limit: record?.limit ?? true, + dead: !!record?.dead, + limit: !!record?.limit, } } @@ -595,6 +602,22 @@ export default defineComponent({ openEditModelModal.value = false } + async function bottomModel() { + if (!model.value.para) { + createMessage.error('模型未训练,无法下装') + return + } + try { + const response = await bottomModelApi(model.value.id) + model.value = response + createMessage.success('模型下装成功') + } + catch (error) { + console.error('底层模型获取失败:', error) + createMessage.error('底层模型获取失败') + } + } + return { pointTable, model, @@ -629,6 +652,7 @@ export default defineComponent({ openEditModel, handleEditModelOk, handleEditModelCancel, + bottomModel, } }, }) @@ -767,6 +791,7 @@ export default defineComponent({ 下装 From 961f103edec406b8c2cac1bb673b8e62a40dbcb2 Mon Sep 17 00:00:00 2001 From: CJL6015 <1253368419@qq.com> Date: Sun, 3 Aug 2025 14:48:16 +0800 Subject: [PATCH 5/6] update pnpm version in lockfile and Dockerfile to 10.14.0 --- pnpm-lock.yaml | 3 ++- scripts/Dockerfile | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc5e8fb..de1e011 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,7 +78,7 @@ importers: specifier: ^3.2.0 version: 3.2.0(pinia@2.1.7(typescript@5.2.2)(vue@3.3.8(typescript@5.2.2))) pnpm: - specifier: ^10.12.1 + specifier: ^10.7.0 version: 10.12.1 print-js: specifier: ^1.6.0 @@ -4765,6 +4765,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} diff --git a/scripts/Dockerfile b/scripts/Dockerfile index e335f48..3ab1d0f 100644 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -7,7 +7,7 @@ ENV PATH="$PNPM_HOME:$PATH" ENV NODE_OPTIONS=--max-old-space-size=8192 ENV TZ=Asia/Shanghai -RUN npm install -g pnpm@10.7.0 +RUN npm install -g pnpm@10.14.0 WORKDIR /app COPY . . From b12fa64f1e20ef0767dfc45f61ecb5a7b394da13 Mon Sep 17 00:00:00 2001 From: CJL6015 <1253368419@qq.com> Date: Sun, 3 Aug 2025 15:09:04 +0800 Subject: [PATCH 6/6] Update build scripts to use tsx and upgrade dependencies Replaces `esno` with `tsx` in build scripts for improved compatibility and performance. Adds `tsx` as a dependency and updates several optional and core dependencies, including `esbuild` to version 0.25.8. Ensures compatibility with Node.js 18+ and introduces support for additional platforms via updated optional dependencies. --- package.json | 7 +- pnpm-lock.yaml | 291 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 288 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 4617c97..ca9d14a 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "serve": "pnpm dev", "dev": "vite", "front": "vite --mode front", - "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts", - "build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts", - "build:static": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode static && esno ./build/script/postBuild.ts", + "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && tsx ./build/script/postBuild.ts", + "build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && tsx ./build/script/postBuild.ts", + "build:static": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode static && tsx ./build/script/postBuild.ts", "build:no-cache": "pnpm store prune && pnpm build", "report": "cross-env REPORT=true pnpm build", "type:check": "vue-tsc --noEmit --skipLibCheck", @@ -128,6 +128,7 @@ "stylelint-order": "^6.0.3", "stylelint-prettier": "^4.0.2", "terser": "^5.24.0", + "tsx": "^4.20.3", "typescript": "^5.2.2", "unocss": "^0.57.3", "vite": "^4.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de1e011..e4030b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,6 +258,9 @@ importers: terser: specifier: ^5.24.0 version: 5.24.0 + tsx: + specifier: ^4.20.3 + version: 4.20.3 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -1026,138 +1029,294 @@ packages: resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2716,6 +2875,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -3118,6 +3282,9 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} @@ -5079,8 +5246,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.1.1: - resolution: {integrity: sha512-zyPn5BFMB0TB5kMLbYPNx4x/oL/oSlaecdKCv6WeJ0TeSEfx8RTJWjuB5TZ2dSewktgfBsBO/HNA9mrMWqLXMA==} + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -6509,72 +6676,150 @@ snapshots: esquery: 1.5.0 jsdoc-type-pratt-parser: 4.0.0 + '@esbuild/aix-ppc64@0.25.8': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true + '@esbuild/android-arm64@0.25.8': + optional: true + '@esbuild/android-arm@0.18.20': optional: true + '@esbuild/android-arm@0.25.8': + optional: true + '@esbuild/android-x64@0.18.20': optional: true + '@esbuild/android-x64@0.25.8': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true + '@esbuild/darwin-arm64@0.25.8': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true + '@esbuild/darwin-x64@0.25.8': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true + '@esbuild/freebsd-arm64@0.25.8': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true + '@esbuild/freebsd-x64@0.25.8': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true + '@esbuild/linux-arm64@0.25.8': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true + '@esbuild/linux-arm@0.25.8': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true + '@esbuild/linux-ia32@0.25.8': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true + '@esbuild/linux-loong64@0.25.8': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true + '@esbuild/linux-mips64el@0.25.8': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true + '@esbuild/linux-ppc64@0.25.8': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true + '@esbuild/linux-riscv64@0.25.8': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true + '@esbuild/linux-s390x@0.25.8': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true + '@esbuild/linux-x64@0.25.8': + optional: true + + '@esbuild/netbsd-arm64@0.25.8': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true + '@esbuild/netbsd-x64@0.25.8': + optional: true + + '@esbuild/openbsd-arm64@0.25.8': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true + '@esbuild/sunos-x64@0.25.8': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true + '@esbuild/win32-arm64@0.25.8': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true + '@esbuild/win32-ia32@0.25.8': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true + '@esbuild/win32-x64@0.25.8': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.53.0)': dependencies: eslint: 8.53.0 @@ -8441,6 +8686,35 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + escalade@3.1.1: {} escape-string-regexp@1.0.5: {} @@ -8682,7 +8956,7 @@ snapshots: esno@4.0.0: dependencies: - tsx: 4.1.1 + tsx: 4.20.3 espree@9.6.1: dependencies: @@ -8946,6 +9220,10 @@ snapshots: call-bind: 1.0.5 get-intrinsic: 1.2.2 + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 @@ -10959,11 +11237,10 @@ snapshots: tslib@2.6.2: {} - tsx@4.1.1: + tsx@4.20.3: dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - source-map-support: 0.5.21 + esbuild: 0.25.8 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3