vue-slim-tables 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/types/components/table.vue.d.ts +7 -9
- package/dist/types/helpers/to_query_string.d.ts +1 -1
- package/dist/types/use/filterable.d.ts +8 -9
- package/dist/vst.es.js +42 -42
- package/dist/vst.es.js.map +1 -1
- package/dist/vst.umd.js +1 -1
- package/dist/vst.umd.js.map +1 -1
- package/package.json +17 -15
package/README.md
CHANGED
|
@@ -42,11 +42,10 @@ npm install vue-slim-tables
|
|
|
42
42
|
### Slots
|
|
43
43
|
| Slot | Props | Description |
|
|
44
44
|
| - | - | - |
|
|
45
|
-
| #
|
|
45
|
+
| #thead | { columns, orders } | Rewrite whole thead row |
|
|
46
|
+
| #thead:${column.key} | { column } | Rewrite column thead with custom html |
|
|
46
47
|
| #row | { row, index, columns } | Rewrite whole row |
|
|
47
48
|
| #row:empty | - | Rewrite empty table row markup |
|
|
48
49
|
| #row:loading | - | Rewrite loading table rows markup |
|
|
49
50
|
| #cell:${column.key} | { row, index, column, value } | Rewrite cell with custom html |
|
|
50
51
|
| #pagination | { page, rows } | Rewrite pagination with your own implementation |
|
|
51
|
-
| #thead:before | { columns } | Render row before base header |
|
|
52
|
-
| #thead:after | { columns } | Render row after base header |
|
|
@@ -10,10 +10,10 @@ interface TableOrders {
|
|
|
10
10
|
interface TableFetchParams {
|
|
11
11
|
per_page: number;
|
|
12
12
|
page: number;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
orders?: TableOrders;
|
|
14
|
+
}
|
|
15
|
+
interface TableRow {
|
|
16
|
+
[key: string]: any;
|
|
17
17
|
}
|
|
18
18
|
declare const _sfc_main: import("vue").DefineComponent<{
|
|
19
19
|
columns: {
|
|
@@ -32,11 +32,11 @@ declare const _sfc_main: import("vue").DefineComponent<{
|
|
|
32
32
|
}, {
|
|
33
33
|
props: {
|
|
34
34
|
columns: Array<TableColumn>;
|
|
35
|
-
source: string | ((_: TableFetchParams) => Promise<
|
|
35
|
+
source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[]);
|
|
36
36
|
perPage: number;
|
|
37
37
|
};
|
|
38
38
|
orders: ShallowRef<TableOrders>;
|
|
39
|
-
|
|
39
|
+
loadItems: (params: TableFetchParams) => Promise<TableRow[]>;
|
|
40
40
|
onOrderClick: (key: string) => void;
|
|
41
41
|
page: import("vue").Ref<number>;
|
|
42
42
|
isSyncing: import("vue").ComputedRef<boolean>;
|
|
@@ -46,9 +46,7 @@ declare const _sfc_main: import("vue").DefineComponent<{
|
|
|
46
46
|
reload: () => void;
|
|
47
47
|
refetch: () => void;
|
|
48
48
|
rows: {
|
|
49
|
-
value:
|
|
50
|
-
[x: string]: any;
|
|
51
|
-
}[];
|
|
49
|
+
value: TableRow[];
|
|
52
50
|
};
|
|
53
51
|
LoadingRow: import("vue").DefineComponent<{
|
|
54
52
|
columnsLength: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (obj: any) =>
|
|
1
|
+
declare const _default: (obj: any) => string;
|
|
2
2
|
export default _default;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
declare type CombinedFilters<Filters> = Filters & {
|
|
2
|
+
page: number;
|
|
3
|
+
};
|
|
4
|
+
interface UseFiltetableArgs<Filters, Item> {
|
|
5
|
+
initialFilters: Filters;
|
|
6
|
+
loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>;
|
|
6
7
|
}
|
|
7
|
-
declare const useFilterable: ({ initialFilters, loadItems }: UseFiltetableArgs) => {
|
|
8
|
+
declare const useFilterable: <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {
|
|
8
9
|
page: import("vue").Ref<number>;
|
|
9
10
|
items: {
|
|
10
|
-
value:
|
|
11
|
-
[x: string]: any;
|
|
12
|
-
}[];
|
|
11
|
+
value: Item[];
|
|
13
12
|
};
|
|
14
13
|
syncState: import("vue").Ref<string>;
|
|
15
14
|
nextPage: () => void;
|
package/dist/vst.es.js
CHANGED
|
@@ -14,7 +14,7 @@ var __spreadValues = (a, b) => {
|
|
|
14
14
|
}
|
|
15
15
|
return a;
|
|
16
16
|
};
|
|
17
|
-
import { defineComponent, openBlock, createElementBlock, createElementVNode, normalizeClass, computed, ref, reactive,
|
|
17
|
+
import { defineComponent, openBlock, createElementBlock, createElementVNode, normalizeClass, computed, ref, reactive, watch, shallowRef, renderSlot, unref, Fragment, renderList, mergeProps, toHandlers, createTextVNode, toDisplayString, createCommentVNode, createBlock, withModifiers } from "vue";
|
|
18
18
|
var index = "";
|
|
19
19
|
const _hoisted_1$1 = ["colspan"];
|
|
20
20
|
const _hoisted_2$1 = /* @__PURE__ */ createElementVNode("div", null, null, -1);
|
|
@@ -47,13 +47,13 @@ const useFilterable = ({ initialFilters, loadItems }) => {
|
|
|
47
47
|
const page = ref(1);
|
|
48
48
|
const items = reactive({ value: [] });
|
|
49
49
|
const syncState = ref(SYNC_STATES.INITIAL);
|
|
50
|
-
const
|
|
51
|
-
const
|
|
50
|
+
const filters = reactive({ value: initialFilters });
|
|
51
|
+
const combinedFilters = computed(() => __spreadValues({
|
|
52
52
|
page: page.value
|
|
53
|
-
},
|
|
53
|
+
}, filters.value));
|
|
54
54
|
const load = () => {
|
|
55
55
|
syncState.value = SYNC_STATES.SYNCING;
|
|
56
|
-
return loadItems(
|
|
56
|
+
return loadItems(combinedFilters.value).then((res) => {
|
|
57
57
|
items.value = res;
|
|
58
58
|
syncState.value = SYNC_STATES.SYNCED;
|
|
59
59
|
}).catch(() => {
|
|
@@ -61,8 +61,8 @@ const useFilterable = ({ initialFilters, loadItems }) => {
|
|
|
61
61
|
syncState.value = SYNC_STATES.FAILED;
|
|
62
62
|
});
|
|
63
63
|
};
|
|
64
|
-
watch(filters, load);
|
|
65
64
|
load();
|
|
65
|
+
watch(combinedFilters, load);
|
|
66
66
|
return {
|
|
67
67
|
page,
|
|
68
68
|
items,
|
|
@@ -104,11 +104,10 @@ const stringify = (obj, parentPrefix) => (outputArray, [key, val]) => {
|
|
|
104
104
|
var toQueryString = (obj) => Object.entries(obj).reduce(stringify(), []).join("&");
|
|
105
105
|
const _hoisted_1 = { class: "vst" };
|
|
106
106
|
const _hoisted_2 = { key: 0 };
|
|
107
|
-
const _hoisted_3 =
|
|
108
|
-
const _hoisted_4 =
|
|
107
|
+
const _hoisted_3 = { key: 0 };
|
|
108
|
+
const _hoisted_4 = ["colspan"];
|
|
109
109
|
const _hoisted_5 = ["colspan"];
|
|
110
|
-
const _hoisted_6 =
|
|
111
|
-
const _hoisted_7 = {
|
|
110
|
+
const _hoisted_6 = {
|
|
112
111
|
key: 0,
|
|
113
112
|
class: "vst-pagination mt-3"
|
|
114
113
|
};
|
|
@@ -121,7 +120,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
121
120
|
setup(__props, { expose }) {
|
|
122
121
|
const props = __props;
|
|
123
122
|
const orders = shallowRef({});
|
|
124
|
-
const
|
|
123
|
+
const loadItems = async (params) => {
|
|
125
124
|
let data;
|
|
126
125
|
if (typeof props.source === "string") {
|
|
127
126
|
const response = await fetch(`${props.source}?${toQueryString(params)}`);
|
|
@@ -150,8 +149,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
150
149
|
refetch,
|
|
151
150
|
items: rows
|
|
152
151
|
} = useFilterable({
|
|
153
|
-
initialFilters: { per_page: props.perPage, orders },
|
|
154
|
-
loadItems
|
|
152
|
+
initialFilters: { per_page: props.perPage, orders: orders.value },
|
|
153
|
+
loadItems
|
|
155
154
|
});
|
|
156
155
|
expose({
|
|
157
156
|
refetch,
|
|
@@ -161,33 +160,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
161
160
|
return (_ctx, _cache) => {
|
|
162
161
|
return openBlock(), createElementBlock("table", _hoisted_1, [
|
|
163
162
|
__props.columns.length ? (openBlock(), createElementBlock("thead", _hoisted_2, [
|
|
164
|
-
renderSlot(_ctx.$slots, "thead
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
163
|
+
renderSlot(_ctx.$slots, "thead", {
|
|
164
|
+
columns: __props.columns,
|
|
165
|
+
orders: unref(orders)
|
|
166
|
+
}, () => [
|
|
167
|
+
createElementVNode("tr", null, [
|
|
168
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
|
|
169
|
+
return openBlock(), createElementBlock("th", mergeProps({
|
|
170
|
+
key: column.key,
|
|
171
|
+
class: ["vst-th", { "vst-orderable": column.orderable }]
|
|
172
|
+
}, toHandlers(column.orderable ? { click: () => onOrderClick(column.key) } : {})), [
|
|
173
|
+
column.orderable ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
174
|
+
renderSlot(_ctx.$slots, `head:${column.key}`, { column }, () => [
|
|
175
|
+
createTextVNode(toDisplayString(column.title), 1)
|
|
176
|
+
]),
|
|
177
|
+
createElementVNode("a", {
|
|
178
|
+
href: "#",
|
|
179
|
+
class: normalizeClass(["vst-orderable-toggle", unref(orders)[column.key]])
|
|
180
|
+
}, null, 2)
|
|
181
|
+
])) : renderSlot(_ctx.$slots, `thead:${column.key}`, {
|
|
182
|
+
key: 1,
|
|
183
|
+
column
|
|
184
|
+
}, () => [
|
|
174
185
|
createTextVNode(toDisplayString(column.title), 1)
|
|
175
|
-
])
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}, null, 2)) : createCommentVNode("", true)
|
|
181
|
-
])) : renderSlot(_ctx.$slots, `head:${column.key}`, {
|
|
182
|
-
key: 1,
|
|
183
|
-
column
|
|
184
|
-
}, () => [
|
|
185
|
-
createTextVNode(toDisplayString(column.title), 1)
|
|
186
|
-
])
|
|
187
|
-
], 10, _hoisted_3);
|
|
188
|
-
}), 128))
|
|
189
|
-
]),
|
|
190
|
-
renderSlot(_ctx.$slots, "thead:after", { columns: __props.columns })
|
|
186
|
+
])
|
|
187
|
+
], 16);
|
|
188
|
+
}), 128))
|
|
189
|
+
])
|
|
190
|
+
])
|
|
191
191
|
])) : createCommentVNode("", true),
|
|
192
192
|
createElementVNode("tbody", null, [
|
|
193
193
|
unref(isSyncing) ? renderSlot(_ctx.$slots, "row:loading", { key: 0 }, () => [
|
|
@@ -201,7 +201,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
201
201
|
createElementVNode("tr", null, [
|
|
202
202
|
createElementVNode("td", {
|
|
203
203
|
colspan: __props.columns.length
|
|
204
|
-
}, " No records found ", 8,
|
|
204
|
+
}, " No records found ", 8, _hoisted_4)
|
|
205
205
|
])
|
|
206
206
|
]) : unref(isSynced) && unref(rows).value.length ? (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(unref(rows).value, (row, i) => {
|
|
207
207
|
return renderSlot(_ctx.$slots, "row", {
|
|
@@ -239,7 +239,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
239
239
|
page: unref(page),
|
|
240
240
|
rows: unref(rows).value
|
|
241
241
|
}, () => [
|
|
242
|
-
unref(page) > 1 || unref(rows).value.length === __props.perPage || unref(isSyncing) ? (openBlock(), createElementBlock("ul",
|
|
242
|
+
unref(page) > 1 || unref(rows).value.length === __props.perPage || unref(isSyncing) ? (openBlock(), createElementBlock("ul", _hoisted_6, [
|
|
243
243
|
createElementVNode("li", {
|
|
244
244
|
class: normalizeClass(["vst-page-item", { disabled: unref(page) === 1 || unref(isSyncing) }])
|
|
245
245
|
}, [
|
|
@@ -260,7 +260,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
260
260
|
], 2)
|
|
261
261
|
])) : createCommentVNode("", true)
|
|
262
262
|
])
|
|
263
|
-
], 8,
|
|
263
|
+
], 8, _hoisted_5)
|
|
264
264
|
])
|
|
265
265
|
])
|
|
266
266
|
]);
|
package/dist/vst.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vst.es.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch
|
|
1
|
+
{"version":3,"file":"vst.es.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch,\n} from 'vue'\n\ntype CombinedFilters<Filters> = Filters & {\n page: number\n}\n\ninterface UseFiltetableArgs<Filters, Item> {\n initialFilters: Filters,\n loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] }) as { value: Item[] }\n const syncState = ref(SYNC_STATES.INITIAL)\n const filters = reactive({ value: initialFilters })\n\n const combinedFilters = computed(() => ({\n page: page.value,\n ...filters.value as Filters,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(combinedFilters.value)\n .then((res: Item[]) => {\n items.value = res\n syncState.value = SYNC_STATES.SYNCED\n })\n .catch(() => {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n })\n }\n load()\n\n watch(combinedFilters, load)\n\n return {\n page,\n items,\n syncState,\n nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n isSyncing: computed(() => syncState.value === SYNC_STATES.SYNCING),\n isSynced: computed(() => syncState.value === SYNC_STATES.SYNCED),\n isFailed: computed(() => syncState.value === SYNC_STATES.FAILED),\n reload: () => {\n load()\n },\n refetch: () => {\n if (page.value === 1) {\n load()\n } else {\n page.value = 1\n }\n },\n }\n}\n\nexport default useFilterable\n","const stringify = (obj, parentPrefix?: string) => (outputArray, [key, val]) => {\n if (val === null || val === undefined) {\n return outputArray\n }\n\n const encodedKey = encodeURIComponent(key)\n const prefix = parentPrefix ? `${parentPrefix}[${encodedKey}]` : encodedKey\n\n if (['number', 'string'].includes(typeof val)) {\n outputArray.push(`${prefix}=${encodeURIComponent(val)}`)\n return outputArray\n }\n\n outputArray.push(Object.entries(val).reduce(stringify(val, prefix), []).join('&'))\n return outputArray\n}\n\nexport default (obj): string => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead\" :columns=\"columns\" :orders=\"orders\">\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n v-on=\"column.orderable ? { click: () => onOrderClick(column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a href=\"#\" :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow\n v-for=\"i in perPage\"\n :key=\"`loadingRow${i}`\"\n :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.value.length === 0\" name=\"row:empty\">\n <tr>\n <td :colspan=\"columns.length\">\n No records found\n </td>\n </tr>\n </slot>\n\n <template v-else-if=\"isSynced && rows.value.length\">\n <slot\n v-for=\"(row, i) in rows.value\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\">\n <slot\n :name=\"`cell:${column.key}`\"\n :row=\"row\"\n :value=\"row[column.key]\"\n :column=\"column\"\n :index=\"i\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n </slot>\n </template>\n </tbody>\n <tfoot>\n <tr>\n <td :colspan=\"columns.length\">\n <slot name=\"pagination\" :page=\"page\" :rows=\"rows.value\">\n <ul\n v-if=\"page > 1 || rows.value.length === perPage || isSyncing\"\n class=\"vst-pagination mt-3\">\n <li :class=\"['vst-page-item', { disabled: page === 1 || isSyncing }]\">\n <a class=\"vst-page-link\" @click.prevent=\"prevPage\">←</a>\n </li>\n\n <li\n :class=\"['vst-page-item', {\n disabled: rows.value.length < perPage || isSyncing\n }]\">\n <a class=\"vst-page-link\" @click.prevent=\"nextPage\">→</a>\n </li>\n </ul>\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n\n<script setup lang=\"ts\">\nimport { shallowRef, ShallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\nimport toQueryString from '../helpers/to_query_string'\n\ninterface TableColumn {\n key: string,\n title: string,\n orderable?: boolean\n}\n\ninterface TableOrders {\n [key: string]: 'asc' | 'desc'\n}\n\ninterface TableFetchParams {\n per_page: number,\n page: number,\n orders?: TableOrders\n}\n\ninterface TableRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\ninterface TableFilters {\n per_page: number,\n orders: TableOrders\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[])\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TableRow[]\n if (typeof props.source === 'string') {\n const response = await fetch(`${props.source}?${toQueryString(params)}`)\n data = await response.json()\n } else {\n data = await props.source(params) as TableRow[]\n }\n\n return data\n}\n\nconst onOrderClick = (key: string) => {\n if (orders.value[key] === 'asc') {\n orders.value = { [key]: 'desc' }\n } else if (orders.value[key] === 'desc') {\n orders.value = {}\n } else {\n orders.value = { [key]: 'asc' }\n }\n}\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TableRow>({\n initialFilters: { per_page: props.perPage, orders: orders.value },\n loadItems,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;UAeM,UAAU,KAAK,MAAM,KAAK,WAAW,EAAE,IAAI;;;;;;;;;;;ACFjD,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,MAAM,gBAAgB,CAAgB,EAAE,gBAAgB,gBAAkD;QAClG,OAAO,IAAI,CAAC;QACZ,QAAQ,SAAS,EAAE,OAAO,IAAc;QACxC,YAAY,IAAI,YAAY,OAAO;QACnC,UAAU,SAAS,EAAE,OAAO,gBAAgB;QAE5C,kBAAkB,SAAS;IAC/B,MAAM,KAAK;AAAA,KACR,QAAQ,MACX;QAEI,OAAO,MAAM;cACP,QAAQ,YAAY;WAEvB,UAAU,gBAAgB,KAAK,EACnC,KAAK,CAAC,QAAgB;YACf,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B,EACA,MAAM,MAAM;YACL,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B;AAAA;;QAIC,iBAAiB,IAAI;SAEpB;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,MAAM;WACT,SAAS;AAAA;IAEhB,UAAU,MAAM;WACT,SAAS;AAAA;IAEhB,WAAW,SAAS,MAAM,UAAU,UAAU,YAAY,OAAO;AAAA,IACjE,UAAU,SAAS,MAAM,UAAU,UAAU,YAAY,MAAM;AAAA,IAC/D,UAAU,SAAS,MAAM,UAAU,UAAU,YAAY,MAAM;AAAA,IAC/D,QAAQ,MAAM;;;IAGd,SAAS,MAAM;UACT,KAAK,UAAU,GAAG;;aAEf;aACA,QAAQ;AAAA;;;AAIrB;ACxEA,MAAM,YAAY,CAAC,KAAK,iBAA0B,CAAC,aAAa,CAAC,KAAK,SAAS;MACzE,QAAQ,QAAQ,QAAQ,QAAW;WAC9B;AAAA;QAGH,aAAa,mBAAmB,GAAG;QACnC,SAAS,eAAe,GAAG,gBAAgB,gBAAgB;MAE7D,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAO,GAAG,GAAG;gBACjC,KAAK,GAAG,UAAU,mBAAmB,GAAG,GAAG;WAChD;AAAA;cAGG,KAAK,OAAO,QAAQ,GAAG,EAAE,OAAO,UAAU,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;SAC1E;AACT;AAEA,oBAAe,CAAC,QAAgB,OAAO,QAAQ,GAAG,EAAE,OAAO,UAAa,GAAG,EAAE,EAAE,KAAK,GAAG;;;;;;;;;;;;;;;;;;UCyHjF,SAAkC,WAAW,EAAE;UAE/C,YAAY,OAAO,WAA6B;UAChD;UACA,OAAO,MAAM,WAAW,UAAU;cAC9B,WAAW,MAAM,MAAM,GAAG,MAAM,UAAU,cAAc,MAAM,GAAG;eAChE,MAAM,SAAS;aACjB;eACE,MAAM,MAAM,OAAO,MAAM;AAAA;aAG3B;AAAA;UAGH,eAAe,CAAC,QAAgB;UAChC,OAAO,MAAM,SAAS,OAAO;eACxB,QAAQ,GAAG,MAAM;iBACf,OAAO,MAAM,SAAS,QAAQ;eAChC,QAAQ;aACV;eACE,QAAQ,GAAG,MAAM;;;UAItB;AAAA,MACJ;AAAA,MAAM;AAAA,MAAW;AAAA,MAAU;AAAA,MAAU;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAS,OAAO;AAAA,QACrE,cAAsC;AAAA,MACxC,gBAAgB,EAAE,UAAU,MAAM,SAAS,QAAQ,OAAO;MAC1D;AAAA,KACD;WAEY;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,KACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/vst.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
(function(e,s){typeof exports=="object"&&typeof module!="undefined"?module.exports=s(require("vue")):typeof define=="function"&&define.amd?define(["vue"],s):(e=typeof globalThis!="undefined"?globalThis:e||self,e.VueSlimTable=s(e.Vue))})(this,function(e){"use strict";var z=Object.defineProperty;var $=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var V=(e,s,c)=>s in e?z(e,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):e[s]=c,C=(e,s)=>{for(var c in s||(s={}))M.call(s,c)&&V(e,c,s[c]);if($)for(var c of $(s))R.call(s,c)&&V(e,c,s[c]);return e};var s="";const c=["colspan"],b=[e.createElementVNode("div",null,null,-1)],u=e.defineComponent({props:{columnsLength:{type:Number,required:!0}},setup(n){const m=Math.floor(Math.random()*10)+1;return(l,a)=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("td",{colspan:n.columnsLength,class:e.normalizeClass(["vst-loading-row",`vst-loading-row-${m}`])},b,10,c)]))}}),g={INITIAL:"initial",SYNCING:"syncing",SYNCED:"synced",FAILED:"failed"},I=({initialFilters:n,loadItems:m})=>{const l=e.ref(1),a=e.reactive({value:[]}),o=e.ref(g.INITIAL),p=e.reactive({value:n}),i=e.computed(()=>C({page:l.value},p.value)),d=()=>(o.value=g.SYNCING,m(i.value).then(N=>{a.value=N,o.value=g.SYNCED}).catch(()=>{a.value=[],o.value=g.FAILED}));return d(),e.watch(i,d),{page:l,items:a,syncState:o,nextPage:()=>{l.value+=1},prevPage:()=>{l.value-=1},isSyncing:e.computed(()=>o.value===g.SYNCING),isSynced:e.computed(()=>o.value===g.SYNCED),isFailed:e.computed(()=>o.value===g.FAILED),reload:()=>{d()},refetch:()=>{l.value===1?d():l.value=1}}},E=(n,m)=>(l,[a,o])=>{if(o==null)return l;const p=encodeURIComponent(a),i=m?`${m}[${p}]`:p;return["number","string"].includes(typeof o)?(l.push(`${i}=${encodeURIComponent(o)}`),l):(l.push(Object.entries(o).reduce(E(o,i),[]).join("&")),l)};var w=n=>Object.entries(n).reduce(E(),[]).join("&");const F={class:"vst"},L={key:0},T={key:0},D=["colspan"],P=["colspan"],j={key:0,class:"vst-pagination mt-3"};return e.defineComponent({props:{columns:null,source:null,perPage:{default:25}},setup(n,{expose:m}){const l=n,a=e.shallowRef({}),o=async r=>{let f;return typeof l.source=="string"?f=await(await fetch(`${l.source}?${w(r)}`)).json():f=await l.source(r),f},p=r=>{a.value[r]==="asc"?a.value={[r]:"desc"}:a.value[r]==="desc"?a.value={}:a.value={[r]:"asc"}},{page:i,isSyncing:d,isSynced:N,prevPage:S,nextPage:B,reload:Y,refetch:x,items:k}=I({initialFilters:{per_page:l.perPage,orders:a.value},loadItems:o});return m({refetch:x,reload:Y,rows:k}),(r,f)=>(e.openBlock(),e.createElementBlock("table",F,[n.columns.length?(e.openBlock(),e.createElementBlock("thead",L,[e.renderSlot(r.$slots,"thead",{columns:n.columns,orders:e.unref(a)},()=>[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,t=>(e.openBlock(),e.createElementBlock("th",e.mergeProps({key:t.key,class:["vst-th",{"vst-orderable":t.orderable}]},e.toHandlers(t.orderable?{click:()=>p(t.key)}:{})),[t.orderable?(e.openBlock(),e.createElementBlock("div",T,[e.renderSlot(r.$slots,`head:${t.key}`,{column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)]),e.createElementVNode("a",{href:"#",class:e.normalizeClass(["vst-orderable-toggle",e.unref(a)[t.key]])},null,2)])):e.renderSlot(r.$slots,`thead:${t.key}`,{key:1,column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])],16))),128))])])])):e.createCommentVNode("",!0),e.createElementVNode("tbody",null,[e.unref(d)?e.renderSlot(r.$slots,"row:loading",{key:0},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.perPage,t=>(e.openBlock(),e.createBlock(u,{key:`loadingRow${t}`,"columns-length":n.columns.length},null,8,["columns-length"]))),128))]):e.unref(N)&&e.unref(k).value.length===0?e.renderSlot(r.$slots,"row:empty",{key:1},()=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length}," No records found ",8,D)])]):e.unref(N)&&e.unref(k).value.length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(k).value,(t,y)=>e.renderSlot(r.$slots,"row",{row:t,index:y,columns:n.columns},()=>[(e.openBlock(),e.createElementBlock("tr",{key:t.id||y},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,h=>(e.openBlock(),e.createElementBlock("td",{key:h.key},[e.renderSlot(r.$slots,`cell:${h.key}`,{row:t,value:t[h.key],column:h,index:y},()=>[e.createTextVNode(e.toDisplayString(t[h.key]),1)])]))),128))]))])),256)):e.createCommentVNode("",!0)]),e.createElementVNode("tfoot",null,[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length},[e.renderSlot(r.$slots,"pagination",{page:e.unref(i),rows:e.unref(k).value},()=>[e.unref(i)>1||e.unref(k).value.length===n.perPage||e.unref(d)?(e.openBlock(),e.createElementBlock("ul",j,[e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(i)===1||e.unref(d)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[0]||(f[0]=e.withModifiers((...t)=>e.unref(S)&&e.unref(S)(...t),["prevent"]))},"\u2190")],2),e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(k).value.length<n.perPage||e.unref(d)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[1]||(f[1]=e.withModifiers((...t)=>e.unref(B)&&e.unref(B)(...t),["prevent"]))},"\u2192")],2)])):e.createCommentVNode("",!0)])],8,P)])])]))}})});
|
|
2
2
|
//# sourceMappingURL=vst.umd.js.map
|
package/dist/vst.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vst.umd.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch
|
|
1
|
+
{"version":3,"file":"vst.umd.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch,\n} from 'vue'\n\ntype CombinedFilters<Filters> = Filters & {\n page: number\n}\n\ninterface UseFiltetableArgs<Filters, Item> {\n initialFilters: Filters,\n loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] }) as { value: Item[] }\n const syncState = ref(SYNC_STATES.INITIAL)\n const filters = reactive({ value: initialFilters })\n\n const combinedFilters = computed(() => ({\n page: page.value,\n ...filters.value as Filters,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(combinedFilters.value)\n .then((res: Item[]) => {\n items.value = res\n syncState.value = SYNC_STATES.SYNCED\n })\n .catch(() => {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n })\n }\n load()\n\n watch(combinedFilters, load)\n\n return {\n page,\n items,\n syncState,\n nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n isSyncing: computed(() => syncState.value === SYNC_STATES.SYNCING),\n isSynced: computed(() => syncState.value === SYNC_STATES.SYNCED),\n isFailed: computed(() => syncState.value === SYNC_STATES.FAILED),\n reload: () => {\n load()\n },\n refetch: () => {\n if (page.value === 1) {\n load()\n } else {\n page.value = 1\n }\n },\n }\n}\n\nexport default useFilterable\n","const stringify = (obj, parentPrefix?: string) => (outputArray, [key, val]) => {\n if (val === null || val === undefined) {\n return outputArray\n }\n\n const encodedKey = encodeURIComponent(key)\n const prefix = parentPrefix ? `${parentPrefix}[${encodedKey}]` : encodedKey\n\n if (['number', 'string'].includes(typeof val)) {\n outputArray.push(`${prefix}=${encodeURIComponent(val)}`)\n return outputArray\n }\n\n outputArray.push(Object.entries(val).reduce(stringify(val, prefix), []).join('&'))\n return outputArray\n}\n\nexport default (obj): string => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead\" :columns=\"columns\" :orders=\"orders\">\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n v-on=\"column.orderable ? { click: () => onOrderClick(column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a href=\"#\" :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow\n v-for=\"i in perPage\"\n :key=\"`loadingRow${i}`\"\n :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.value.length === 0\" name=\"row:empty\">\n <tr>\n <td :colspan=\"columns.length\">\n No records found\n </td>\n </tr>\n </slot>\n\n <template v-else-if=\"isSynced && rows.value.length\">\n <slot\n v-for=\"(row, i) in rows.value\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\">\n <slot\n :name=\"`cell:${column.key}`\"\n :row=\"row\"\n :value=\"row[column.key]\"\n :column=\"column\"\n :index=\"i\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n </slot>\n </template>\n </tbody>\n <tfoot>\n <tr>\n <td :colspan=\"columns.length\">\n <slot name=\"pagination\" :page=\"page\" :rows=\"rows.value\">\n <ul\n v-if=\"page > 1 || rows.value.length === perPage || isSyncing\"\n class=\"vst-pagination mt-3\">\n <li :class=\"['vst-page-item', { disabled: page === 1 || isSyncing }]\">\n <a class=\"vst-page-link\" @click.prevent=\"prevPage\">←</a>\n </li>\n\n <li\n :class=\"['vst-page-item', {\n disabled: rows.value.length < perPage || isSyncing\n }]\">\n <a class=\"vst-page-link\" @click.prevent=\"nextPage\">→</a>\n </li>\n </ul>\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n\n<script setup lang=\"ts\">\nimport { shallowRef, ShallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\nimport toQueryString from '../helpers/to_query_string'\n\ninterface TableColumn {\n key: string,\n title: string,\n orderable?: boolean\n}\n\ninterface TableOrders {\n [key: string]: 'asc' | 'desc'\n}\n\ninterface TableFetchParams {\n per_page: number,\n page: number,\n orders?: TableOrders\n}\n\ninterface TableRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\ninterface TableFilters {\n per_page: number,\n orders: TableOrders\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[])\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TableRow[]\n if (typeof props.source === 'string') {\n const response = await fetch(`${props.source}?${toQueryString(params)}`)\n data = await response.json()\n } else {\n data = await props.source(params) as TableRow[]\n }\n\n return data\n}\n\nconst onOrderClick = (key: string) => {\n if (orders.value[key] === 'asc') {\n orders.value = { [key]: 'desc' }\n } else if (orders.value[key] === 'desc') {\n orders.value = {}\n } else {\n orders.value = { [key]: 'asc' }\n }\n}\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TableRow>({\n initialFilters: { per_page: props.perPage, orders: orders.value },\n loadItems,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["ref","reactive","computed","shallowRef"],"mappings":"iwBAeM,GAAU,KAAK,MAAM,KAAK,SAAW,EAAE,EAAI,mMCF3C,EAAc,CAClB,QAAS,UACT,QAAS,UACT,OAAQ,SACR,OAAQ,QACV,EAEM,EAAgB,CAAgB,CAAE,iBAAgB,eAAkD,MAClG,GAAOA,MAAI,CAAC,EACZ,EAAQC,WAAS,CAAE,MAAO,GAAc,EACxC,EAAYD,MAAI,EAAY,OAAO,EACnC,EAAUC,WAAS,CAAE,MAAO,EAAgB,EAE5C,EAAkBC,WAAS,OAC/B,KAAM,EAAK,OACR,EAAQ,MACX,EAEI,EAAO,OACD,MAAQ,EAAY,QAEvB,EAAU,EAAgB,KAAK,EACnC,KAAK,AAAC,GAAgB,GACf,MAAQ,IACJ,MAAQ,EAAY,OAC/B,EACA,MAAM,IAAM,GACL,MAAQ,KACJ,MAAQ,EAAY,OAC/B,sBAIC,EAAiB,CAAI,EAEpB,CACL,OACA,QACA,YACA,SAAU,IAAM,GACT,OAAS,GAEhB,SAAU,IAAM,GACT,OAAS,GAEhB,UAAWA,WAAS,IAAM,EAAU,QAAU,EAAY,OAAO,EACjE,SAAUA,WAAS,IAAM,EAAU,QAAU,EAAY,MAAM,EAC/D,SAAUA,WAAS,IAAM,EAAU,QAAU,EAAY,MAAM,EAC/D,OAAQ,IAAM,MAGd,QAAS,IAAM,CACT,EAAK,QAAU,QAGZ,MAAQ,GAIrB,ECxEM,EAAY,CAAC,EAAK,IAA0B,CAAC,EAAa,CAAC,EAAK,KAAS,IACzE,GAAQ,WACH,QAGH,GAAa,mBAAmB,CAAG,EACnC,EAAS,EAAe,GAAG,KAAgB,KAAgB,QAE7D,CAAC,SAAU,QAAQ,EAAE,SAAS,MAAO,EAAG,KAC9B,KAAK,GAAG,KAAU,mBAAmB,CAAG,GAAG,EAChD,MAGG,KAAK,OAAO,QAAQ,CAAG,EAAE,OAAO,EAAU,EAAK,CAAM,EAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAC1E,EACT,QAEe,AAAC,GAAgB,OAAO,QAAQ,CAAG,EAAE,OAAO,EAAa,EAAG,EAAE,EAAE,KAAK,GAAG,4NCyHjF,EAAkCC,aAAW,EAAE,EAE/C,EAAY,KAAO,IAA6B,IAChD,SACA,OAAO,GAAM,QAAW,WAEnB,KAAM,AADI,MAAM,OAAM,GAAG,EAAM,UAAU,EAAc,CAAM,GAAG,GACjD,SAEf,KAAM,GAAM,OAAO,CAAM,EAG3B,GAGH,EAAe,AAAC,GAAgB,CAChC,EAAO,MAAM,KAAS,QACjB,MAAQ,EAAG,GAAM,QACf,EAAO,MAAM,KAAS,SACxB,MAAQ,KAER,MAAQ,EAAG,GAAM,QAItB,CACJ,OAAM,YAAW,WAAU,WAAU,WAAU,SAAQ,UAAS,MAAO,GACrE,EAAsC,CACxC,eAAgB,CAAE,SAAU,EAAM,QAAS,OAAQ,EAAO,OAC1D,YACD,WAEY,CACX,UACA,SACA,OACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vue-slim-tables",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
},
|
|
14
14
|
"./stylesheets": "dist/style.css",
|
|
15
15
|
"./src/ts/index": "./src/ts/index.ts",
|
|
16
|
-
"./filterable": "./src/ts/use/filterable"
|
|
16
|
+
"./filterable": "./src/ts/use/filterable",
|
|
17
|
+
"./dist/vst.umd.js": "./dist/vst.umd.js"
|
|
17
18
|
},
|
|
18
19
|
"scripts": {
|
|
19
20
|
"build": "vite build",
|
|
@@ -34,25 +35,26 @@
|
|
|
34
35
|
"license": "MIT",
|
|
35
36
|
"private": false,
|
|
36
37
|
"devDependencies": {
|
|
37
|
-
"@
|
|
38
|
-
"@typescript-eslint/
|
|
38
|
+
"@babel/types": "^7.17.10",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^5.22.0",
|
|
40
|
+
"@typescript-eslint/parser": "^5.22.0",
|
|
39
41
|
"@vitejs/plugin-vue": "^2.3.1",
|
|
40
|
-
"@vue/test-utils": "^2.0.0-rc.
|
|
42
|
+
"@vue/test-utils": "^2.0.0-rc.21",
|
|
41
43
|
"c8": "^7.11.2",
|
|
42
|
-
"eslint": "^8.
|
|
44
|
+
"eslint": "^8.14.0",
|
|
43
45
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
44
|
-
"eslint-plugin-import": "^2.
|
|
45
|
-
"eslint-plugin-vue": "^8.
|
|
46
|
-
"happy-dom": "^
|
|
47
|
-
"sass": "^1.
|
|
48
|
-
"typescript": "4.6.
|
|
49
|
-
"vite": "^2.9.
|
|
50
|
-
"vite-plugin-dts": "^1.
|
|
51
|
-
"vitest": "^0.
|
|
46
|
+
"eslint-plugin-import": "^2.26.0",
|
|
47
|
+
"eslint-plugin-vue": "^8.7.1",
|
|
48
|
+
"happy-dom": "^3.1.0",
|
|
49
|
+
"sass": "^1.51.0",
|
|
50
|
+
"typescript": "4.6.4",
|
|
51
|
+
"vite": "^2.9.7",
|
|
52
|
+
"vite-plugin-dts": "^1.1.1",
|
|
53
|
+
"vitest": "^0.10.2",
|
|
52
54
|
"vue-eslint-parser": "^8.3.0"
|
|
53
55
|
},
|
|
54
56
|
"dependencies": {
|
|
55
|
-
"vue": "^3.2.
|
|
57
|
+
"vue": "^3.2.33"
|
|
56
58
|
},
|
|
57
59
|
"types": "dist/types/index.d.ts"
|
|
58
60
|
}
|