Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
2025-01-24 12:09:32 +09:00
32 changed files with 3529 additions and 600 deletions

View File

@@ -0,0 +1,7 @@
管理コード,ソフト名,ライセンス数
S000001,動画編集ソフトA,10
S000002,画像解析ソフトB,5
S000003,会計ソフト,4
S000004,開発用ソフト,10
S000005,SQLServer2019,3
S000006,Window11,12
1 管理コード ソフト名 ライセンス数
2 S000001 動画編集ソフトA 10
3 S000002 画像解析ソフトB 5
4 S000003 会計ソフト 4
5 S000004 開発用ソフト 10
6 S000005 SQLServer2019 3
7 S000006 Window11 12

View File

@@ -0,0 +1,4 @@
社員番号,氏名,メールアドレス,部署コード,部署名
0001,佐藤 太郎,sato@example.com,A001,制作部
0002,鈴木 花子,suzuki@example.com,A001,制作部
0003,田中 三郎,tanaka@example.com,A002,管理部
1 社員番号 氏名 メールアドレス 部署コード 部署名
2 0001 佐藤 太郎 sato@example.com A001 制作部
3 0002 鈴木 花子 suzuki@example.com A001 制作部
4 0003 田中 三郎 tanaka@example.com A002 管理部

View File

@@ -0,0 +1,5 @@
資産管理番号,資産名,管理責任者,設置場所
S001,タブレットA,○○ ○○,制作室
S002,プロジェクターB,○○ ○○,会議室
S003,PC1,○○ ○○,制作室
S004,PC2,○○ ○○,制作室
1 資産管理番号 資産名 管理責任者 設置場所
2 S001 タブレットA ○○ ○○ 制作室
3 S002 プロジェクターB ○○ ○○ 会議室
4 S003 PC1 ○○ ○○ 制作室
5 S004 PC2 ○○ ○○ 制作室

View File

@@ -17,5 +17,8 @@ declare module 'vue' {
PluginTableArea: typeof import('./src/components/basic/PluginTableArea.vue')['default']
PluginTableConditionRow: typeof import('./src/components/basic/PluginTableConditionRow.vue')['default']
PluginTableConnectRow: typeof import('./src/components/basic/PluginTableConnectRow.vue')['default']
TableCombobox: typeof import('./src/components/basic/TableCombobox.vue')['default']
TableCondition: typeof import('./src/components/basic/conditions/TableCondition.vue')['default']
TableConditionValue: typeof import('./src/components/basic/conditions/TableConditionValue.vue')['default']
}
}

View File

@@ -1,2 +1,8 @@
/// <reference types="vite/client" />
/// <reference types="kintone" />
/// <reference types="kintone" />
declare module '*.vue' {
import { DefineComponent } from 'vue';
const component: DefineComponent<{}, {}, any>;
export default component;
}

View File

@@ -9,8 +9,10 @@
"build": "vite build && npm run pkg",
"vite:build": "vite build",
"build-upload": "npm run build && npm run upload",
"build-up2":"npm run build && npm run upload2",
"pkg": "kintone-plugin-packer --ppk private.ppk --out dist/plugin.zip dist/src",
"upload": "kintone-plugin-uploader --base-url https://mfu07rkgnb7c.cybozu.com --username MXZ --password maxz1205 dist/plugin.zip "
"upload": "kintone-plugin-uploader --base-url https://mfu07rkgnb7c.cybozu.com --username MXZ --password maxz1205 dist/plugin.zip ",
"upload2": "kintone-plugin-uploader --base-url https://alicorn.cybozu.com --username maxz --password 7ld7i8vd dist/plugin.zip "
},
"dependencies": {
"@kintone/rest-api-client": "^5.7.0",

File diff suppressed because one or more lines are too long

View File

@@ -3,57 +3,116 @@
<p class="kintoneplugin-desc">{{ $t('config.desc') }}</p>
<plugin-row class="header-row border">
<plugin-input v-model="data.buttonName" label="集約ボタン名" />
<plugin-input v-model="data.buttonName" placeholder="集約" label="集約ボタン名" />
</plugin-row>
<div v-if="!loading">
<plugin-table-area :table="mainTable" :key="mainTable.id" />
<plugin-table-area v-for="joinTable in otherTables" :table="joinTable" :key="joinTable.id" />
<div id="main-area" ref="mainArea">
<plugin-table-area v-for="joinTable in data.joinTables" :table="joinTable" :key="joinTable.id" />
</div>
<plugin-row class="footer-row border">
<kuc-button text="キャンセル" type="normal" @click="cancel" />
<kuc-button text="保存する" class="save-btn" type="submit" @click="save" />
</plugin-row>
<kuc-spinner :container="mainArea" ref="spinner"></kuc-spinner>
</template>
<script setup lang="ts">
import { createEmptyJoinTable } from '@/js/helper';
import type { JoinTable, SavedData } from '@/types/model';
import { createEmptyJoinTable, loadApps, loadAppFieldsAndLayout, EMPTY_OPTION, getEmptyOnCondition } from '@/js/helper';
import { isType, type OneOf } from '@/js/kintone-rest-api-client';
import type { CachedData, FieldsInfo, JoinTable, SavedData } from '@/types/model';
import type { Spinner } from 'kintone-ui-component';
import { computed, onMounted, watch, provide, reactive, ref } from 'vue';
import { onMounted, watch, provide, reactive, ref, shallowRef, nextTick } from 'vue';
const props = defineProps<{ pluginId: string }>();
const loading = ref(true);
const loading = ref(false);
const data: SavedData = reactive({
buttonName: '',
joinTables: [] as JoinTable[],
joinTables: [createEmptyJoinTable()],
});
const cachedData: CachedData = reactive({
apps: [EMPTY_OPTION],
currentAppFields: { fields: {}, layout: [] } as FieldsInfo,
});
provide('savedData', data);
provide('cachedData', cachedData);
const mainArea = shallowRef<HTMLElement | null>(null);
const spinner = shallowRef<Spinner | null>(null);
onMounted(async () => {
const savedData = kintone.plugin.app.getConfig(props.pluginId);
data.buttonName = savedData?.buttonName || '集約';
data.joinTables = savedData ? JSON.parse(savedData.joinTables) : [createEmptyJoinTable(), createEmptyJoinTable(1)];
loading.value = false;
nextTick(async () => {
spinner.value?.close(); // fix bug: kuc-spinner will not auto amount to target HTML element when init loading
const savedData = kintone.plugin.app.getConfig(props.pluginId);
loading.value = true;
cachedData.apps = await loadApps();
cachedData.currentAppFields = await loadAppFieldsAndLayout();
if (savedData?.joinTablesForConfig) {
data.joinTables = JSON.parse(savedData.joinTablesForConfig);
}
data.buttonName = savedData?.buttonName || '集約';
loading.value = false;
});
});
const mainTable = computed(() => data.joinTables[0]);
const otherTables = computed(() => data.joinTables.slice(1));
watch(loading, (load) => {
load ? spinner.value?.open() : spinner.value?.close();
});
watch(
() => data.joinTables.length,
(newLength) => {
if (newLength === 1) {
data.joinTables[0].onConditions = [];
data.joinTables[0].onConditions = [getEmptyOnCondition()];
}
},
);
function save() {
const currentAppMeta = cachedData.currentAppFields.fields;
const convertJoinTables = JSON.parse(JSON.stringify(data.joinTables)) as JoinTable<OneOf | string>[];
convertJoinTables.forEach((item) => {
let meta = item.meta;
if (!meta) {
return;
}
if (item.table) {
const table = meta[item.table];
if (isType.SUBTABLE(table)) {
meta = table.fields;
}
}
// Process onConditions
item.onConditions.forEach((condition) => {
condition.leftField = meta[condition.leftField as string] || condition.leftField;
condition.rightField = currentAppMeta[condition.rightField as string] || condition.rightField;
});
// Process fieldsMapping
item.fieldsMapping.forEach((mapping) => {
mapping.leftField = meta[mapping.leftField as string] || mapping.leftField;
mapping.rightField = currentAppMeta[mapping.rightField as string] || mapping.rightField;
});
// Process whereConditions
item.whereConditions.forEach((condition) => {
condition.field = meta[condition.field as string] || condition.field;
});
delete item.meta;
});
data.joinTables.forEach((item) => {
delete item.meta;
});
kintone.plugin.app.setConfig({
buttonName: data.buttonName,
joinTables: JSON.stringify(data.joinTables || []),
joinTables: JSON.stringify(convertJoinTables),
joinTablesForConfig: JSON.stringify(data.joinTables || []),
});
}

View File

@@ -1,16 +1,19 @@
<template>
<div class="kintoneplugin-input-container flex-row">
<plugin-label v-if="label" :label="label" />
<kuc-dropdown className="kuc-text-input" :items="items" :value="modelValue" @change="updateValue" />
<kuc-combobox className="kuc-text-input" :items="items" :value="modelValue" @change="updateValue" :disabled="disabled"/>
</div>
</template>
<script setup lang="ts">
import type { KucEvent } from '@/types/my-kintone';
import type { ComboboxChangeEventDetail, DropdownItem } from 'kintone-ui-component';
import { defineProps, defineEmits } from 'vue';
const props = defineProps<{
label: string;
items: kintone.fieldTypes.DropDown['Item'][];
disabled: boolean;
items: DropdownItem[];
modelValue: string;
}>();
@@ -18,7 +21,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', value: string): void;
}>();
const updateValue = (event: kintone.Event) => {
emit('update:modelValue', event.detail.value);
const updateValue = ({ detail }: KucEvent<ComboboxChangeEventDetail>) => {
emit('update:modelValue', detail.value || '');
};
</script>

View File

@@ -1,23 +1,26 @@
<template>
<div class="kintoneplugin-input-container flex-row">
<plugin-label v-if="label" :label="label" />
<kuc-text className="kuc-text-input" :value="modelValue" @change="updateValue" />
<kuc-text :placeholder="placeholder" className="kuc-text-input" :value="modelValue" @change="updateValue" />
</div>
</template>
<script setup lang="ts">
import type { KucEvent } from '@/types/my-kintone';
import type { TextInputEventDetail } from 'kintone-ui-component';
import { defineProps, defineEmits } from 'vue';
const props = defineProps<{
label: string;
modelValue: string;
placeholder: string;
}>();
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void;
}>();
const updateValue = (event: kintone.Event) => {
emit('update:modelValue', event.detail.value);
const updateValue = ({ detail }: KucEvent<TextInputEventDetail>) => {
emit('update:modelValue', detail.value || '');
};
</script>

View File

@@ -14,7 +14,7 @@ const props = withDefaults(
defineProps<{
canAdd?: boolean;
canDelete?: boolean;
tableId: number;
tableId: string;
}>(),
{
canAdd: true,
@@ -25,7 +25,12 @@ const props = withDefaults(
const savedData = inject<SavedData>('savedData') as SavedData;
const onClick = (type: 'add' | 'remove') => {
if (type === 'add') {
savedData.joinTables.push(createEmptyJoinTable());
const currentIndex = savedData.joinTables.findIndex((t) => t.id === props.tableId);
if (currentIndex !== -1) {
savedData.joinTables.splice(currentIndex + 1, 0, createEmptyJoinTable());
} else {
savedData.joinTables.push(createEmptyJoinTable());
}
} else if (savedData.joinTables.length > 1) {
savedData.joinTables = savedData.joinTables.filter((t) => t.id !== props.tableId);
}

View File

@@ -1,23 +1,30 @@
<template>
<plugin-row class="table-area flex-row border">
<div class="table-main-area ">
<div class="table-main-area">
<plugin-row>
<plugin-dropdown label="取得元アプリ" :items="apps" v-model="table.app" />
<plugin-dropdown :disabled="false" label="取得元アプリ" :items="apps" v-model="table.app" />
</plugin-row>
<plugin-row>
<plugin-dropdown label="テーブル" :items="tables" v-model="table.table" />
<plugin-dropdown
:disabled="selectedAppData.loading"
label="テーブル"
:items="tableOptions"
v-model="table.table"
@change="selectTable"
:key="componentKey"
/>
</plugin-row>
<plugin-row class="flex-row" v-if="isJoinConditionShown(table)">
<plugin-label label="連結条件" />
<plugin-table-connect-row connector="=" v-model="table.onConditions" />
<plugin-table-connect-row connector="=" :modelValue="table.onConditions" />
</plugin-row>
<plugin-row class="flex-row">
<plugin-label label="取得フィールド" />
<plugin-table-connect-row connector="→" v-model="table.fieldsMapping" />
<plugin-table-connect-row connector="→" :modelValue="table.fieldsMapping" />
</plugin-row>
<plugin-row class="flex-row">
<plugin-label label="絞込条件" />
<plugin-table-condition-row v-model="table.whereConditions" />
<plugin-table-condition-row :modelValue="table.whereConditions"/>
</plugin-row>
</div>
<div class="table-action-area">
@@ -27,40 +34,74 @@
</template>
<script setup lang="ts">
import type { JoinTable, SavedData } from '@/types/model';
import { inject } from 'vue';
import {
EMPTY_OPTION,
getTableFieldsDropdownItems,
loadAppFieldsAndLayout,
resetConditions,
resetTable,
} from '@/js/helper';
import { types } from '@/js/kintone-rest-api-client';
import type { CachedData, CachedSelectedAppData, FieldsInfo, JoinTable, SavedData } from '@/types/model';
import { computed, inject, provide, reactive, ref, watch } from 'vue';
const savedData = inject<SavedData>('savedData') as SavedData;
const cachedData = inject<CachedData>('cachedData') as CachedData;
const props = defineProps<{ table: JoinTable }>();
const apps = [
{
label: '-------',
value: '',
const props = defineProps<{
table: JoinTable;
}>();
const apps = computed(() => cachedData.apps);
const tableOptions = ref([EMPTY_OPTION]);
const loading = ref(false);
const selectedAppData: CachedSelectedAppData = reactive({
appFields: { fields: {}, layout: [] } as FieldsInfo,
table: props.table,
loading: false,
});
provide('selectedAppData', selectedAppData);
const componentKey = ref(0);
// fix-bug: force select saved data when load config
watch(
() => tableOptions.value,
() => {
if (!props.table.table) return;
componentKey.value += 1;
},
{
label: 'lable 1',
value: 'value 1',
once: true,
},
{
label: 'lable 2',
value: 'value 2',
);
watch(
() => props.table.app,
async (newVal, oldVal) => {
if (!newVal) {
return;
}
loading.value = true;
const fields = await loadAppFieldsAndLayout(newVal);
tableOptions.value = getTableFieldsDropdownItems(fields, types.SUBTABLE);
selectedAppData.appFields = fields;
props.table.meta = fields.fields;
!!oldVal && resetTable(props.table);
loading.value = false;
},
];
const tables = [
{
label: '-------',
value: '-------',
{ immediate: true },
);
const selectTable = () => {
resetConditions(props.table);
};
watch(
() => !props.table.app || loading.value,
(val) => {
selectedAppData.loading = val;
},
{
label: 'tables 1',
value: 'tables 1',
},
{
label: 'tables 2',
value: 'tables 2',
},
];
);
const isJoinConditionShown = (table: JoinTable) => {
return savedData.joinTables[0].id !== table.id;

View File

@@ -1,79 +1,96 @@
<template>
<kuc-table :class-name.camel="['plugin-kuc-table']" :columns="columns" :data="modelValue" @change="changeRow"/>
<kuc-table :class-name.camel="['plugin-kuc-table']" :columns="columns" :data="modelValue" />
</template>
<script setup lang="ts">
import type { WhereCondition } from '@/types/model';
import { defineProps, defineEmits } from 'vue';
import { Dropdown } from 'kintone-ui-component/lib/dropdown';
import type { CachedData, CachedSelectedAppData, SavedData, WhereCondition } from '@/types/model';
import { defineProps, inject, computed, render, h, reactive } from 'vue';
import TableCombobox from './TableCombobox.vue';
import { generateId, getFieldsDropdownItems, search } from '@/js/helper';
import TableCondition from './conditions/TableCondition.vue';
import TableConditionValue from './conditions/TableConditionValue.vue';
const props = defineProps<{
modelValue: WhereCondition[];
}>();
const renderDropdown = (cellData: string) => {
const dropdown = new Dropdown({
items: [
{ label: 'John Brown', value: 'john' },
{ label: 'Steven Gerard', value: 'steven' },
],
value: cellData,
});
return dropdown;
};
const savedData = inject<SavedData>('savedData') as SavedData;
const cachedData = inject<CachedData>('cachedData') as CachedData;
const selectedAppData = inject<CachedSelectedAppData>('selectedAppData') as CachedSelectedAppData;
const table = computed(() => selectedAppData.table.table);
const renderCondition = (cellData: string) => {
const dropdown = new Dropdown({
items: [
{ label: 'John Brown', value: 'john' },
{ label: 'Steven Gerard', value: 'steven' },
],
value: cellData,
});
return dropdown;
};
const renderDynamicData = (cellData: string) => {
const dropdown = new Dropdown({
items: [
{ label: 'John Brown', value: 'john' },
{ label: 'Steven Gerard', value: 'steven' },
],
value: cellData,
});
return dropdown;
};
const columns = [
const columns = reactive([
{
title: '取得元アプリのフィールド',
field: 'field',
render: renderDropdown,
render: (cellData: string, rowData: WhereCondition) => {
if (!rowData.id) {
rowData.id = generateId();
}
const container = document.createElement('div');
const vnode = h(TableCombobox, {
items: computed(() =>
getFieldsDropdownItems(selectedAppData.appFields, {
subTableCode: table.value,
defaultLabel: 'すべてのレコード',
}),
),
modelValue: (search(props.modelValue, rowData.id) as WhereCondition)?.field || '',
selectedAppData,
dataList: props.modelValue,
id: rowData.id,
'onUpdate:modelValue': (data) => {
const obj = (data.obj as WhereCondition);
if (obj) {
obj.field = data.value;
obj.condition = '',
obj.data = '';
}
},
});
render(vnode, container);
return container;
},
},
{
title: '',
field: 'condition',
render: renderCondition,
render: (cellData: string, rowData: WhereCondition) => {
const container = document.createElement('div');
const vnode = h(TableCondition, {
modelValue: (search(props.modelValue, rowData.id) as WhereCondition)?.condition || '',
selectedAppData,
id: rowData.id,
whereConditions: props.modelValue,
'onUpdate:modelValue': ({obj, value}) => {
if (obj) {
obj.condition = value;
obj.data = '';
}
},
});
render(vnode, container);
return container;
},
},
{
title: '',
field: 'data',
render: renderDynamicData,
render: (cellData: string, rowData: WhereCondition) => {
const container = document.createElement('div');
const vnode = h(TableConditionValue, {
modelValue: (search(props.modelValue, rowData.id) as WhereCondition)?.data || '',
selectedAppData,
id: rowData.id,
whereConditions: props.modelValue,
'onUpdate:modelValue': ({obj, value}) => {
obj && (obj.data = value);
},
});
render(vnode, container);
return container;
},
},
];
]);
const leftFields = [] as kintone.fieldTypes.DropDown['Item'][];
const rightFields = [] as kintone.fieldTypes.DropDown['Item'][];
const emit = defineEmits<{
(e: 'update:modelValue', value: FieldsJoinMapping[]): void;
}>();
const changeRow = (item: FieldsJoinMapping, key: keyof FieldsJoinMapping, value: string) => {
};
const changeField = (item: FieldsJoinMapping, key: keyof FieldsJoinMapping, value: string) => {
item[key] = value;
emit('update:modelValue', props.modelValue);
};
</script>

View File

@@ -1,61 +1,79 @@
<template>
<kuc-table :class-name.camel="['plugin-kuc-table']" :columns="columns" :data="modelValue" @change="changeRow"/>
<kuc-table :class-name.camel="['plugin-kuc-table']" :columns="columns" :data="modelValue" />
</template>
<script setup lang="ts">
import type { FieldsJoinMapping } from '@/types/model';
import { defineProps, defineEmits } from 'vue';
import { Dropdown } from 'kintone-ui-component/lib/dropdown';
import type { CachedData, CachedSelectedAppData, FieldsJoinMapping, WhereCondition } from '@/types/model';
import { defineProps, inject, computed, reactive, render, h, watch } from 'vue';
import { generateId, getFieldsDropdownItems, search } from '@/js/helper';
import TableCombobox from './TableCombobox.vue';
const props = defineProps<{
connector: string;
modelValue: FieldsJoinMapping[];
}>();
const renderDropdown = (cellData: string) => {
const dropdown = new Dropdown({
items: [
{ label: 'John Brown', value: 'john' },
{ label: 'Steven Gerard', value: 'steven' },
],
value: cellData,
});
return dropdown;
};
const renderConnector = () => {
return props.connector;
};
const cachedData = inject<CachedData>('cachedData') as CachedData;
const selectedAppData = inject<CachedSelectedAppData>('selectedAppData') as CachedSelectedAppData;
const table = computed(() => selectedAppData.table.table);
const columns = [
const columns = reactive([
{
title: '取得元アプリのフィールド',
field: 'leftField',
render: renderDropdown,
render: (cellData: string, rowData: WhereCondition) => {
if (!rowData.id) {
rowData.id = generateId();
}
const container = document.createElement('div');
const vnode = h(TableCombobox, {
items: computed(() =>
getFieldsDropdownItems(selectedAppData.appFields, { subTableCode: table.value, filterType: undefined }),
),
modelValue: (search(props.modelValue, rowData.id) as FieldsJoinMapping)?.leftField || '',
selectedAppData,
dataList: props.modelValue,
id: rowData.id,
'onUpdate:modelValue': (data) => {
if (data.obj) {
(data.obj as FieldsJoinMapping).leftField = data.value;
}
},
});
render(vnode, container);
return container;
},
},
{
title: '',
field: 'connector',
render: renderConnector,
render: () => {
return props.connector;
},
},
{
title: 'このアプリのフィールド',
field: 'rightField',
render: renderDropdown,
render: (cellData: string, rowData: WhereCondition) => {
if (!rowData.id) {
rowData.id = generateId();
}
const container = document.createElement('div');
const vnode = h(TableCombobox, {
items: computed(() => getFieldsDropdownItems(cachedData.currentAppFields, { filterType: undefined })),
modelValue: (search(props.modelValue, rowData.id) as FieldsJoinMapping)?.rightField || '',
selectedAppData,
dataList: props.modelValue,
id: rowData.id,
'onUpdate:modelValue': (data) => {
if (data.obj) {
(data.obj as FieldsJoinMapping).rightField = data.value;
}
},
});
render(vnode, container);
return container;
},
},
];
const leftFields = [] as kintone.fieldTypes.DropDown['Item'][];
const rightFields = [] as kintone.fieldTypes.DropDown['Item'][];
const emit = defineEmits<{
(e: 'update:modelValue', value: FieldsJoinMapping[]): void;
}>();
const changeRow = (item: FieldsJoinMapping, key: keyof FieldsJoinMapping, value: string) => {
};
const changeField = (item: FieldsJoinMapping, key: keyof FieldsJoinMapping, value: string) => {
item[key] = value;
emit('update:modelValue', props.modelValue);
};
]);
</script>

View File

@@ -0,0 +1,51 @@
<template>
<kuc-combobox
:items="items.value"
:value="modelValue"
@change="updateValue"
:key="componentKey"
:disabled="selectedAppData.loading == undefined ? false : selectedAppData.loading"
/>
</template>
<script setup lang="ts">
import { search } from '@/js/helper';
import type { CachedSelectedAppData } from '@/types/model';
import type { KucEvent } from '@/types/my-kintone';
import type { ComboboxChangeEventDetail, DropdownItem } from 'kintone-ui-component';
import { defineProps, defineEmits, type Ref, watch, ref } from 'vue';
const props = defineProps<{
items: Ref<DropdownItem[]>;
modelValue: string;
dataList: any[];
id: string;
selectedAppData: CachedSelectedAppData;
}>();
const componentKey = ref(0);
// fix-bug: force select saved data when load config
watch(
() => props.items.value,
() => {
if (!props.modelValue) return;
componentKey.value += 1;
},
{
once: true,
},
);
type EmitData = {
obj?: any;
value: string;
};
const emit = defineEmits<{
(e: 'update:modelValue', data: EmitData): void;
}>();
const updateValue = ({ detail }: KucEvent<ComboboxChangeEventDetail>) => {
emit('update:modelValue', { obj: search(props.dataList, props.id), value: detail.value || '' });
};
</script>

View File

@@ -0,0 +1,42 @@
<template>
<kuc-combobox
v-if="items?.length"
:items="items"
:value="modelValue"
@change="updateValue"
:disabled="selectedAppData.loading == undefined ? false : selectedAppData.loading"
/>
</template>
<script setup lang="ts">
import { getAvailableCondition, type ConditionValue } from '@/js/conditions';
import { search } from '@/js/helper';
import type { CachedSelectedAppData, WhereCondition } from '@/types/model';
import type { KucEvent } from '@/types/my-kintone';
import type { ComboboxChangeEventDetail } from 'kintone-ui-component';
import { defineProps, defineEmits, computed } from 'vue';
const props = defineProps<{
modelValue: string;
selectedAppData: CachedSelectedAppData;
whereConditions: WhereCondition[];
id: string;
}>();
const whereCondition = computed(() => search(props.whereConditions, props.id) as WhereCondition | undefined);
const items = computed(() => getAvailableCondition(whereCondition.value?.field || '', props.selectedAppData.appFields));
type EmitData = {
obj?: WhereCondition;
value: ConditionValue;
};
const emit = defineEmits<{
(e: 'update:modelValue', data: EmitData): void;
}>();
const updateValue = ({ detail }: KucEvent<ComboboxChangeEventDetail>) => {
emit('update:modelValue', { obj: whereCondition.value, value: detail.value as ConditionValue });
};
</script>

View File

@@ -0,0 +1,47 @@
<template>
<kuc-text
v-if="type == 'kuc-text'"
:value="modelValue"
@change="updateValue"
:disabled="selectedAppData.loading == undefined ? false : selectedAppData.loading"
/>
<kuc-combobox
v-if="type == 'kuc-combobox'"
:value="modelValue"
@change="updateValue"
:disabled="selectedAppData.loading == undefined ? false : selectedAppData.loading"
/>
</template>
<script setup lang="ts">
import { getComponent } from '@/js/conditions';
import { search } from '@/js/helper';
import type { CachedSelectedAppData, WhereCondition } from '@/types/model';
import type { KucEvent } from '@/types/my-kintone';
import type { ComboboxChangeEventDetail, TextInputEventDetail } from 'kintone-ui-component';
import { defineProps, defineEmits, computed } from 'vue';
const props = defineProps<{
modelValue: string;
selectedAppData: CachedSelectedAppData;
whereConditions: WhereCondition[];
id: string;
}>();
const whereCondition = computed(() => search(props.whereConditions, props.id) as WhereCondition | undefined);
const type = computed(() => getComponent(whereCondition.value?.condition || ''));
type EmitData = {
obj?: WhereCondition;
value: string;
};
const emit = defineEmits<{
(e: 'update:modelValue', data: EmitData): void;
}>();
const updateValue = (event: KucEvent<ComboboxChangeEventDetail | TextInputEventDetail>) => {
emit('update:modelValue', { obj: whereCondition.value, value: event.detail.value || '' });
};
</script>

View File

@@ -24,12 +24,27 @@
padding-left: 20px;
line-height: 40px;
}
/* laebl input 单的情况 */
/* laebl input 单的情况 */
.flex-row .kintoneplugin-label {
margin: 0;
width: 10em;
}
/* 遮罩 */
#main-area {
position: relative;
}
#main-area .kuc-spinner-1-18-0__mask {
position: absolute;
background-color: white;
}
#main-area .kuc-spinner-1-18-0__spinner {
position: absolute;
}
#main-area .kuc-spinner-1-18-0__spinner__loader {
fill: #3498db;
}
/* 表格内容垂直居中 */
.table-area {
margin: 0;
@@ -64,6 +79,7 @@
.kuc-text-input {
--kuc-text-input-width: max(15vw, 200px);
--kuc-dropdown-toggle-width: max(15vw, 200px);
--kuc-combobox-toggle-width: max(15vw, 200px);
}
/* 统一 kintone +/- 按钮样式 */

View File

@@ -0,0 +1,49 @@
import type { SavedData } from "@/types/model";
import type { Button } from "kintone-ui-component";
export class KintoneIndexEventHandler {
private config: SavedData;
constructor(config: SavedData) {
this.config = config;
}
public init(): void {
this.addButtonToView();
}
// ボタン追加
private addButtonToView(): void {
const headerSpace = kintone.app.getHeaderMenuSpaceElement();
if (!headerSpace){
throw new Error('このページではヘッダー要素が利用できません。');
};
// ボタン追加
if (document.getElementById('btn-data-fetch')) return;
const kuc = Kucs['1.18.0'];
const button = new kuc.Button({
text: this.config.buttonName,
type:"submit",
id:'btn-data-fetch',
});
// const button = document.createElement('button');
// button.id = 'btn-data-fetch';
// button.textContent = this.config.buttonName;
// button.style.margin = '0 8px';
button.addEventListener('click', () => this.handleButtonClick());
headerSpace.appendChild(button);
}
// ボタンクリック
private async handleButtonClick(): Promise<void> {
try {
console.log('Button clicked! Starting data processing...');
alert('データ取得開始');
} catch (error) {
console.error('Error during data processing:', error);
}
}
}

View File

@@ -0,0 +1,57 @@
import type { FieldsInfo } from '@/types/model';
import type { FieldType } from './kintone-rest-api-client';
// conditionValue = '' | 'eq' | 'ne'
// conditionItem = { value: 'eq', label: '=(等しい)', type: 'input', func: (a: string, b: string) => a === b }
// = conditionMap[conditionValue]
export type ConditionValue = '' | 'eq' | 'ne' | 'test';
type ConditionItem = {
value: ConditionValue;
label: string;
type: ComponentType;
func: (a: string, b: string) => boolean;
};
export const conditionList: ConditionItem[] = [
{ value: '', label: '--------', type: '', func: (a: string, b: string) => true },
{ value: 'eq', label: '=(等しい)', type: 'input', func: (a: string, b: string) => a === b },
{ value: 'ne', label: '≠ (等しくない)', type: 'input', func: (a: string, b: string) => a !== b },
{ value: 'test', label: 'test combobox', type: 'select', func: (a: string, b: string) => a < b },
];
// search from conditionList
// conditionItem = conditionMap[conditionValue]
export const conditionMap: Record<ConditionValue, ConditionItem> = conditionList.reduce(
(map, item) => {
map[item.value] = item;
return map;
},
{} as Record<ConditionValue, ConditionItem>,
);
type FieldConditions = Partial<Record<FieldType, ConditionValue[]>>;
// FieldType -> ConditionValue[]
const fieldConditions: FieldConditions = {
SINGLE_LINE_TEXT: ['eq', 'ne'],
NUMBER: ['ne', 'test'],
} as const;
// fieldCode -> conditionList: ConditionItem[]
export const getAvailableCondition = (fieldCode: string, { fields }: FieldsInfo) => {
if (!fieldCode || !fields) return;
const conditions = fieldConditions[fields[fieldCode]?.type] || [];
return conditions.map((condition) => conditionMap[condition]);
};
const component = {
'': undefined,
input: 'kuc-text',
select: 'kuc-combobox',
};
export type ComponentType = keyof typeof component;
export const getComponent = (value: ConditionValue) => {
if (!value) return;
return component[conditionMap[value].type];
};

View File

@@ -1,22 +1,28 @@
import { KintoneIndexEventHandler } from "./KintoneIndexEventHandler";
(function (PLUGIN_ID) {
kintone.events.on('app.record.index.show', () => {
const spaceEl = kintone.app.getHeaderSpaceElement();
if (spaceEl === null) {
throw new Error('The header element is unavailable on this page.');
}
const fragment = document.createDocumentFragment();
const headingEl = document.createElement('h3');
const messageEl = document.createElement('p');
kintone.events.on('app.record.index.show', (event) => {
const config = kintone.plugin.app.getConfig(PLUGIN_ID);
messageEl.textContent = config.message;
messageEl.classList.add('plugin-space-message');
headingEl.textContent = 'Hello kintone plugin!';
headingEl.classList.add('plugin-space-heading');
const handler = new KintoneIndexEventHandler(config);
handler.init();
// const spaceEl = kintone.app.getHeaderSpaceElement();
// if (spaceEl === null) {
// throw new Error('The header element is unavailable on this page.');
// }
fragment.appendChild(headingEl);
fragment.appendChild(messageEl);
spaceEl.appendChild(fragment);
// const fragment = document.createDocumentFragment();
// const headingEl = document.createElement('h3');
// const messageEl = document.createElement('p');
// const config = kintone.plugin.app.getConfig(PLUGIN_ID);
// messageEl.textContent = config.message;
// messageEl.classList.add('plugin-space-message');
// headingEl.textContent = 'Hello kintone plugin!';
// headingEl.classList.add('plugin-space-heading');
// fragment.appendChild(headingEl);
// fragment.appendChild(messageEl);
// spaceEl.appendChild(fragment);
return event;
});
})(kintone.$PLUGIN_ID);

View File

@@ -0,0 +1,11 @@
import type { FieldType } from "./kintone-rest-api-client";
const availableJoinType: FieldType[] = [
'SINGLE_LINE_TEXT',
'NUMBER',
'CALC',
'DATE',
'TIME',
'DATETIME',
'LINK'
] as const

View File

@@ -1,16 +1,127 @@
import type { JoinTable } from '@/types/model';
import type { FieldsInfo, FieldsJoinMapping, JoinTable, WhereCondition } from '@/types/model';
import { client, isType, type FieldType, type App, type Layout } from './kintone-rest-api-client';
import type { DropdownItem } from 'kintone-ui-component';
export const condition = {
unset: '',
eq: '=',
};
export function createEmptyJoinTable(id = Number(new Date())) {
return {
id,
app: '',
table: '',
onConditions: [{ leftField: '', rightField: '' }],
fieldsMapping: [{ leftField: '', rightField: '' }],
whereConditions: [{ field: '', condition: condition.unset, data: '' }],
} as JoinTable;
export const EMPTY_OPTION = {
value: '',
label: '--------',
} as DropdownItem;
export function generateId(): string {
const timestamp = new Date().getTime().toString(36);
const randomNum = Math.random().toString(36).substring(2, 11);
return `${timestamp}-${randomNum}`;
}
export function search(list: Array<WhereCondition|FieldsJoinMapping>, id: string) {
return list.find(item => item.id === id);
}
export const getEmptyWhereCondition = () => ({ field: '', condition: '', data: '', id: generateId()} as WhereCondition);
export const getEmptyOnCondition = () => ({ leftField: '', rightField: '', id: generateId() } as FieldsJoinMapping);
export const getEmptyFieldsMapping = () => ({ leftField: '', rightField: '', id: generateId() } as FieldsJoinMapping);
export function createEmptyJoinTable(id = generateId()) {
return resetTable({ id, app: '' } as JoinTable);
}
export function resetTable(table: JoinTable) {
table.table = '';
return resetConditions(table);
}
export function resetConditions(table: JoinTable) {
table.onConditions = [getEmptyOnCondition()];
table.fieldsMapping = [getEmptyFieldsMapping()];
table.whereConditions = [getEmptyWhereCondition()];
return table;
}
const LIMIT = 100; // 每次请求的最大应用数量
export const loadApps = async (offset = 0, _apps: DropdownItem[] = []): Promise<DropdownItem[]> => {
const { apps } = await client.app.getApps({ limit: LIMIT, offset });
const allApps: DropdownItem[] = [
..._apps,
...apps.map((app: App) => ({ value: app.appId, label: app.name + 'ID: ' + app.appId + '' })),
];
if (apps.length === LIMIT) {
return loadApps(offset + LIMIT, allApps);
}
allApps.sort((a, b) => Number(b.value) - Number(a.value));
allApps.unshift(EMPTY_OPTION);
return allApps;
};
export const loadAppFieldsAndLayout = async (appId: string | number = kintone.app.getId() as number) => {
return {
fields: (await client.app.getFormFields({ app: appId })).properties,
layout: (await client.app.getFormLayout({ app: appId })).layout,
} as FieldsInfo;
};
type Param = { subTableCode?: string; filterType?: FieldType; defaultLabel?: string };
export const getFieldsDropdownItems = (
{ fields, layout }: FieldsInfo,
{ subTableCode, filterType, defaultLabel }: Param = {},
) => {
// get used field codes
let fieldOrder: string[];
let fieldMap = fields;
if (subTableCode) {
const subTableFields = layout.find((each) => each.type === 'SUBTABLE' && each.code === subTableCode) as any;
fieldOrder = subTableFields?.fields.map((field: { code: string }) => field.code) || [];
const subTableFieldMap = fieldMap[subTableCode] as { fields: Record<string, any> } | undefined;
fieldMap = subTableFieldMap?.fields || {};
} else {
fieldOrder = extractNoSubTableFields(layout);
}
// create labels
const labels = [
{
value: EMPTY_OPTION.value,
label: defaultLabel || EMPTY_OPTION.label,
},
];
return fieldOrder.reduce((acc, fieldCode) => {
const field = fieldMap[fieldCode];
if (!fieldCode || (filterType && !isType[filterType](field))) return acc;
acc.push({
value: fieldCode,
label: field.label + 'FC: ' + fieldCode + '',
});
return acc;
}, labels);
};
export const getTableFieldsDropdownItems = ({ fields }: FieldsInfo, filterType?: FieldType) => {
return Object.keys(fields).reduce(
(acc, fieldCode) => {
const field = fields[fieldCode];
if (filterType && !isType[filterType](field)) return acc;
acc.push({
value: fieldCode,
label: field.label + 'FC: ' + fieldCode + '',
});
return acc;
},
[EMPTY_OPTION],
);
};
const extractNoSubTableFields = (layout: Layout) => {
return layout.reduce((acc, each) => {
if (each.type === 'SUBTABLE') {
return acc;
} else if (each.type === 'ROW') {
acc.push(...each.fields.map((field: any) => field.code));
} else if (each.type === 'GROUP') {
acc.push(...extractNoSubTableFields(each.layout));
}
return acc;
}, [] as string[]);
};
// if (isType.SUBTABLE(field)) {
// console.log(field.fields);
// }

View File

@@ -1,209 +0,0 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.KintoneConfigHelper = {})));
}(this, (function (exports) { 'use strict';
var ALL_FIELD_TYPES = [
"SINGLE_LINE_TEXT",
"MULTI_LINE_TEXT",
"RICH_TEXT",
"NUMBER",
"CALC",
"RADIO_BUTTON",
"CHECK_BOX",
"MULTI_SELECT",
"DROP_DOWN",
"DATE",
"TIME",
"DATETIME",
"FILE",
"LINK",
"USER_SELECT",
"ORGANIZATION_SELECT",
"GROUP_SELECT",
"REFERENCE_TABLE",
"SPACER",
"GROUP",
"SUBTABLE",
"RECORD_NUMBER",
"CREATOR",
"CREATED_TIME",
"MODIFIER",
"UPDATED_TIME"
];
function createKintoneClient(kintone) {
function fetchFormInfoByFields() {
var url = kintone.api.url("/k/v1/preview/app/form/fields", true);
var body = {
app: kintone.app.getId()
};
return kintone.api(url, "GET", body).then(function (resp) {
return resp.properties;
});
}
function fetchFormInfoByLayout() {
var url = kintone.api.url("/k/v1/preview/app/form/layout", true);
var body = {
app: kintone.app.getId()
};
return kintone.api(url, "GET", body).then(function (resp) {
return resp.layout;
});
}
return {
fetchFormInfoByFields: fetchFormInfoByFields,
fetchFormInfoByLayout: fetchFormInfoByLayout
};
}
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed 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
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
t[p[i]] = s[p[i]];
return t;
}
var NOT_EXIST_MESSAGE = "Either the specified field type does not exist, or this method cannot respond the specified field type.";
var NOT_MATCH_MESSAGE = "Specify either characters or an array of characters for the getAllFields parameter.";
function createGetFields(kintoneClient, Promise_) {
var Promise = Promise_;
var fetchFormInfoByFields = kintoneClient.fetchFormInfoByFields, fetchFormInfoByLayout = kintoneClient.fetchFormInfoByLayout;
function removeUnnecessaryProperties(field) {
var _ = field.size, rest = __rest(field, ["size"]);
return rest;
}
function getFieldInfo(layoutFields) {
return layoutFields
.filter(function (layout) { return layout.type !== "LABEL" && layout.type !== "HR"; })
.map(function (field) { return removeUnnecessaryProperties(field); });
}
function modifiedLayoutResp(layoutList) {
return layoutList.reduce(function (acc, layout) {
switch (layout.type) {
case "ROW":
return acc.concat(getFieldInfo(layout.fields));
case "GROUP":
return acc.concat([
{ type: layout.type, code: layout.code }
], layout.layout
.map(function (childLayout) { return getFieldInfo(childLayout.fields); })
.reduce(function (acc, cur) { return acc.concat(cur); }, []));
case "SUBTABLE":
var layoutFieldsIncludeSubtableCode = layout.fields.map(function (layoutField) { return (__assign({}, layoutField, { subtableCode: layout.code })); });
return acc.concat([
{ type: layout.type, code: layout.code }
], getFieldInfo(layoutFieldsIncludeSubtableCode));
}
}, []);
}
function getLabeledFields(fieldsResp) {
return Object.keys(fieldsResp).reduce(function (acc, key) {
var _a;
var field = fieldsResp[key];
if (field.type === "SUBTABLE") {
return __assign({}, acc, getLabeledFields(field.fields));
}
return field.label ? __assign({}, acc, (_a = {}, _a[field.code] = field.label, _a)) : acc;
}, {});
}
function addLabel(layoutFieldList, fieldsResp) {
var labeledFields = getLabeledFields(fieldsResp);
return layoutFieldList.map(function (layoutField) {
return labeledFields[layoutField.code]
? __assign({}, layoutField, { label: labeledFields[layoutField.code] }) : layoutField;
});
}
function getLookupFieldKeys(fieldsResp) {
return Object.keys(fieldsResp).filter(function (key) { return typeof fieldsResp[key].lookup !== "undefined"; });
}
function filterLookupField(layoutFieldList, fieldsResp) {
var lookupFieldKeys = getLookupFieldKeys(fieldsResp);
if (lookupFieldKeys.length === 0)
;
return layoutFieldList.filter(function (layoutField) {
return !lookupFieldKeys.some(function (key) { return fieldsResp[key].code === layoutField.code; });
});
}
function flattenFieldsForSubtable(fieldsResp) {
return Object.keys(fieldsResp).reduce(function (fields, key) {
var _a, _b;
if (fieldsResp[key].type === "SUBTABLE") {
return __assign({}, fields, (_a = {}, _a[key] = fieldsResp[key], _a), fieldsResp[key].fields);
}
return __assign({}, fields, (_b = {}, _b[key] = fieldsResp[key], _b));
}, {});
}
function fetchAllFields(selectFieldTypes) {
return Promise.all([fetchFormInfoByFields(), fetchFormInfoByLayout()]).then(function (_a) {
var fieldsResp = _a[0], layoutResp = _a[1];
var fieldList = addLabel(filterLookupField(modifiedLayoutResp(layoutResp), flattenFieldsForSubtable(fieldsResp)), fieldsResp);
return selectFieldTypes
? fieldList.filter(function (field) { return selectFieldTypes.indexOf(field.type) !== -1; })
: fieldList;
});
}
function validateFieldType(fieldType) {
return ALL_FIELD_TYPES.some(function (type) { return type === fieldType; });
}
function validateGetAllFieldsArgument(fieldType) {
if (typeof fieldType === "string") {
return validateFieldType(fieldType) ? null : NOT_EXIST_MESSAGE;
}
if (Array.isArray(fieldType)) {
return fieldType.every(validateFieldType) ? null : NOT_EXIST_MESSAGE;
}
return NOT_MATCH_MESSAGE;
}
function getFields(selectFieldType) {
if (typeof selectFieldType === "undefined") {
return fetchAllFields();
}
var error = validateGetAllFieldsArgument(selectFieldType);
if (error) {
return Promise.reject(new Error(error));
}
return fetchAllFields(Array.isArray(selectFieldType) ? selectFieldType : [selectFieldType]);
}
return getFields;
}
var kintone = window.kintone;
var kintoneClient = createKintoneClient(kintone);
var getFields = createGetFields(kintoneClient, kintone.Promise);
exports.getFields = getFields;
Object.defineProperty(exports, '__esModule', { value: true });
})));

View File

@@ -0,0 +1,62 @@
import { KintoneRestAPIClient } from '@kintone/rest-api-client';
export const client = new KintoneRestAPIClient();
export type App = {
appId: string;
name: string;
};
export type Properties = Awaited<ReturnType<typeof client.app.getFormFields>>['properties'];
export type Layout = Awaited<ReturnType<typeof client.app.getFormLayout>>['layout'];
export type OneOf = Properties[string];
export type FieldType = OneOf['type'];
const typeNames = [
'RECORD_NUMBER',
'CREATOR',
'CREATED_TIME',
'MODIFIER',
'UPDATED_TIME',
'CATEGORY',
'STATUS',
'STATUS_ASSIGNEE',
'SINGLE_LINE_TEXT',
'NUMBER',
'CALC',
'MULTI_LINE_TEXT',
'RICH_TEXT',
'LINK',
'CHECK_BOX',
'RADIO_BUTTON',
'DROP_DOWN',
'MULTI_SELECT',
'FILE',
'DATE',
'TIME',
'DATETIME',
'USER_SELECT',
'ORGANIZATION_SELECT',
'GROUP_SELECT',
'GROUP',
'REFERENCE_TABLE',
'SUBTABLE',
] as const satisfies readonly FieldType[];
export const types = typeNames.reduce(
(acc, name) => {
acc[name] = name;
return acc;
},
{} as Record<(typeof typeNames)[number], (typeof typeNames)[number]>,
);
type ExtractOneOf<T extends FieldType> = Extract<OneOf, { type: T }>;
function createTypeGuard<T extends FieldType>(type: T) {
return (value: OneOf): value is ExtractOneOf<T> => value.type === type;
}
export const isType = Object.fromEntries(
typeNames.map((typeName) => [typeName, createTypeGuard(typeName as FieldType)]),
) as { [K in (typeof typeNames)[number]]: (value: OneOf) => value is ExtractOneOf<K> };

View File

@@ -5,6 +5,7 @@
"type": "APP",
"desktop": {
"js": [
"js/kuc.min.js",
"js/desktop.js"
],
"css": [
@@ -16,14 +17,14 @@
"config": {
"html": "html/config.html",
"js": [
"js/config.js"
"js/config.js"
],
"css": [
"css/51-modern-default.css",
"css/config.css"
],
"required_params": [
"message"
"buttonName"
]
},
"name": {
@@ -36,6 +37,7 @@
},
"mobile": {
"js": [
"js/kuc.min.js",
"js/mobile.js"
],
"css": [

View File

@@ -0,0 +1,6 @@
declare global {
const Kucs: {
[version: string]: any;
};
}
export {};

View File

@@ -1,45 +0,0 @@
// https://cybozu.dev/ja/kintone/docs/overview/field-types/
// https://cybozudev.kf5.com/hc/kb/article/201593/
declare namespace kintone.fieldTypes {
interface Table {
type: 'SUBTABLE';
value: any;
}
interface DropDown {
Item: {
label: string,
value: string,
disabled?: boolean
}
}
}
declare namespace kintone {
interface Event {
detail: {
value: string;
};
}
}
// lookup https://cybozudev.kf5.com/hc/kb/article/1611088/
// import { KintoneRestAPIClient } from '@kintone/rest-api-client';
// // 定义了一个Lookup类型其中给lookup设置的是对象类型
// // 下面还有展开,到具体用的时候还会定义的更详细,这里够用了
// export type Lookup = {
// label: string;
// code: string;
// lookup: object;
// };
// // 创建sdk客户端
// const client = new KintoneRestAPIClient({
// baseUrl: 'https://yourdomain.cybozu.cn',
// });
// // 获取一个应用中所有类型是Lookup的字段
// export const getFormSetting = async () => {
// const prop = (await client.app.getFormFields({ app: kintone.app.getId() as number })).properties;
// const lookUpFields = Object.values(prop).filter((f) => 'lookup' in f) as Lookup[];
// return lookUpFields;
// };

View File

@@ -1,27 +1,48 @@
import { condition } from './helper';
import type { ConditionValue } from '@/js/conditions';
import type { Layout, Properties } from '@/js/kintone-rest-api-client';
import type { DropdownItem } from 'kintone-ui-component';
export interface FieldsJoinMapping {
leftField: string;
rightField: string;
export interface FieldsJoinMapping<FieldType = string> {
id: string;
leftField: FieldType;
rightField: FieldType;
}
export interface WhereCondition {
field: string;
condition: (typeof condition)[keyof typeof condition];
export interface WhereCondition<FieldType = string> {
id: string;
field: FieldType;
condition: ConditionValue;
data: string;
}
export interface JoinTable {
id: number; // 用于唯一区分
export interface JoinTable<FieldType = string> {
id: string;
app: string; // 取得元アプリ
table: string; // テーブル
onConditions: FieldsJoinMapping[]; // 連結条件
fieldsMapping: FieldsJoinMapping[]; // 取得フィールド
whereConditions: WhereCondition[]; // 絞込条件
onConditions: FieldsJoinMapping<FieldType>[]; // 連結条件
fieldsMapping: FieldsJoinMapping<FieldType>[]; // 取得フィールド
whereConditions: WhereCondition<FieldType>[]; // 絞込条件
meta?: Properties;
}
// 存储的数据格式
export interface SavedData {
buttonName: string;
joinTables: JoinTable[];
}
}
export interface FieldsInfo {
fields: Properties;
layout: Layout;
}
export interface CachedData {
apps: DropdownItem[],
currentAppFields: FieldsInfo,
}
export interface CachedSelectedAppData {
appFields: FieldsInfo,
loading: boolean,
table: JoinTable,
}

View File

@@ -0,0 +1,3 @@
export interface KucEvent<T> {
detail: T;
}

View File

@@ -53,7 +53,8 @@ export default defineConfig({
targets: [
{ src: 'dist/index.html', dest: 'dist/src/html', rename: 'config.html' },
{ src: 'src/manifest.json', dest: 'dist/src' },
{ src: 'src/assets/*', dest: 'dist/src/image' },
{ src: 'src/assets/*.js', dest: 'dist/src/js' },
{ src: 'src/assets/*.png', dest: 'dist/src/image' },
{ src: 'src/css/*', dest: 'dist/src/css' },
],
hook: 'writeBundle' // 指定在何时复制文件
@@ -74,11 +75,11 @@ export default defineConfig({
},
output: {
entryFileNames: (chunkInfo) => {
// console.log(chunkInfo);
return 'src/js/[name].js'; // 默认处理为 JS 文件
return 'src/js/[name].js'; // 默认处理为 JS 文件
},
assetFileNames: 'src/[ext]/[name].[ext]',
}
}
},
},
sourcemap:'inline',
}
})

View File

@@ -26,7 +26,7 @@
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz"
integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
"@babel/parser@^7.15.8", "@babel/parser@^7.25.3":
"@babel/parser@^7.25.3":
version "7.26.3"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz"
integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==
@@ -74,6 +74,121 @@
globals "^15.13.0"
typescript-eslint "^8.17.0"
"@esbuild/aix-ppc64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c"
integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==
"@esbuild/android-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0"
integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==
"@esbuild/android-arm@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810"
integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==
"@esbuild/android-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705"
integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==
"@esbuild/darwin-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd"
integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==
"@esbuild/darwin-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107"
integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==
"@esbuild/freebsd-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7"
integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==
"@esbuild/freebsd-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93"
integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==
"@esbuild/linux-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75"
integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==
"@esbuild/linux-arm@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d"
integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==
"@esbuild/linux-ia32@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb"
integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==
"@esbuild/linux-loong64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c"
integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==
"@esbuild/linux-mips64el@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3"
integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==
"@esbuild/linux-ppc64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e"
integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==
"@esbuild/linux-riscv64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25"
integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==
"@esbuild/linux-s390x@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319"
integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==
"@esbuild/linux-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef"
integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==
"@esbuild/netbsd-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c"
integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==
"@esbuild/openbsd-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2"
integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==
"@esbuild/openbsd-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf"
integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==
"@esbuild/sunos-x64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4"
integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==
"@esbuild/win32-arm64@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b"
integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==
"@esbuild/win32-ia32@0.24.0":
version "0.24.0"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103"
integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==
"@esbuild/win32-x64@0.24.0":
version "0.24.0"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz"
@@ -454,7 +569,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -486,7 +601,7 @@
unbzip2-stream "^1.4.3"
yargs "^17.7.2"
"@rollup/pluginutils@^5.1.4", "@rollup/pluginutils@5":
"@rollup/pluginutils@5", "@rollup/pluginutils@^5.1.4":
version "5.1.4"
resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz"
integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==
@@ -495,6 +610,96 @@
estree-walker "^2.0.2"
picomatch "^4.0.2"
"@rollup/rollup-android-arm-eabi@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e"
integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==
"@rollup/rollup-android-arm64@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d"
integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==
"@rollup/rollup-darwin-arm64@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999"
integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==
"@rollup/rollup-darwin-x64@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2"
integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==
"@rollup/rollup-freebsd-arm64@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946"
integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==
"@rollup/rollup-freebsd-x64@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282"
integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==
"@rollup/rollup-linux-arm-gnueabihf@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df"
integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==
"@rollup/rollup-linux-arm-musleabihf@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb"
integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==
"@rollup/rollup-linux-arm64-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9"
integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==
"@rollup/rollup-linux-arm64-musl@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788"
integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==
"@rollup/rollup-linux-loongarch64-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87"
integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==
"@rollup/rollup-linux-powerpc64le-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c"
integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==
"@rollup/rollup-linux-riscv64-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd"
integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==
"@rollup/rollup-linux-s390x-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd"
integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==
"@rollup/rollup-linux-x64-gnu@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e"
integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==
"@rollup/rollup-linux-x64-musl@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b"
integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==
"@rollup/rollup-win32-arm64-msvc@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11"
integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==
"@rollup/rollup-win32-ia32-msvc@4.28.1":
version "4.28.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f"
integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==
"@rollup/rollup-win32-x64-msvc@4.28.1":
version "4.28.1"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz"
@@ -524,7 +729,7 @@
resolved "https://registry.npmmirror.com/@types/doctrine/-/doctrine-0.0.9.tgz"
integrity sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==
"@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@1.0.6":
"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
version "1.0.6"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz"
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
@@ -571,7 +776,7 @@
dependencies:
"@types/node" "*"
"@types/node@*", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^22.5.5":
"@types/node@*", "@types/node@^22.5.5":
version "22.10.2"
resolved "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz"
integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==
@@ -600,6 +805,21 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@8.20.0", "@typescript-eslint/eslint-plugin@^8.17.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz"
integrity sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/type-utils" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/eslint-plugin@^7.4.0":
version "7.18.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz"
@@ -615,48 +835,7 @@
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/eslint-plugin@^8.17.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz"
integrity sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/type-utils" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/eslint-plugin@8.20.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz"
integrity sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/type-utils" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/parser@^7.0.0", "@typescript-eslint/parser@^7.4.0":
version "7.18.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-7.18.0.tgz"
integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==
dependencies:
"@typescript-eslint/scope-manager" "7.18.0"
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/visitor-keys" "7.18.0"
debug "^4.3.4"
"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@^8.17.0", "@typescript-eslint/parser@8.20.0":
"@typescript-eslint/parser@8.20.0", "@typescript-eslint/parser@^8.17.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.20.0.tgz"
integrity sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==
@@ -667,13 +846,16 @@
"@typescript-eslint/visitor-keys" "8.20.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@^8.1.0", "@typescript-eslint/scope-manager@8.20.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz"
integrity sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==
"@typescript-eslint/parser@^7.4.0":
version "7.18.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-7.18.0.tgz"
integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==
dependencies:
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
"@typescript-eslint/scope-manager" "7.18.0"
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/visitor-keys" "7.18.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@7.18.0":
version "7.18.0"
@@ -683,6 +865,14 @@
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/visitor-keys" "7.18.0"
"@typescript-eslint/scope-manager@8.20.0", "@typescript-eslint/scope-manager@^8.1.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz"
integrity sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==
dependencies:
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
"@typescript-eslint/type-utils@7.18.0":
version "7.18.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz"
@@ -741,26 +931,6 @@
semver "^7.6.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/utils@^8.1.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.20.0.tgz"
integrity sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/typescript-estree" "8.20.0"
"@typescript-eslint/utils@^8.13.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.20.0.tgz"
integrity sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/typescript-estree" "8.20.0"
"@typescript-eslint/utils@7.18.0":
version "7.18.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-7.18.0.tgz"
@@ -771,7 +941,7 @@
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/utils@8.20.0":
"@typescript-eslint/utils@8.20.0", "@typescript-eslint/utils@^8.1.0", "@typescript-eslint/utils@^8.13.0":
version "8.20.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.20.0.tgz"
integrity sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==
@@ -807,7 +977,7 @@
resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz"
integrity sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==
"@volar/language-core@~2.4.11", "@volar/language-core@2.4.11":
"@volar/language-core@2.4.11", "@volar/language-core@~2.4.11":
version "2.4.11"
resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.11.tgz"
integrity sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==
@@ -839,7 +1009,7 @@
estree-walker "^2.0.2"
source-map-js "^1.2.0"
"@vue/compiler-dom@^3.5.0", "@vue/compiler-dom@3.5.13":
"@vue/compiler-dom@3.5.13", "@vue/compiler-dom@^3.5.0":
version "3.5.13"
resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz"
integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
@@ -930,7 +1100,7 @@
"@vue/compiler-ssr" "3.5.13"
"@vue/shared" "3.5.13"
"@vue/shared@^3.5.0", "@vue/shared@3.5.13":
"@vue/shared@3.5.13", "@vue/shared@^3.5.0":
version "3.5.13"
resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz"
integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
@@ -950,7 +1120,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.9.0:
acorn@^8.14.0, acorn@^8.9.0:
version "8.14.0"
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz"
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
@@ -1187,7 +1357,7 @@ balanced-match@^1.0.0:
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
bare-events@*, bare-events@^2.0.0, bare-events@^2.2.0:
bare-events@^2.0.0, bare-events@^2.2.0:
version "2.5.4"
resolved "https://registry.npmmirror.com/bare-events/-/bare-events-2.5.4.tgz"
integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==
@@ -1480,6 +1650,13 @@ de-indent@^1.0.2:
resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz"
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0:
version "4.4.0"
resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz"
integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
dependencies:
ms "^2.1.3"
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz"
@@ -1487,13 +1664,6 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@4:
version "4.4.0"
resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz"
integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
dependencies:
ms "^2.1.3"
decamelize-keys@^1.1.0:
version "1.1.1"
resolved "https://registry.npmmirror.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz"
@@ -1549,7 +1719,7 @@ denodeify@^1.2.1:
resolved "https://registry.npmmirror.com/denodeify/-/denodeify-1.2.1.tgz"
integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==
devtools-protocol@*, devtools-protocol@0.0.1367902:
devtools-protocol@0.0.1367902:
version "0.0.1367902"
resolved "https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz"
integrity sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==
@@ -1806,7 +1976,7 @@ eslint-compat-utils@^0.5.1:
dependencies:
semver "^7.5.4"
eslint-config-prettier@*, eslint-config-prettier@^9.1.0:
eslint-config-prettier@^9.1.0:
version "9.1.0"
resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz"
integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
@@ -2015,7 +2185,7 @@ eslint-visitor-keys@^4.2.0:
resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz"
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.56.0, eslint@^8.57.0, "eslint@^8.57.0 || ^9.0.0", eslint@>=4.19.1, eslint@>=5.16.0, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=8, eslint@>=8.0.0, eslint@>=8.23.0, eslint@>=8.40.0, eslint@>=8.56.0:
eslint@^8.57.0:
version "8.57.1"
resolved "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@@ -2059,7 +2229,7 @@ eslint-visitor-keys@^4.2.0:
strip-ansi "^6.0.1"
text-table "^0.2.0"
"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^8.56.0 || ^9.0.0-0", eslint@^9.13.0:
eslint@^9.13.0:
version "9.18.0"
resolved "https://registry.npmmirror.com/eslint/-/eslint-9.18.0.tgz"
integrity sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==
@@ -2335,6 +2505,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz"
@@ -2456,12 +2631,7 @@ globals@^14.0.0:
resolved "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^15.11.0:
version "15.14.0"
resolved "https://registry.npmmirror.com/globals/-/globals-15.14.0.tgz"
integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==
globals@^15.13.0:
globals@^15.11.0, globals@^15.13.0:
version "15.14.0"
resolved "https://registry.npmmirror.com/globals/-/globals-15.14.0.tgz"
integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==
@@ -2474,18 +2644,6 @@ globalthis@^1.0.4:
define-properties "^1.2.1"
gopd "^1.0.1"
globby@^11.1.0:
version "11.1.0"
resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.2.9"
ignore "^5.2.0"
merge2 "^1.4.1"
slash "^3.0.0"
globby@10.0.1:
version "10.0.1"
resolved "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz"
@@ -2500,6 +2658,18 @@ globby@10.0.1:
merge2 "^1.2.3"
slash "^3.0.0"
globby@^11.1.0:
version "11.1.0"
resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.2.9"
ignore "^5.2.0"
merge2 "^1.4.1"
slash "^3.0.0"
gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz"
@@ -3216,14 +3386,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimatch@^9.0.3, minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies:
brace-expansion "^2.0.1"
minimatch@^9.0.5:
minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@@ -3574,17 +3737,7 @@ picocolors@^1.0.0, picocolors@^1.1.1:
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^2.0.4:
version "2.3.1"
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
picomatch@^2.3.1:
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -3629,7 +3782,7 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
prettier@^3.3.3, prettier@>=3.0.0:
prettier@^3.3.3:
version "3.4.2"
resolved "https://registry.npmmirror.com/prettier/-/prettier-3.4.2.tgz"
integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==
@@ -3869,7 +4022,7 @@ rollup-plugin-css-only@^4.5.2:
dependencies:
"@rollup/pluginutils" "5"
rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^4.23.0, rollup@<5:
rollup@^4.23.0:
version "4.28.1"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz"
integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==
@@ -3937,12 +4090,12 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0:
resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
semver@^6.1.0:
version "6.3.1"
resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
"semver@2 || 3 || 4 || 5":
version "5.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.3.1:
semver@^6.1.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
@@ -3952,11 +4105,6 @@ semver@^7.3.4, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3:
resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
"semver@2 || 3 || 4 || 5":
version "5.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
set-function-length@^1.2.2:
version "1.2.2"
resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz"
@@ -4442,7 +4590,7 @@ typescript-eslint@^8.17.0:
"@typescript-eslint/parser" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
typescript@*, typescript@^5.7.3, typescript@>=4.2.0, "typescript@>=4.7.5 || ^5.0.0", typescript@>=4.8.4, "typescript@>=4.8.4 <5.8.0", typescript@>=4.9.5, typescript@>=5.0.0, typescript@5.x:
typescript@^5.7.3:
version "5.7.3"
resolved "https://registry.npmmirror.com/typescript/-/typescript-5.7.3.tgz"
integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==
@@ -4524,7 +4672,7 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
"vite@^5.0.0 || ^6.0.0", vite@^6.0.1:
vite@^6.0.1:
version "6.0.3"
resolved "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz"
integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==
@@ -4557,7 +4705,7 @@ vue-tsc@^2.1.10:
"@volar/typescript" "~2.4.11"
"@vue/language-core" "2.2.0"
vue@^3.0.0, vue@^3.2.25, vue@^3.4.0, vue@^3.5.13, "vue@2 || 3", vue@3.5.13:
vue@^3.5.13:
version "3.5.13"
resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz"
integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==