@frigear-nu/events 0.0.9 → 0.1.0
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/dist/module.json +1 -1
- package/dist/module.mjs +6 -4
- package/dist/runtime/app/components/EventAdminAddonDialog.d.vue.ts +2 -2
- package/dist/runtime/app/components/EventAdminAddonDialog.vue +3 -4
- package/dist/runtime/app/components/EventAdminAddonDialog.vue.d.ts +2 -2
- package/dist/runtime/app/components/EventAdminAddonGroupDialog.d.vue.ts +2 -2
- package/dist/runtime/app/components/EventAdminAddonGroupDialog.vue +3 -4
- package/dist/runtime/app/components/EventAdminAddonGroupDialog.vue.d.ts +2 -2
- package/dist/runtime/app/components/EventAdminAddonGroups.d.vue.ts +8 -8
- package/dist/runtime/app/components/EventAdminAddonGroups.vue +46 -55
- package/dist/runtime/app/components/EventAdminAddonGroups.vue.d.ts +8 -8
- package/dist/runtime/app/components/EventAdminTicketTypeDialog.d.vue.ts +2 -2
- package/dist/runtime/app/components/EventAdminTicketTypeDialog.vue +3 -4
- package/dist/runtime/app/components/EventAdminTicketTypeDialog.vue.d.ts +2 -2
- package/dist/runtime/app/components/EventCard.vue +7 -12
- package/dist/runtime/app/components/EventFormSlideover.d.vue.ts +13 -0
- package/dist/runtime/app/components/EventFormSlideover.vue +70 -0
- package/dist/runtime/app/components/EventFormSlideover.vue.d.ts +13 -0
- package/dist/runtime/app/components/EventTicketCard.vue +5 -7
- package/dist/runtime/app/components/EventTicketPicker.vue +5 -6
- package/dist/runtime/app/composables/index.d.ts +2 -0
- package/dist/runtime/app/composables/index.js +2 -0
- package/dist/runtime/app/composables/useEventActions.d.ts +26 -0
- package/dist/runtime/app/composables/useEventActions.js +61 -0
- package/dist/runtime/app/composables/useEventLinks.d.ts +12 -0
- package/dist/runtime/app/composables/useEventLinks.js +5 -0
- package/dist/runtime/app/composables/useEvents.d.ts +5 -2
- package/dist/runtime/app/pages/admin-event.vue +33 -21
- package/dist/runtime/app/pages/admin.vue +61 -135
- package/dist/runtime/app/pages/event.d.vue.ts +2 -2
- package/dist/runtime/app/pages/event.vue +113 -152
- package/dist/runtime/app/pages/event.vue.d.ts +2 -2
- package/dist/runtime/app/pages/events.vue +33 -31
- package/dist/runtime/app/pages/tickets.vue +21 -28
- package/dist/runtime/app/tabs/Attendees.d.vue.ts +2 -2
- package/dist/runtime/app/tabs/Attendees.vue +64 -60
- package/dist/runtime/app/tabs/Attendees.vue.d.ts +2 -2
- package/dist/runtime/app/tabs/Details.d.vue.ts +2 -2
- package/dist/runtime/app/tabs/Details.vue +4 -5
- package/dist/runtime/app/tabs/Details.vue.d.ts +2 -2
- package/dist/runtime/app/tabs/Tickets.d.vue.ts +2 -2
- package/dist/runtime/app/tabs/Tickets.vue +92 -99
- package/dist/runtime/app/tabs/Tickets.vue.d.ts +2 -2
- package/dist/runtime/app/utils/admin-event.d.ts +9 -12
- package/dist/runtime/app/utils/admin-event.js +0 -17
- package/dist/runtime/app/widgets/UpcomingEvents.vue +7 -9
- package/dist/runtime/app/widgets/UpcomingEventsStat.vue +5 -6
- package/dist/runtime/i18n/lang/da.json +111 -3
- package/dist/runtime/i18n/lang/en.json +111 -3
- package/dist/runtime/menus.js +2 -4
- package/dist/runtime/server/db/schema.postgresql.d.ts +1110 -0
- package/dist/runtime/server/db/schema.postgresql.js +125 -0
- package/dist/runtime/server/utils/admin.d.ts +5 -5
- package/dist/runtime/utils/index.d.ts +1 -0
- package/dist/runtime/utils/index.js +1 -0
- package/dist/runtime/utils/links.d.ts +21 -0
- package/dist/runtime/utils/links.js +12 -0
- package/package.json +21 -21
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { pgTable, text, integer, boolean, jsonb, timestamp, index, uniqueIndex, customType } from "drizzle-orm/pg-core";
|
|
2
|
+
export const events = pgTable("events", {
|
|
3
|
+
/** `evn_` + random id. */
|
|
4
|
+
id: text().primaryKey(),
|
|
5
|
+
slug: text().notNull().unique(),
|
|
6
|
+
name: jsonb().$type().notNull(),
|
|
7
|
+
description: jsonb().$type(),
|
|
8
|
+
/** Markdown body (per locale). */
|
|
9
|
+
body: jsonb().$type(),
|
|
10
|
+
image: text(),
|
|
11
|
+
// A plain `text` column that also holds a `Translated`: strings are stored as they are (so rows written before
|
|
12
|
+
// locations could be translated keep working), per-locale maps as json. No schema change, hence no migration.
|
|
13
|
+
// Kept inline: module-kit lifts each table's columns into the host schema, so helpers declared above would be lost.
|
|
14
|
+
location: customType({
|
|
15
|
+
dataType: () => "text",
|
|
16
|
+
toDriver: (value) => typeof value === "string" ? value : JSON.stringify(value),
|
|
17
|
+
fromDriver: (value) => {
|
|
18
|
+
if (value.startsWith("{")) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(value);
|
|
21
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed;
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
})(),
|
|
28
|
+
locationUrl: text(),
|
|
29
|
+
startsAt: timestamp({ withTimezone: true }).notNull(),
|
|
30
|
+
endsAt: timestamp({ withTimezone: true }),
|
|
31
|
+
/** `draft | published | archived`. Only published events are public. */
|
|
32
|
+
status: text().notNull().default("draft"),
|
|
33
|
+
/** Same shape as `requiresMembership` on a ticket type; applies to every ticket of the event. */
|
|
34
|
+
requiresMembership: jsonb().$type(),
|
|
35
|
+
createdAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
|
|
36
|
+
updatedAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()).$onUpdateFn(() => /* @__PURE__ */ new Date())
|
|
37
|
+
}, (t) => [
|
|
38
|
+
index("event_status_starts_idx").on(t.status, t.startsAt)
|
|
39
|
+
]);
|
|
40
|
+
export const eventTicketTypes = pgTable("event_ticket_types", {
|
|
41
|
+
/** `ttp_` + random id. */
|
|
42
|
+
id: text().primaryKey(),
|
|
43
|
+
eventId: text().notNull().references(() => events.id, { onDelete: "cascade" }),
|
|
44
|
+
/** Stable key within the event (e.g. `default`, `premium`). */
|
|
45
|
+
key: text().notNull(),
|
|
46
|
+
name: jsonb().$type().notNull(),
|
|
47
|
+
description: jsonb().$type(),
|
|
48
|
+
/** Price in minor units; `0` is a free ticket. */
|
|
49
|
+
price: integer().notNull().default(0),
|
|
50
|
+
currency: text().notNull().default("DKK"),
|
|
51
|
+
hidePrice: boolean().notNull().default(false),
|
|
52
|
+
/** Maximum number of sold + reserved tickets; null = unlimited. */
|
|
53
|
+
capacity: integer(),
|
|
54
|
+
saleStartsAt: timestamp({ withTimezone: true }),
|
|
55
|
+
saleEndsAt: timestamp({ withTimezone: true }),
|
|
56
|
+
/** Optional recurring sale season (`yearly`) or fixed `range`, checked on top of `saleStartsAt`/`saleEndsAt`; null = always. */
|
|
57
|
+
saleSchedule: jsonb().$type(),
|
|
58
|
+
maxPerUser: integer().notNull().default(1),
|
|
59
|
+
/** `null` = open to everyone, `'any'` = any active subscription, or a list of plan keys. */
|
|
60
|
+
requiresMembership: jsonb().$type(),
|
|
61
|
+
/**
|
|
62
|
+
* The opposite: holders of these plans can NOT buy this ticket (`'any'` = any active subscription), so a
|
|
63
|
+
* member price and a non-member price can be separate ticket types. `null` = nobody is excluded.
|
|
64
|
+
*/
|
|
65
|
+
excludesMembership: jsonb().$type(),
|
|
66
|
+
isDefault: boolean().notNull().default(false),
|
|
67
|
+
sortOrder: integer().notNull().default(0),
|
|
68
|
+
createdAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
|
|
69
|
+
updatedAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()).$onUpdateFn(() => /* @__PURE__ */ new Date())
|
|
70
|
+
}, (t) => [
|
|
71
|
+
uniqueIndex("event_ticket_type_key_idx").on(t.eventId, t.key)
|
|
72
|
+
]);
|
|
73
|
+
export const eventAddonGroups = pgTable("event_addon_groups", {
|
|
74
|
+
/** `agr_` + random id. */
|
|
75
|
+
id: text().primaryKey(),
|
|
76
|
+
ticketTypeId: text().notNull().references(() => eventTicketTypes.id, { onDelete: "cascade" }),
|
|
77
|
+
title: jsonb().$type().notNull(),
|
|
78
|
+
/** When true, at least one addon of the group must be chosen. */
|
|
79
|
+
required: boolean().notNull().default(false),
|
|
80
|
+
/** When false (the default) at most one addon of the group can be chosen. */
|
|
81
|
+
multiple: boolean().notNull().default(false),
|
|
82
|
+
sortOrder: integer().notNull().default(0)
|
|
83
|
+
}, (t) => [
|
|
84
|
+
index("event_addon_group_ticket_idx").on(t.ticketTypeId)
|
|
85
|
+
]);
|
|
86
|
+
export const eventAddons = pgTable("event_addons", {
|
|
87
|
+
/** `adn_` + random id. */
|
|
88
|
+
id: text().primaryKey(),
|
|
89
|
+
groupId: text().notNull().references(() => eventAddonGroups.id, { onDelete: "cascade" }),
|
|
90
|
+
label: jsonb().$type().notNull(),
|
|
91
|
+
description: jsonb().$type(),
|
|
92
|
+
/** Price in minor units, in the ticket type's currency; `0` is included in the ticket. */
|
|
93
|
+
price: integer().notNull().default(0),
|
|
94
|
+
/** Maximum number of sold + reserved addons; null = unlimited. */
|
|
95
|
+
capacity: integer(),
|
|
96
|
+
sortOrder: integer().notNull().default(0)
|
|
97
|
+
}, (t) => [
|
|
98
|
+
index("event_addon_group_idx").on(t.groupId)
|
|
99
|
+
]);
|
|
100
|
+
export const eventTickets = pgTable("event_tickets", {
|
|
101
|
+
/** `tkt_` + random id. */
|
|
102
|
+
id: text().primaryKey(),
|
|
103
|
+
eventId: text().notNull(),
|
|
104
|
+
ticketTypeId: text().notNull(),
|
|
105
|
+
userId: integer().notNull(),
|
|
106
|
+
/** The payment that covers it; null for free tickets. */
|
|
107
|
+
paymentId: text(),
|
|
108
|
+
/** `pending | paid | cancelled | refunded | expired`. `pending` and `paid` hold a seat. */
|
|
109
|
+
status: text().notNull().default("pending"),
|
|
110
|
+
addons: jsonb().$type().notNull(),
|
|
111
|
+
amount: integer().notNull(),
|
|
112
|
+
currency: text().notNull(),
|
|
113
|
+
/** Unguessable value shown as a QR code and scanned at check-in. */
|
|
114
|
+
code: text().notNull().unique(),
|
|
115
|
+
/** Language the buyer was browsing in; used for mails and payment texts after the purchase. */
|
|
116
|
+
locale: text(),
|
|
117
|
+
checkedInAt: timestamp({ withTimezone: true }),
|
|
118
|
+
checkedInBy: integer(),
|
|
119
|
+
createdAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
|
|
120
|
+
updatedAt: timestamp({ withTimezone: true }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()).$onUpdateFn(() => /* @__PURE__ */ new Date())
|
|
121
|
+
}, (t) => [
|
|
122
|
+
index("event_ticket_event_idx").on(t.eventId, t.status),
|
|
123
|
+
index("event_ticket_user_idx").on(t.userId),
|
|
124
|
+
index("event_ticket_payment_idx").on(t.paymentId)
|
|
125
|
+
]);
|
|
@@ -20,25 +20,25 @@ export declare const eventPatchSchema: z.ZodObject<{
|
|
|
20
20
|
name: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
|
|
21
21
|
[k: string]: string;
|
|
22
22
|
}, Record<string, string>>>]>>;
|
|
23
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
23
24
|
status: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
|
|
24
25
|
draft: "draft";
|
|
25
26
|
published: "published";
|
|
26
27
|
archived: "archived";
|
|
27
28
|
}>>>;
|
|
28
|
-
|
|
29
|
-
description: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
|
|
29
|
+
body: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
|
|
30
30
|
[k: string]: string;
|
|
31
31
|
}, Record<string, string>>>]>>>>;
|
|
32
|
-
|
|
32
|
+
description: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
|
|
33
33
|
[k: string]: string;
|
|
34
34
|
}, Record<string, string>>>]>>>>;
|
|
35
35
|
image: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
36
|
+
startsAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
36
37
|
location: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodRecord<z.ZodString, z.ZodString>, z.ZodTransform<{
|
|
37
38
|
[k: string]: string;
|
|
38
39
|
}, Record<string, string>>>]>>>>;
|
|
39
|
-
locationUrl: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
40
|
-
startsAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
|
|
41
40
|
endsAt: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
41
|
+
locationUrl: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
42
42
|
requiresMembership: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodLiteral<"any">, z.ZodArray<z.ZodString>]>>>>;
|
|
43
43
|
}, z.core.$strip>;
|
|
44
44
|
export declare function patchEventRow(id: string, patch: z.output<typeof eventPatchSchema>): Promise<any>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { translate } from '@frigear-nu/ui/translated';
|
|
2
2
|
import type { MembershipRequirement } from '../types.js';
|
|
3
3
|
export { translate };
|
|
4
|
+
export * from './links.js';
|
|
4
5
|
export type { AddonDto, AddonGroupDto, AuthorizeContext, CheckInResponse, EventDetailDto, EventStatus, EventSummaryDto, MembershipRequirement, ModuleOptions, PurchaseBeforeContext, PurchaseBody, PurchaseResponse, TicketDto, TicketHookContext, TicketStatus, TicketTypeDto, Translated, } from '../types.js';
|
|
5
6
|
/** The currency tickets and add-ons are sold in unless they say otherwise (the column default). */
|
|
6
7
|
export declare const DEFAULT_CURRENCY = "DKK";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { translate } from "@frigear-nu/ui/translated";
|
|
2
2
|
import { formatMoney as formatPrice } from "@frigear-nu/ui/money";
|
|
3
3
|
export { translate };
|
|
4
|
+
export * from "./links.js";
|
|
4
5
|
export const DEFAULT_CURRENCY = "DKK";
|
|
5
6
|
export function normalizeMembership(value) {
|
|
6
7
|
if (value === "any") return "any";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The configured page paths (`public.events.pages`), each possibly with a `:slug` / `:id` param. */
|
|
2
|
+
export type EventPages = {
|
|
3
|
+
events?: string;
|
|
4
|
+
event?: string;
|
|
5
|
+
tickets?: string;
|
|
6
|
+
admin?: string;
|
|
7
|
+
adminEvent?: string;
|
|
8
|
+
};
|
|
9
|
+
/** Fills a `:param` of a page path with a URL-safe value. */
|
|
10
|
+
export declare function fillPath(pattern: string, param: 'slug' | 'id', value: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Builds every link to an event page. All of them go through `localize` (the active locale's prefix, see
|
|
13
|
+
* `useLocaleLink` of `@frigear-nu/ui`), so a visitor browsing `/en/events` stays under `/en` when opening an event.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createEventLinks(pages: EventPages | undefined, localize: (path: string) => string): {
|
|
16
|
+
events: () => string;
|
|
17
|
+
event: (slug: string) => string;
|
|
18
|
+
tickets: () => string;
|
|
19
|
+
admin: () => string;
|
|
20
|
+
adminEvent: (id: string) => string;
|
|
21
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function fillPath(pattern, param, value) {
|
|
2
|
+
return pattern.replace(`:${param}`, encodeURIComponent(value));
|
|
3
|
+
}
|
|
4
|
+
export function createEventLinks(pages, localize) {
|
|
5
|
+
return {
|
|
6
|
+
events: () => localize(pages?.events || "/events"),
|
|
7
|
+
event: (slug) => localize(fillPath(pages?.event || "/events/:slug", "slug", slug)),
|
|
8
|
+
tickets: () => localize(pages?.tickets || "/account/tickets"),
|
|
9
|
+
admin: () => localize(pages?.admin || "/admin/events"),
|
|
10
|
+
adminEvent: (id) => localize(fillPath(pages?.adminEvent || "/admin/events/:id", "id", id))
|
|
11
|
+
};
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frigear-nu/events",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Events with ticket types, addons, capacity, membership requirements, Stripe payments and QR check-in for the frigear ecosystem, built on @frigear-nu/payments.",
|
|
5
5
|
"homepage": "https://docs.frigear.dev/modules/events",
|
|
6
6
|
"repository": {
|
|
@@ -30,17 +30,17 @@
|
|
|
30
30
|
"playground"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@frigear-nu/admin": "0.0
|
|
34
|
-
"@frigear-nu/module-kit": "1.
|
|
35
|
-
"@frigear-nu/payments": "0.0
|
|
36
|
-
"@frigear-nu/stripe": "0.0
|
|
37
|
-
"@frigear-nu/subscriptions": "0.0
|
|
38
|
-
"@frigear-nu/ui": "0.0
|
|
39
|
-
"@frigear-nu/auth": "0.0
|
|
40
|
-
"@frigear-nu/mcp": "0.0
|
|
41
|
-
"@frigear-nu/users": "1.0
|
|
33
|
+
"@frigear-nu/admin": "0.1.0",
|
|
34
|
+
"@frigear-nu/module-kit": "1.1.0",
|
|
35
|
+
"@frigear-nu/payments": "0.1.0",
|
|
36
|
+
"@frigear-nu/stripe": "0.1.0",
|
|
37
|
+
"@frigear-nu/subscriptions": "0.1.0",
|
|
38
|
+
"@frigear-nu/ui": "0.1.0",
|
|
39
|
+
"@frigear-nu/auth": "0.1.0",
|
|
40
|
+
"@frigear-nu/mcp": "0.1.0",
|
|
41
|
+
"@frigear-nu/users": "1.1.0",
|
|
42
42
|
"@libsql/client": "^0.18.0",
|
|
43
|
-
"@nuxt/kit": "^4.6.
|
|
43
|
+
"@nuxt/kit": "^4.6.1",
|
|
44
44
|
"@vueuse/core": "^15.0.0",
|
|
45
45
|
"drizzle-kit": "^0.31.11",
|
|
46
46
|
"drizzle-orm": "^0.45.3",
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
"zod": "^4.6.5"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
|
-
"@frigear-nu/menu": "0.0
|
|
55
|
-
"@frigear-nu/widget": "0.0
|
|
56
|
-
"@nuxt/ui": "^4.
|
|
54
|
+
"@frigear-nu/menu": "0.1.0",
|
|
55
|
+
"@frigear-nu/widget": "0.1.0",
|
|
56
|
+
"@nuxt/ui": "^4.11.2",
|
|
57
57
|
"@nuxthub/core": "^0.10.8"
|
|
58
58
|
},
|
|
59
59
|
"peerDependenciesMeta": {
|
|
@@ -68,21 +68,21 @@
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
|
-
"@frigear-nu/menu": "0.0
|
|
72
|
-
"@frigear-nu/widget": "0.0
|
|
71
|
+
"@frigear-nu/menu": "0.1.0",
|
|
72
|
+
"@frigear-nu/widget": "0.1.0",
|
|
73
73
|
"@nuxt/devtools": "^3.4.2",
|
|
74
74
|
"@nuxt/eslint-config": "^1.17.0",
|
|
75
75
|
"@nuxt/module-builder": "^1.0.3",
|
|
76
|
-
"@nuxt/schema": "^4.6.
|
|
76
|
+
"@nuxt/schema": "^4.6.1",
|
|
77
77
|
"@nuxt/test-utils": "^4.3.2",
|
|
78
|
-
"@nuxt/ui": "^4.11.
|
|
78
|
+
"@nuxt/ui": "^4.11.2",
|
|
79
79
|
"@nuxthub/core": "^0.10.8",
|
|
80
|
-
"@types/node": "
|
|
80
|
+
"@types/node": "^26.6.5",
|
|
81
81
|
"changelogen": "^0.6.2",
|
|
82
|
-
"eslint": "^10.
|
|
82
|
+
"eslint": "^10.12.0",
|
|
83
83
|
"nuxt": "^4.6.1",
|
|
84
84
|
"typescript": "^6.0.3",
|
|
85
|
-
"vitest": "^5.0.
|
|
85
|
+
"vitest": "^5.0.2",
|
|
86
86
|
"vue-tsc": "^3.3.11"
|
|
87
87
|
},
|
|
88
88
|
"scripts": {
|