a homebrewed DnD campaign based in the Honkai: Star Rail universe
hsr honkaistarrail dnd
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rename zod types, update db schemas

- zod types from `<type>Schema` to `z<Type>`

+718 -1027
+1
app/package.json
··· 27 27 "auth:secret": "pnpx auth secret" 28 28 }, 29 29 "dependencies": { 30 + "@better-auth/drizzle-adapter": "catalog:app", 30 31 "@fontsource-variable/fraunces": "catalog:app", 31 32 "@fontsource-variable/suse": "catalog:app", 32 33 "@fontsource-variable/suse-mono": "catalog:app",
+38 -6
app/src/lib/client/resendClient.ts
··· 1 1 import { CONTACT_ADDRESS, CONTACT_NAME, RESEND_KEY } from '$env/static/private' 2 - import { Resend } from 'resend' 2 + import { Resend, type CreateEmailResponse } from 'resend' 3 3 import { dedent } from 'ts-dedent' 4 4 5 5 export const resend = new Resend(RESEND_KEY) ··· 7 7 return `${CONTACT_NAME} <${CONTACT_ADDRESS}>` as const 8 8 } 9 9 10 - export async function sendVerificationEmail(email: string, url: string) { 11 - const anchor = `<a href="${url}">${url}</a>` 10 + function linkAsHtml(url: string) { 11 + return `<a href="${url}">${url}</a>` 12 + } 13 + 14 + export async function sendVerificationEmail(options: { 15 + email: string 16 + url: string 17 + }): Promise<CreateEmailResponse> { 18 + const { email, url } = options 12 19 const htmlBody = dedent`Hello, 13 - Please verify your email address for your Drifting Starlight account with the link below:\n 14 - ${anchor}\n 15 - If you didn't create an account, you can safely ignore this email.\n 20 + Please verify your email address for your Drifting Starlight account with the link below: 21 + 22 + ${linkAsHtml(url)} 23 + 24 + If you didn't create an account, you can safely ignore this email. 25 + 16 26 - Drifting Starlight Team` 17 27 18 28 return await resend.emails.send({ ··· 22 32 html: htmlBody, 23 33 }) 24 34 } 35 + 36 + export async function sendChangeEmailConfirmation(options: { 37 + email: string 38 + url: string 39 + newEmail: string 40 + }): Promise<CreateEmailResponse> { 41 + const { email, url } = options 42 + const htmlBody = dedent`Hello, 43 + Please confirm your email address change for your Drifting Starlight account with the link below: 44 + 45 + ${linkAsHtml(url)} 46 + 47 + - Drifting Starlight Team 48 + ` 49 + 50 + return await resend.emails.send({ 51 + from: getContactEmail(), 52 + to: [email], 53 + subject: 'Confirm your email address change for driftingstarlight.app', 54 + html: htmlBody, 55 + }) 56 + }
-163
app/src/lib/dnd/features.ts
··· 1 - import { AbilityShortSchema, CharacterLevelSchema } from '@starlight/types/dnd' 2 - import { z } from 'zod' 3 - 4 - const RoundBehavior = z.enum(['ceil', 'floor', 'none']) 5 - const NumberBehavior = z.enum(['base', 'override', 'modify', 'minimum', 'maximum', 'multiplier']) 6 - const Proficiency = z.enum(['untrained', 'halfProficient', 'proficient', 'expertise']) 7 - export type Proficiency = z.infer<typeof Proficiency> 8 - 9 - const NumberValue = z.discriminatedUnion('kind', [ 10 - z.object({ 11 - kind: z.literal('flat'), 12 - value: z.int(), 13 - }), 14 - z.object({ 15 - kind: z.literal('detailed'), 16 - flat: z.int().optional(), 17 - characterLevel: CharacterLevelSchema.optional(), 18 - proficiencyBonus: Proficiency.optional(), 19 - roundBehavior: RoundBehavior, 20 - }), 21 - ]) 22 - 23 - const NumberModifier = z.object({ 24 - behavior: NumberBehavior, 25 - value: NumberValue, 26 - }) 27 - 28 - const Damage = z.enum([ 29 - 'acid', 30 - 'bludgeoning', 31 - 'cold', 32 - 'fire', 33 - 'force', 34 - 'lightning', 35 - 'necrotic', 36 - 'piercing', 37 - 'poison', 38 - 'psychic', 39 - 'radiant', 40 - 'slashing', 41 - 'thunder', 42 - ]) 43 - 44 - export const Sense = z.enum(['darkvision', 'blindsight', 'truesight', 'tremorsense']) 45 - 46 - export const AbilityScoreTotalModifier = z.object({ 47 - kind: z.literal('abilityScoreTotal'), 48 - ability: AbilityShortSchema, 49 - ...NumberModifier.shape, 50 - }) 51 - 52 - export const AbilityScoreModifier = z.object({ 53 - kind: z.literal('abilityScore'), 54 - ability: AbilityShortSchema, 55 - value: z.int(), 56 - }) 57 - 58 - export const ActionModifier = z.object({ 59 - kind: z.literal('action'), 60 - actionName: z.string(), 61 - actionType: z.enum(['action', 'bonusAction', 'reaction', 'freeAction']), 62 - description: z.string(), 63 - }) 64 - 65 - export const ArmorClassModifier = z.object({ 66 - kind: 'armorClass', 67 - ...NumberModifier.shape, 68 - }) 69 - 70 - export const AttunementSlotModifier = z.object({ 71 - kind: 'attunementSlot', 72 - ...NumberModifier.shape, 73 - }) 74 - 75 - export const DefenseModifier = z.object({ 76 - kind: z.literal('defense'), 77 - defenseKind: z.enum(['resistance', 'immunity', 'vulnerability']), 78 - defenseAgainst: Damage, 79 - }) 80 - 81 - export const SenseModifier = z.object({ 82 - kind: z.literal('sense'), 83 - sense: Sense, 84 - ...NumberModifier.shape, 85 - }) 86 - 87 - export const HitpointMaxModifier = z.object({ 88 - kind: z.literal('hitpointMax'), 89 - ...NumberModifier.shape, 90 - }) 91 - 92 - export const InitiativeModifier = z.object({ 93 - kind: z.literal('initiative'), 94 - ...NumberModifier.shape, 95 - }) 96 - 97 - export const SavingThrowProficiencyModifier = z.object({ 98 - kind: z.literal('savingThrowProficiency'), 99 - savingThrow: AbilityShortSchema, 100 - proficiency: Proficiency, 101 - }) 102 - 103 - export const SavingThrowModifier = z.object({ 104 - kind: z.literal('savingThrow'), 105 - savingThrow: AbilityShortSchema, 106 - ...NumberModifier.shape, 107 - }) 108 - 109 - export const SkillProficiencyModifier = z.object({ 110 - kind: z.literal('skillProficiency'), 111 - skill: z.string(), // keyof SkillScoresMap 112 - proficiency: Proficiency, 113 - }) 114 - 115 - export const SkillBonusModifier = z.object({ 116 - kind: z.literal('skillBonus'), 117 - skill: z.string(), // keyof SkillScoresMap 118 - ...NumberModifier.shape, 119 - }) 120 - 121 - export const SpeedModifier = z.object({ 122 - kind: z.literal('speed'), 123 - speed: z.enum(['walk', 'fly', 'climb', 'swim', 'burrow']), 124 - ...NumberModifier.shape, 125 - }) 126 - 127 - export const GlobalSpellAttackDcBonusModifier = z.object({ 128 - kind: z.literal('globalSpellAttackDcBonus'), 129 - attackKind: z.enum(['spellAttack', 'spellDc', 'all']), 130 - bonusValue: z.int(), 131 - }) 132 - 133 - export const GlobalWeaponAttackBonusModifier = z.object({ 134 - kind: z.literal('globalWeaponAttackBonus'), 135 - attackKind: z.enum(['melee', 'ranged', 'all']), 136 - bonusValue: z.int(), 137 - }) 138 - 139 - export const FeatureModifier = z.discriminatedUnion('kind', [ 140 - AbilityScoreTotalModifier, 141 - AbilityScoreModifier, 142 - ActionModifier, 143 - ArmorClassModifier, 144 - AttunementSlotModifier, 145 - DefenseModifier, 146 - SenseModifier, 147 - HitpointMaxModifier, 148 - InitiativeModifier, 149 - SavingThrowProficiencyModifier, 150 - SavingThrowModifier, 151 - SkillProficiencyModifier, 152 - SkillBonusModifier, 153 - SpeedModifier, 154 - GlobalSpellAttackDcBonusModifier, 155 - GlobalWeaponAttackBonusModifier, 156 - ]) 157 - 158 - export const Feature = z.object({ 159 - name: z.string(), 160 - level: CharacterLevelSchema, 161 - description: z.string(), 162 - modifiers: z.array(FeatureModifier), 163 - })
+23 -3
app/src/lib/server/auth.ts
··· 5 5 GOOGLE_CLIENT_ID, 6 6 GOOGLE_CLIENT_SECRET, 7 7 } from '$env/static/private' 8 - import { sendVerificationEmail } from '$lib/client/resendClient' 8 + import { sendChangeEmailConfirmation, sendVerificationEmail } from '$lib/client/resendClient' 9 9 import { db } from '$lib/server/db' 10 + import { drizzleAdapter } from '@better-auth/drizzle-adapter' 10 11 import { betterAuth } from 'better-auth' 11 - import { drizzleAdapter } from 'better-auth/adapters/drizzle' 12 12 import { username } from 'better-auth/plugins' 13 13 import { sveltekitCookies } from 'better-auth/svelte-kit' 14 14 ··· 16 16 baseURL: ORIGIN, 17 17 secret: BETTER_AUTH_SECRET, 18 18 database: drizzleAdapter(db, { provider: 'pg' }), 19 + user: { 20 + changeEmail: { 21 + enabled: true, 22 + sendChangeEmailConfirmation: async ({ user, newEmail, url }) => { 23 + await sendChangeEmailConfirmation({ email: user.email, newEmail, url }) 24 + }, 25 + }, 26 + }, 19 27 emailAndPassword: { 20 28 enabled: true, 29 + // https://better-auth.com/docs/authentication/email-password#plugins-that-add-user-fields 30 + customSyntheticUser: ({ coreFields, additionalFields, id }) => ({ 31 + ...coreFields, 32 + // username plugin 33 + // see: https://better-auth.com/docs/plugins/username#schema 34 + username: null, 35 + displayUsername: null, 36 + // additional fields + ID, 37 + // must be last to match database output order 38 + ...additionalFields, 39 + id, 40 + }), 21 41 }, 22 42 emailVerification: { 23 43 sendOnSignUp: true, 24 44 sendOnSignIn: true, 25 45 autoSignInAfterVerification: true, 26 46 sendVerificationEmail: async ({ user, url }) => { 27 - await sendVerificationEmail(user.email, url) 47 + await sendVerificationEmail({ email: user.email, url }) 28 48 }, 29 49 }, 30 50 experimental: {
+1
app/src/lib/server/db/index.ts
··· 5 5 if (DATABASE_URL === '') throw new Error('DATABASE_URL is not set') 6 6 7 7 export const db = drizzle(DATABASE_URL, { schema }) 8 + export type DatabaseConn = typeof db
+126 -53
app/src/lib/server/db/schema.dnd.ts
··· 1 + import { type SpellDuration } from '@starlight/types/dnd' 1 2 import { 3 + boolean, 2 4 integer, 3 - varchar, 5 + jsonb, 4 6 pgTable, 5 - timestamp, 6 7 smallint, 7 - boolean, 8 - json, 9 8 text, 9 + timestamp, 10 + varchar, 10 11 } from 'drizzle-orm/pg-core' 11 12 import { user } from './schema.auth' 12 13 13 - export const sourceMaterial = pgTable('source_material', { 14 + export const sourceBook = pgTable('source_book', { 14 15 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 15 16 name: varchar('name', { length: 255 }).unique().notNull(), 16 17 description: varchar('name', { length: 255 }).notNull(), 18 + isArchived: boolean('is_archived').default(false).notNull(), 17 19 createdAt: timestamp('created_at').defaultNow().notNull(), 20 + archivedAt: timestamp('archived_at'), 18 21 }) 19 22 20 23 export const species = pgTable('species', { 21 24 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 22 - sourceMaterialId: integer('source_material_id') 25 + sourceBookId: integer('source_book_id') 23 26 .notNull() 24 - .references(() => sourceMaterial.id), 27 + .references(() => sourceBook.id, { onDelete: 'cascade' }), 25 28 name: varchar('name', { length: 64 }).notNull(), 26 29 description: varchar('name', { length: 255 }).notNull(), 27 30 creatureType: varchar('creature_name', { length: 32 }).notNull(), ··· 31 34 climbSpeed: smallint('climb_speed').default(0).notNull(), 32 35 flySpeed: smallint('fly_speed').default(0).notNull(), 33 36 burrowSpeed: smallint('burrow_speed').default(0).notNull(), 37 + createdAt: timestamp('created_at').defaultNow().notNull(), 34 38 }) 35 39 40 + // (table) => [ 41 + // check('walk_speed_is_nonnegative', isNonNegative(table.walkSpeed)), 42 + // check('swim_speed_is_nonnegative', isNonNegative(table.swimSpeed)), 43 + // check('climb_speed_is_nonnegative', isNonNegative(table.climbSpeed)), 44 + // check('fly_speed_is_nonnegative', isNonNegative(table.flySpeed)), 45 + // check('burrow_speed_is_nonnegative', isNonNegative(table.burrowSpeed)), 46 + // ], 47 + 36 48 export const speciesFeature = pgTable('species_feature', { 37 49 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 50 + sourceBookId: integer('source_book_id') 51 + .notNull() 52 + .references(() => sourceBook.id, { onDelete: 'cascade' }), 38 53 speciesId: integer('species_id') 39 54 .notNull() 40 - .references(() => species.id), 41 - sourceMaterialId: integer('source_material_id') 42 - .notNull() 43 - .references(() => sourceMaterial.id), 55 + .references(() => species.id, { onDelete: 'cascade' }), 44 56 builtIn: boolean().notNull(), 45 57 name: varchar('name', { length: 255 }).notNull(), 46 58 description: varchar('name', { length: 255 }).notNull(), 47 - logic: json('logic').notNull(), 59 + modifiers: jsonb('modifiers').notNull(), 48 60 }) 49 61 50 - export const damage = pgTable('damage', { 62 + export const playableClass = pgTable('playable_class', { 51 63 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 52 - sourceMaterialId: integer('source_material_id') 64 + sourceBookId: integer('source_book_id') 53 65 .notNull() 54 - .references(() => sourceMaterial.id), 55 - name: varchar('name', { length: 255 }).unique().notNull(), 56 - description: varchar('name', { length: 255 }).notNull(), 66 + .references(() => sourceBook.id, { onDelete: 'cascade' }), 67 + name: varchar('name', { length: 255 }).notNull(), 68 + description: varchar('name', { length: 1024 }).notNull(), 69 + createdAt: timestamp('created_at').defaultNow().notNull(), 57 70 }) 58 71 59 - export const character = pgTable('character', { 72 + export const characterClass = pgTable( 73 + 'character_class', 74 + { 75 + id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 76 + characterId: integer('character_id') 77 + .notNull() 78 + .references(() => character.id), 79 + classId: integer('class') 80 + .notNull() 81 + .references(() => playableClass.id), 82 + level: smallint('level').notNull(), 83 + }, 84 + //(table) => [check('class_level', isBetweenIncl(table.level, 1, 20))], 85 + ) 86 + 87 + export const characterBackground = pgTable('character_background', { 60 88 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 61 - ownerId: varchar('owner_id', { length: 36 }) 62 - .notNull() 63 - .references(() => user.id), 64 - campaignId: integer('campaign_id') 65 - .notNull() 66 - .references(() => campaign.id), 67 - name: varchar('name', { length: 255 }).notNull(), 68 - speciesId: integer('species_id') 69 - .notNull() 70 - .references(() => species.id), 71 - class: varchar('class', { length: 255 }).notNull(), 72 - pronouns: varchar('pronouns', { length: 255 }), 73 - alignment: smallint('alignment'), 74 - age: smallint('age'), 75 - hair: varchar('gender', { length: 255 }), 76 - gender: varchar('gender', { length: 255 }), 77 - height: smallint('height'), 78 - weight: smallint('weight'), 79 - credits: integer('credits'), 80 - createdAt: timestamp('created_at').defaultNow().notNull(), 81 - updatedAt: timestamp('updated_at') 82 - .defaultNow() 83 - .$onUpdate(() => /* @__PURE__ */ new Date()) 84 - .notNull(), 85 89 }) 86 90 87 - export const spell = pgTable('spell', { 91 + export const character = pgTable( 92 + 'character', 93 + { 94 + id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 95 + ownerId: varchar('owner_id', { length: 36 }) 96 + .notNull() 97 + .references(() => user.id), 98 + campaignId: integer('campaign_id').references(() => campaign.id), 99 + name: varchar('name', { length: 255 }).notNull(), 100 + backgroundId: integer('background_id') 101 + .notNull() 102 + .references(() => characterBackground.id), 103 + speciesId: integer('species_id') 104 + .notNull() 105 + .references(() => species.id), 106 + classId: integer('class_id') 107 + .notNull() 108 + .references(() => playableClass.id), 109 + level: integer('level').notNull(), 110 + pronouns: varchar('pronouns', { length: 255 }), 111 + alignment: smallint('alignment'), 112 + age: varchar('height', { length: 255 }), 113 + hair: varchar('hair', { length: 255 }), 114 + gender: varchar('gender', { length: 255 }), 115 + height: varchar('height', { length: 255 }), 116 + weight: varchar('weight', { length: 255 }), 117 + credits: integer('credits').default(0).notNull(), 118 + createdAt: timestamp('created_at').defaultNow().notNull(), 119 + updatedAt: timestamp('updated_at') 120 + .defaultNow() 121 + .$onUpdate(() => /* @__PURE__ */ new Date()) 122 + .notNull(), 123 + }, 124 + // (table) => [ 125 + // check('character_level', isBetweenIncl(table.level, 1, 20)), 126 + // check('age', isNonNegative(table.age)), 127 + // ], 128 + ) 129 + 130 + export const damage = pgTable('damage', { 88 131 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 89 - sourceMaterialId: integer('source_material_id') 132 + sourceBookId: integer('source_book_id') 90 133 .notNull() 91 - .references(() => sourceMaterial.id), 92 - name: varchar('name', { length: 255 }).notNull(), 93 - components: integer().notNull(), 94 - createdAt: timestamp('created_at').defaultNow().notNull(), 95 - updatedAt: timestamp('updated_at') 96 - .defaultNow() 97 - .$onUpdate(() => /* @__PURE__ */ new Date()) 98 - .notNull(), 134 + .references(() => sourceBook.id, { onDelete: 'cascade' }), 135 + name: varchar('name', { length: 255 }).unique().notNull(), 136 + description: varchar('name', { length: 255 }).notNull(), 99 137 }) 100 138 139 + export const spell = pgTable( 140 + 'spell', 141 + { 142 + id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 143 + sourceBookId: integer('source_book_id') 144 + .notNull() 145 + .references(() => sourceBook.id), 146 + name: varchar('name', { length: 255 }).notNull(), 147 + description: varchar('description', { length: 1024 }).notNull(), 148 + level: smallint('level').notNull(), 149 + school: integer('school').notNull(), 150 + components: integer().notNull(), 151 + materialComponents: varchar('material_components', { length: 255 }), 152 + duration: jsonb('duration').$type<SpellDuration>().notNull(), 153 + isRitual: boolean('is_ritual').notNull(), 154 + needsConcentration: boolean('needs_concentration').notNull(), 155 + createdAt: timestamp('created_at').defaultNow().notNull(), 156 + updatedAt: timestamp('updated_at') 157 + .defaultNow() 158 + .$onUpdate(() => /* @__PURE__ */ new Date()) 159 + .notNull(), 160 + }, 161 + // (table) => [check('spell_level', isBetweenIncl(table.level, 0, 9))], 162 + ) 163 + 101 164 export const campaign = pgTable('campaign', { 102 165 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 103 166 ownerId: text('owner_id') ··· 109 172 endedAt: timestamp('ended_at'), 110 173 }) 111 174 112 - export const campaignSession = pgTable('campaign_session', { 175 + export const campaignSourceMaterial = pgTable('campaign_source_material', { 113 176 id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 114 177 campaignId: integer('campaign_id') 115 178 .notNull() 116 179 .references(() => campaign.id), 180 + sourceBookId: integer('source_book_id') 181 + .notNull() 182 + .references(() => sourceBook.id), 183 + }) 184 + 185 + export const campaignSession = pgTable('campaign_session', { 186 + id: integer('id').primaryKey().generatedAlwaysAsIdentity(), 187 + campaignId: integer('campaign_id') 188 + .notNull() 189 + .references(() => campaign.id, { onDelete: 'cascade' }), 117 190 createdAt: timestamp('created_at').defaultNow().notNull(), 118 191 endedAt: timestamp('ended_at'), 119 192 })
+9
app/src/lib/server/db/schema.ts
··· 9 9 return sql<boolean>`${bool ? '1' : '0'}` 10 10 } 11 11 12 + type StringLike = string | { toString(): string } 13 + export function isBetweenIncl(expr: StringLike, min: number, max: number): SQL<string> { 14 + return sql<string>`${expr} >= ${min} AND ${expr} <= ${max}` 15 + } 16 + 17 + export function isNonNegative<T extends string>(expr: T): SQL<`${T} >= 0`> { 18 + return sql`${expr} >= 0` 19 + } 20 + 12 21 export * from './schema.auth' 13 22 export * from './schema.dnd'
+15
app/src/lib/server/queries/getUser.ts
··· 1 + import { db } from '$server/db' 2 + import { user } from '$server/db/schema.auth' 3 + import { eq } from 'drizzle-orm' 4 + 5 + function querySingle<T>(results: T[]) { 6 + return results.length === 0 ? null : results[0] 7 + } 8 + 9 + export async function getUserByUsername(username: string) { 10 + return querySingle(await db.select().from(user).where(eq(user.username, username)).limit(1)) 11 + } 12 + 13 + export async function getUserByEmail(email: string) { 14 + return querySingle(await db.select().from(user).where(eq(user.email, email)).limit(1)) 15 + }
-7
app/src/lib/server/queries/getUserByUsername.ts
··· 1 - import { db } from '$server/db' 2 - import { user } from '$server/db/schema.auth' 3 - import { eq } from 'drizzle-orm' 4 - 5 - export async function getUserByUsername(username: string) { 6 - return await db.select().from(user).where(eq(user.username, username)).limit(1) 7 - }
+1
app/src/lib/server/queries/signInWithCredentials.ts
··· 10 10 headers: Headers, 11 11 ): Promise<void> { 12 12 const { usernameOrEmail } = credentials 13 + // oxlint-disable-next-line eslint(no-useless-escape) 13 14 const emailExpr = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/ 14 15 15 16 if (usernameOrEmail.match(emailExpr)) {
+2 -2
app/src/lib/ui-patterns/ability-card/AbilityCard.svelte
··· 8 8 hit_dc: AbilityRoll, 9 9 damage: DiceRoll, 10 10 element: Element, 11 - components?: SpellComponentLetter[], 11 + components?: SpellComponentAbbr[], 12 12 } 13 13 } 14 14 </script> 15 15 16 16 <script lang="ts"> 17 17 import ElementIcon from '@starlight/icons/element' 18 - import type { DiceRoll, AbilityRoll, SpellComponentLetter } from '@starlight/types/dnd' 18 + import type { DiceRoll, AbilityRoll, SpellComponentAbbr } from '@starlight/types/dnd' 19 19 import { getSpellComponentName } from '@starlight/types/dnd' 20 20 import type { Element, Mechanic } from '@starlight/types/hsr' 21 21 import { CombatText } from '$patterns/combat-text'
+1 -1
app/src/lib/ui-patterns/proficiency/Proficiency.svelte
··· 1 1 <script lang="ts"> 2 2 import type { SvelteHTMLElements } from 'svelte/elements' 3 3 import { cn, tv } from 'tailwind-variants' 4 - import type { Proficiency } from '$lib/dnd/features' 4 + import type { Proficiency } from '@starlight/types/dnd' 5 5 6 6 type SkillProficiencyRootElement = SvelteHTMLElements['div'] 7 7 type SkillProficiencyProps = SkillProficiencyRootElement & {
+2 -2
app/src/lib/ui-patterns/skill-scores/types.ts
··· 1 - import type { AbilityShort } from '@starlight/types/dnd' 1 + import type { AbilityAbbr } from '@starlight/types/dnd' 2 2 3 3 export type ProficiencyKind = 'untrained' | 'halfProficient' | 'proficient' | 'expertise' 4 4 ··· 28 28 proficiency: ProficiencyKind 29 29 } 30 30 31 - export type AbilitySkill = Exclude<AbilityShort, 'CON'> 31 + export type AbilitySkill = Exclude<AbilityAbbr, 'CON'>
-1
app/src/routes/(auth)/signup/+page.server.ts
··· 1 1 import { pageTitle } from '$lib/utils' 2 2 import { auth } from '$server/auth' 3 3 import { signUpSchema } from '$server/form/auth' 4 - import { isEmailAvailable } from '$server/queries/isEmailAvailable' 5 4 import { fail, redirect } from '@sveltejs/kit' 6 5 import { message, superValidate } from 'sveltekit-superforms' 7 6 import { zod4 } from 'sveltekit-superforms/adapters'
+16 -16
app/src/routes/abilities/+page.svelte
··· 1 1 <script lang="ts"> 2 2 import { AbilityCard } from '$patterns/ability-card' 3 - import { Checkbox, CheckboxGroup, CheckboxGroupLabel } from '$ui/checkbox' 3 + import { Checkbox } from '$ui/checkbox' 4 4 import { PageLayout } from '$ui/site' 5 5 import type { PageProps } from './$types' 6 6 ··· 31 31 "col-span-2 h-full", 32 32 "flex flex-col gap-8", 33 33 ]}> 34 - <CheckboxGroup name="offensive" bind:value={offensive}> 35 - <CheckboxGroupLabel>Offensive</CheckboxGroupLabel> 36 - <Checkbox label="Single Target" value="single-target" /> 37 - <Checkbox label="AoE" value="aoe" /> 38 - <Checkbox label="Bounce" value="bounce" /> 39 - <Checkbox label="Blast" value="blast" /> 40 - <Checkbox label="Impair" value="impair" /> 41 - </CheckboxGroup> 42 - <CheckboxGroup name="defensive" bind:value={defensive}> 43 - <CheckboxGroupLabel>Defensive</CheckboxGroupLabel> 44 - <Checkbox label="Support" value="support" /> 45 - <Checkbox label="Restore" value="restore" /> 46 - <Checkbox label="Enhance" value="enhance" /> 47 - <Checkbox label="Defense" value="defense" /> 48 - </CheckboxGroup> 34 + <Checkbox.Group name="offensive" bind:value={offensive}> 35 + <Checkbox.GroupLabel>Offensive</Checkbox.GroupLabel> 36 + <Checkbox.Item label="Single Target" value="single-target" /> 37 + <Checkbox.Item label="AoE" value="aoe" /> 38 + <Checkbox.Item label="Bounce" value="bounce" /> 39 + <Checkbox.Item label="Blast" value="blast" /> 40 + <Checkbox.Item label="Impair" value="impair" /> 41 + </Checkbox.Group> 42 + <Checkbox.Group name="defensive" bind:value={defensive}> 43 + <Checkbox.GroupLabel>Defensive</Checkbox.GroupLabel> 44 + <Checkbox.Item label="Support" value="support" /> 45 + <Checkbox.Item label="Restore" value="restore" /> 46 + <Checkbox.Item label="Enhance" value="enhance" /> 47 + <Checkbox.Item label="Defense" value="defense" /> 48 + </Checkbox.Group> 49 49 </aside> 50 50 51 51 <section class={[
+2 -2
app/src/routes/classes/new/+page.server.ts
··· 1 1 import { pageTitle } from '$lib/utils' 2 - import { AbilityShortArray, getAbilityDesc, getAbilityName } from '@starlight/types/dnd' 2 + import { AbilityAbbrArray, getAbilityDesc, getAbilityName } from '@starlight/types/dnd' 3 3 import type { PageServerLoad } from './$types' 4 4 5 5 export const load: PageServerLoad = async () => { ··· 7 7 meta: { 8 8 pageTitle: pageTitle('Register a new class'), 9 9 }, 10 - abilities: AbilityShortArray.map((ability) => ({ 10 + abilities: AbilityAbbrArray.map((ability) => ({ 11 11 title: getAbilityName(ability), 12 12 desc: getAbilityDesc(ability), 13 13 })),
+2 -2
app/src/routes/species/new/+page.server.ts
··· 1 1 import { pageTitle } from '$lib/utils' 2 - import { AbilityShortArray, getAbilityName, getAbilityDesc } from '@starlight/types/dnd' 2 + import { getAbilityName, getAbilityDesc, AbilityAbbrArray } from '@starlight/types/dnd' 3 3 import type { PageServerLoad } from './$types' 4 4 5 5 export const load: PageServerLoad = async () => { ··· 7 7 meta: { 8 8 pageTitle: pageTitle('Register a new species'), 9 9 }, 10 - abilities: AbilityShortArray.map((ability) => ({ 10 + abilities: AbilityAbbrArray.map((ability) => ({ 11 11 title: getAbilityName(ability), 12 12 desc: getAbilityDesc(ability), 13 13 })),
+3 -5
app/src/routes/users/[username]/+page.server.ts
··· 1 1 import { pageTitle } from '$lib/utils' 2 - import { getUserByUsername } from '$server/queries/getUserByUsername' 2 + import { getUserByUsername } from '$server/queries/getUser' 3 3 import type { PageServerLoad } from './$types' 4 4 5 5 export const load: PageServerLoad = async ({ params }) => { 6 - const query = await getUserByUsername(params.username) 7 - const queryResult = query.length === 0 ? null : query[0] 8 - 6 + const userQuery = await getUserByUsername(params.username) 9 7 return { 10 - userQuery: queryResult, 8 + userQuery, 11 9 meta: { 12 10 pageTitle: pageTitle(params.username), 13 11 },
+3 -7
package.json
··· 2 2 "name": "@starlight/root", 3 3 "version": "0.0.0", 4 4 "private": true, 5 - "workspaces": [ 6 - "packages/**", 7 - "app/" 8 - ], 9 5 "type": "module", 10 6 "scripts": { 11 7 "clean": "rm -rf ./node_modules ./pnpm-lock.yaml", 12 8 "reinstall": "pnpm run clean && pnpm install", 13 - "dev": "pnpm --filter \"app\" dev", 9 + "dev": "pnpm --filter \"website\" dev", 14 10 "build": "tsdown && pnpm --filter \"icons\" build && pnpm --filter \"website\" build", 15 - "build-storybook": "pnpm --filter \"app\" storybook", 16 - "check": "pnpm --filter \"app\" check", 11 + "build-storybook": "pnpm --filter \"website\" storybook", 12 + "check": "pnpm --filter \"website\" check", 17 13 "fmt": "oxfmt", 18 14 "fmt-ci": "oxfmt --check", 19 15 "lint": "oxlint",
-4
packages/icons/.oxlintrc.json
··· 1 - { 2 - "$schema": "./../../node_modules/oxlint/configuration_schema.json", 3 - "extends": ["./../../.oxlintrc.json"] 4 - }
-4
packages/storybook-utils/.oxlintrc.json
··· 1 - { 2 - "$schema": "./../../node_modules/oxlint/configuration_schema.json", 3 - "extends": ["./../../.oxlintrc.json"] 4 - }
-4
packages/tokenizer/.oxlintrc.json
··· 1 - { 2 - "$schema": "./../../node_modules/oxlint/configuration_schema.json", 3 - "extends": ["./../../.oxlintrc.json"] 4 - }
+2 -2
packages/tokenizer/src/utils.ts
··· 1 - import { ElementSchema, type Element } from '@starlight/types/hsr' 1 + import { zElement, type Element } from '@starlight/types/hsr' 2 2 import type { TokenStringLiteral } from './types' 3 3 4 4 type PredicateFn = (s: string) => boolean ··· 21 21 22 22 // oxlint-disable-next-line typescript-eslint(no-explicit-any) 23 23 export function isElement(s: any): s is Element { 24 - return ElementSchema.safeParse(s).success 24 + return zElement.safeParse(s).success 25 25 } 26 26 27 27 // oxlint-disable-next-line typescript-eslint(no-explicit-any)
-4
packages/types/.oxlintrc.json
··· 1 - { 2 - "$schema": "./../../node_modules/oxlint/configuration_schema.json", 3 - "extends": ["./../../.oxlintrc.json"] 4 - }
+1 -3
packages/types/package.json
··· 28 28 "test": "vitest --coverage", 29 29 "test-ci": "vitest --run --coverage", 30 30 "test-ui": "vitest --ui --coverage", 31 - "fmt": "oxfmt --config=../../.oxfmtrc.json", 32 - "lint": "oxlint", 33 - "fix": "oxlint --fix" 31 + "fmt": "oxfmt --config=../../.oxfmtrc.json" 34 32 }, 35 33 "dependencies": { 36 34 "type-fest": "catalog:dev",
+10 -10
packages/types/src/dnd/ability.ts
··· 1 1 import z from 'zod' 2 2 3 - export const AbilityShortArray = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'] as const 3 + export const AbilityAbbrArray = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'] as const 4 4 export const AbilityNameArray = [ 5 5 'Strength', 6 6 'Dexterity', ··· 11 11 ] as const 12 12 13 13 // runtime types 14 - export const AbilityShortSchema = z.enum(AbilityShortArray) 15 - export const AbilityNameSchema = z.enum(AbilityNameArray) 14 + export const zAbilityAbbr = z.enum(AbilityAbbrArray) 15 + export const zAbilityName = z.enum(AbilityNameArray) 16 16 /** 17 17 * A template literal matching `{ability} {number}` 18 18 */ 19 - export const AbilityRollSchema = z.templateLiteral([AbilityShortSchema, ' ', z.int()]) 19 + export const zAbilityRoll = z.templateLiteral([zAbilityAbbr, ' ', z.int()]) 20 20 21 21 // compile-time types 22 - export type AbilityShort = z.infer<typeof AbilityShortSchema> 23 - export type AbilityName = z.infer<typeof AbilityNameSchema> 24 - export type AbilityRoll = z.infer<typeof AbilityRollSchema> 22 + export type AbilityAbbr = z.infer<typeof zAbilityAbbr> 23 + export type AbilityName = z.infer<typeof zAbilityName> 24 + export type AbilityRoll = z.infer<typeof zAbilityRoll> 25 25 26 26 // lookup 27 27 type LookupRecordKey = { 28 28 name: AbilityName 29 29 desc: string 30 30 } 31 - export const AbilityMap: Record<AbilityShort, LookupRecordKey> = { 31 + export const AbilityMap: Record<AbilityAbbr, LookupRecordKey> = { 32 32 STR: { name: 'Strength', desc: 'A quality of physical prowess and vigor.' }, 33 33 DEX: { name: 'Dexterity', desc: 'A quality of agility and swiftness.' }, 34 34 CON: { name: 'Constitution', desc: 'A quality of resistance and endurance.' }, ··· 36 36 WIS: { name: 'Wisdom', desc: 'A quality of perceptive attunement.' }, 37 37 CHA: { name: 'Charisma', desc: 'A quality of social appeal and glamour.' }, 38 38 } 39 - export function getAbilityName(a: AbilityShort) { 39 + export function getAbilityName(a: AbilityAbbr) { 40 40 return AbilityMap[a].name 41 41 } 42 - export function getAbilityDesc(a: AbilityShort) { 42 + export function getAbilityDesc(a: AbilityAbbr) { 43 43 return AbilityMap[a].desc 44 44 }
+4 -4
packages/types/src/dnd/alignment.ts
··· 14 14 ] as const 15 15 16 16 // runtime types 17 - export const AlignmentShortSchema = z.enum(AlignmentShortArray) 18 - export const AlignmentSchema = z.enum(AlignmentArray) 17 + export const zAlignmentAbbr = z.enum(AlignmentShortArray) 18 + export const zAlignment = z.enum(AlignmentArray) 19 19 20 20 // compile-time types 21 - export type AlignmentShort = z.infer<typeof AlignmentShortSchema> 22 - export type Alignment = z.infer<typeof AlignmentSchema> 21 + export type AlignmentShort = z.infer<typeof zAlignmentAbbr> 22 + export type Alignment = z.infer<typeof zAlignment>
+1 -1
packages/types/src/dnd/character-level.ts
··· 2 2 import { zClosedInterval } from '../zod' 3 3 4 4 // runtime types 5 - export const CharacterLevelSchema = zClosedInterval(1, 20) 5 + export const zCharacterLevel = zClosedInterval(1, 20) 6 6 7 7 // compile-time types 8 8 export type CharacterLevel = IntClosedRange<1, 20>
+6 -6
packages/types/src/dnd/dice-range.ts
··· 2 2 import { zClosedInterval } from '../zod' 3 3 4 4 // runtime types 5 - export const D4Schema = zClosedInterval(1, 4) 6 - export const D6Schema = zClosedInterval(1, 6) 7 - export const D8Schema = zClosedInterval(1, 8) 8 - export const D10Schema = zClosedInterval(1, 10) 9 - export const D12Schema = zClosedInterval(1, 12) 10 - export const D20Schema = zClosedInterval(1, 20) 5 + export const zD4 = zClosedInterval(1, 4) 6 + export const zD6 = zClosedInterval(1, 6) 7 + export const zD8 = zClosedInterval(1, 8) 8 + export const zD10 = zClosedInterval(1, 10) 9 + export const zD12 = zClosedInterval(1, 12) 10 + export const zD20 = zClosedInterval(1, 20) 11 11 12 12 // compile-time types 13 13 export type D4 = IntClosedRange<1, 4>
+14 -18
packages/types/src/dnd/dice-roll.ts
··· 5 5 } 6 6 7 7 // runtime types 8 - export const D4RollSchema = zDiceRollSchema(4) 9 - export const D6RollSchema = zDiceRollSchema(6) 10 - export const D8RollSchema = zDiceRollSchema(8) 11 - export const D10RollSchema = zDiceRollSchema(10) 12 - export const D12RollSchema = zDiceRollSchema(12) 13 - export const D20RollSchema = zDiceRollSchema(20) 14 - export const DiceRollSchema = z.templateLiteral([ 15 - z.int().gte(1), 16 - 'd', 17 - z.literal([4, 6, 8, 10, 12, 20]), 18 - ]) 8 + export const zD4Roll = zDiceRollSchema(4) 9 + export const zD6Roll = zDiceRollSchema(6) 10 + export const zD8Roll = zDiceRollSchema(8) 11 + export const zD10Roll = zDiceRollSchema(10) 12 + export const zD12Roll = zDiceRollSchema(12) 13 + export const zD20Roll = zDiceRollSchema(20) 14 + export const zDiceRoll = z.templateLiteral([z.int().gte(1), 'd', z.literal([4, 6, 8, 10, 12, 20])]) 19 15 20 16 // compile-time types 21 - export type D4Roll = z.infer<typeof D4RollSchema> 22 - export type D6Roll = z.infer<typeof D6RollSchema> 23 - export type D8Roll = z.infer<typeof D8RollSchema> 24 - export type D10Roll = z.infer<typeof D10RollSchema> 25 - export type D12Roll = z.infer<typeof D12RollSchema> 26 - export type D20Roll = z.infer<typeof D20RollSchema> 27 - export type DiceRoll = z.infer<typeof DiceRollSchema> 17 + export type D4Roll = z.infer<typeof zD4Roll> 18 + export type D6Roll = z.infer<typeof zD6Roll> 19 + export type D8Roll = z.infer<typeof zD8Roll> 20 + export type D10Roll = z.infer<typeof zD10Roll> 21 + export type D12Roll = z.infer<typeof zD12Roll> 22 + export type D20Roll = z.infer<typeof zD20Roll> 23 + export type DiceRoll = z.infer<typeof zDiceRoll>
+162
packages/types/src/dnd/feature.ts
··· 1 + import { zAbilityAbbr, zCharacterLevel } from '@starlight/types/dnd' 2 + import { z } from 'zod' 3 + import { zProficiency } from './proficiency' 4 + 5 + const RoundBehavior = z.enum(['ceil', 'floor', 'none']) 6 + const NumberBehavior = z.enum(['base', 'override', 'modify', 'minimum', 'maximum', 'multiplier']) 7 + 8 + const NumberValue = z.discriminatedUnion('kind', [ 9 + z.object({ 10 + kind: z.literal('flat'), 11 + value: z.int(), 12 + }), 13 + z.object({ 14 + kind: z.literal('detailed'), 15 + flat: z.int().optional(), 16 + roundBehavior: RoundBehavior, 17 + characterLevel: zCharacterLevel.optional(), 18 + proficiencyBonus: zProficiency.optional(), 19 + }), 20 + ]) 21 + 22 + const NumberMod = z.object({ 23 + behavior: NumberBehavior, 24 + value: NumberValue, 25 + }) 26 + 27 + const Damage = z.enum([ 28 + 'acid', 29 + 'bludgeoning', 30 + 'cold', 31 + 'fire', 32 + 'force', 33 + 'lightning', 34 + 'necrotic', 35 + 'piercing', 36 + 'poison', 37 + 'psychic', 38 + 'radiant', 39 + 'slashing', 40 + 'thunder', 41 + ]) 42 + 43 + export const Sense = z.enum(['darkvision', 'blindsight', 'truesight', 'tremorsense']) 44 + 45 + export const AbilityScoreTotalMod = z.object({ 46 + kind: z.literal('abilityScoreTotal'), 47 + ability: zAbilityAbbr, 48 + ...NumberMod.shape, 49 + }) 50 + 51 + export const AbilityScoreMod = z.object({ 52 + kind: z.literal('abilityScore'), 53 + ability: zAbilityAbbr, 54 + value: z.int(), 55 + }) 56 + 57 + export const ActionMod = z.object({ 58 + kind: z.literal('action'), 59 + actionName: z.string(), 60 + actionType: z.enum(['action', 'bonusAction', 'reaction', 'freeAction']), 61 + description: z.string(), 62 + }) 63 + 64 + export const ArmorClassMod = z.object({ 65 + kind: z.literal('armorClass'), 66 + ...NumberMod.shape, 67 + }) 68 + 69 + export const AttunementSlotMod = z.object({ 70 + kind: z.literal('attunementSlot'), 71 + ...NumberMod.shape, 72 + }) 73 + 74 + export const DefenseMod = z.object({ 75 + kind: z.literal('defense'), 76 + defenseKind: z.enum(['resistance', 'immunity', 'vulnerability']), 77 + defenseAgainst: Damage, 78 + }) 79 + 80 + export const SenseMod = z.object({ 81 + kind: z.literal('sense'), 82 + sense: Sense, 83 + ...NumberMod.shape, 84 + }) 85 + 86 + export const HitpointMaxMod = z.object({ 87 + kind: z.literal('hitpointMax'), 88 + ...NumberMod.shape, 89 + }) 90 + 91 + export const InitiativeMod = z.object({ 92 + kind: z.literal('initiative'), 93 + ...NumberMod.shape, 94 + }) 95 + 96 + export const SavingThrowProficiencyMod = z.object({ 97 + kind: z.literal('savingThrowProficiency'), 98 + savingThrow: zAbilityAbbr, 99 + proficiency: zProficiency, 100 + }) 101 + 102 + export const SavingThrowMod = z.object({ 103 + kind: z.literal('savingThrow'), 104 + savingThrow: zAbilityAbbr, 105 + ...NumberMod.shape, 106 + }) 107 + 108 + export const SkillProficiencyMod = z.object({ 109 + kind: z.literal('skillProficiency'), 110 + skill: z.string(), // keyof SkillScoresMap 111 + proficiency: zProficiency, 112 + }) 113 + 114 + export const SkillBonusMod = z.object({ 115 + kind: z.literal('skillBonus'), 116 + skill: z.string(), // keyof SkillScoresMap 117 + ...NumberMod.shape, 118 + }) 119 + 120 + export const SpeedMod = z.object({ 121 + kind: z.literal('speed'), 122 + speed: z.enum(['walk', 'fly', 'climb', 'swim', 'burrow']), 123 + ...NumberMod.shape, 124 + }) 125 + 126 + export const GlobalSpellAttackDcBonusMod = z.object({ 127 + kind: z.literal('globalSpellAttackDcBonus'), 128 + attackKind: z.enum(['spellAttack', 'spellDc', 'all']), 129 + bonusValue: z.int().nonnegative(), 130 + }) 131 + 132 + export const GlobalWeaponAttackBonusMod = z.object({ 133 + kind: z.literal('globalWeaponAttackBonus'), 134 + attackKind: z.enum(['melee', 'ranged', 'all']), 135 + bonusValue: z.int().nonnegative(), 136 + }) 137 + 138 + export const FeatureMod = z.discriminatedUnion('kind', [ 139 + AbilityScoreTotalMod, 140 + AbilityScoreMod, 141 + ActionMod, 142 + ArmorClassMod, 143 + AttunementSlotMod, 144 + DefenseMod, 145 + SenseMod, 146 + HitpointMaxMod, 147 + InitiativeMod, 148 + SavingThrowProficiencyMod, 149 + SavingThrowMod, 150 + SkillProficiencyMod, 151 + SkillBonusMod, 152 + SpeedMod, 153 + GlobalSpellAttackDcBonusMod, 154 + GlobalWeaponAttackBonusMod, 155 + ]) 156 + 157 + export const Feature = z.object({ 158 + name: z.string(), 159 + description: z.string(), 160 + level: zCharacterLevel, 161 + modifiers: z.array(FeatureMod).min(0), 162 + })
+4
packages/types/src/dnd/index.ts
··· 3 3 export * from './character-level' 4 4 export * from './dice-roll' 5 5 export * from './dice-range' 6 + export * from './feature' 6 7 export * from './spell-component' 8 + export * from './spell-duration' 9 + export * from './spell-range' 7 10 export * from './spell-school' 11 + export * from './proficiency'
+4
packages/types/src/dnd/proficiency.ts
··· 1 + import z from 'zod' 2 + 3 + export const zProficiency = z.enum(['untrained', 'halfProficient', 'proficient', 'expertise']) 4 + export type Proficiency = z.infer<typeof zProficiency>
+7 -7
packages/types/src/dnd/spell-component.ts
··· 1 1 import z from 'zod' 2 2 3 - export const SpellComponentLetterArray = ['V', 'S', 'M'] as const 3 + export const SpellComponentAbbrArray = ['V', 'S', 'M'] as const 4 4 export const SpellComponentNameArray = ['Verbal', 'Somatic', 'Material'] as const 5 5 6 6 // runtime types 7 - export const SpellComponentLetterSchema = z.enum(SpellComponentLetterArray) 8 - export const SpellComponentNameSchema = z.enum(SpellComponentNameArray) 7 + export const zSpellComponentAbbr = z.enum(SpellComponentAbbrArray) 8 + export const zSpellComponentName = z.enum(SpellComponentNameArray) 9 9 10 10 // compile-time types 11 - export type SpellComponentLetter = z.infer<typeof SpellComponentLetterSchema> 12 - export type SpellComponentName = z.infer<typeof SpellComponentNameSchema> 11 + export type SpellComponentAbbr = z.infer<typeof zSpellComponentAbbr> 12 + export type SpellComponentName = z.infer<typeof zSpellComponentName> 13 13 14 14 // lookup 15 15 type LookupRecordKey = { 16 16 name: SpellComponentName 17 17 } 18 - const SpellComponentMap: Record<SpellComponentLetter, LookupRecordKey> = { 18 + const SpellComponentMap: Record<SpellComponentAbbr, LookupRecordKey> = { 19 19 V: { name: 'Verbal' }, 20 20 S: { name: 'Somatic' }, 21 21 M: { name: 'Material' }, 22 22 } 23 - export function getSpellComponentName(s: SpellComponentLetter) { 23 + export function getSpellComponentName(s: SpellComponentAbbr) { 24 24 return SpellComponentMap[s].name 25 25 }
+20 -14
packages/types/src/dnd/spell-duration.ts
··· 1 1 import z from 'zod' 2 2 3 3 /* runtime types */ 4 - export const ConcentrationSchema = z.literal('Concentration') 5 - export const InstantaneousSchema = z.literal('Instantaneous') 6 - export const TimeUnitSchema = z.enum(['second', 'minute', 'hour', 'day']) 7 - export const TimeSpanSchema = z.object({ 4 + export const zConcentration = z.object({ 5 + kind: z.literal('concentration'), 6 + }) 7 + export const zInstantaneous = z.object({ 8 + kind: z.literal('instantaneous'), 9 + }) 10 + 11 + export const zTimeUnit = z.enum(['second', 'minute', 'hour', 'day']) 12 + export const zTimeSpan = z.object({ 13 + kind: z.literal('timespan'), 8 14 requiresConcentration: z.boolean().optional().default(false), 9 15 amount: z.int(), 10 - unit: TimeUnitSchema, 16 + unit: zTimeUnit, 11 17 }) 12 18 13 - export const SpellDurationSchema = z.union([ 14 - ConcentrationSchema, 15 - InstantaneousSchema, 16 - TimeSpanSchema, 19 + export const zSpellDuration = z.discriminatedUnion('kind', [ 20 + zConcentration, 21 + zInstantaneous, 22 + zTimeSpan, 17 23 ]) 18 24 19 25 /* compile-time types */ 20 - export type Concentration = z.infer<typeof ConcentrationSchema> 21 - export type Instantaneous = z.infer<typeof InstantaneousSchema> 22 - export type TimeUnit = z.infer<typeof TimeUnitSchema> 23 - export type TimeSpan = z.infer<typeof TimeSpanSchema> 24 - export type SpellDuration = z.infer<typeof SpellDurationSchema> 26 + export type Concentration = z.infer<typeof zConcentration> 27 + export type Instantaneous = z.infer<typeof zInstantaneous> 28 + export type TimeUnit = z.infer<typeof zTimeUnit> 29 + export type TimeSpan = z.infer<typeof zTimeSpan> 30 + export type SpellDuration = z.infer<typeof zSpellDuration>
+12 -21
packages/types/src/dnd/spell-range.ts
··· 1 1 import z from 'zod' 2 2 3 3 /* runtime types */ 4 - export const SpellTouchSchema = z.literal('Touch') 5 - export const SpellSelfSchema = z.literal('Self') 4 + export const zSpellTouch = z.literal('Touch') 5 + export const zSpellSelf = z.literal('Self') 6 6 7 - const SpellDistanceFeetSchema = z.literal('feet') 8 - export const SpellDistanceLiteralSchema = z.templateLiteral([ 9 - z.int().gte(1), 10 - ' ', 11 - SpellDistanceFeetSchema, 12 - ]) 13 - export const SpellDistanceSchema = z.object({ 7 + const zSpellDistanceFeet = z.literal('feet') 8 + export const zSpellDistanceLiteral = z.templateLiteral([z.int().gte(1), ' ', zSpellDistanceFeet]) 9 + export const zSpellDistance = z.object({ 14 10 amount: z.int().gte(1), 15 - unit: SpellDistanceFeetSchema, 11 + unit: zSpellDistanceFeet, 16 12 }) 17 13 18 - export const SpellRangeSchema = z.union([ 19 - SpellTouchSchema, 20 - SpellSelfSchema, 21 - SpellDistanceLiteralSchema, 22 - SpellDistanceSchema, 23 - ]) 14 + export const zSpellRange = z.union([zSpellTouch, zSpellSelf, zSpellDistanceLiteral, zSpellDistance]) 24 15 25 16 /* compile-time types */ 26 - export type SpellTouch = z.infer<typeof SpellTouchSchema> 27 - export type SpellSelf = z.infer<typeof SpellSelfSchema> 28 - export type SpellDistanceLiteralSchema = z.infer<typeof SpellDistanceLiteralSchema> 29 - export type SpellDistanceSchema = z.infer<typeof SpellDistanceLiteralSchema> 30 - export type SpellRangeSchema = z.infer<typeof SpellRangeSchema> 17 + export type SpellTouch = z.infer<typeof zSpellTouch> 18 + export type SpellSelf = z.infer<typeof zSpellSelf> 19 + export type zSpellDistanceLiteral = z.infer<typeof zSpellDistanceLiteral> 20 + export type zSpellDistance = z.infer<typeof zSpellDistanceLiteral> 21 + export type zSpellRange = z.infer<typeof zSpellRange>
+2 -2
packages/types/src/dnd/spell-school.ts
··· 12 12 ] as const 13 13 14 14 // runtime types 15 - export const SpellSchoolSchema = z.enum(SpellSchoolArray) 15 + export const zSpellSchool = z.enum(SpellSchoolArray) 16 16 17 17 // compile-time types 18 - export type SpellSchool = z.infer<typeof SpellSchoolSchema> 18 + export type SpellSchool = z.infer<typeof zSpellSchool>
+2 -2
packages/types/src/hsr/element.ts
··· 9 9 'quantum', 10 10 'wind', 11 11 ] as const 12 - export const ElementSchema = z.enum(ElementArray) 12 + export const zElement = z.enum(ElementArray) 13 13 14 14 // compile-time types 15 - export type Element = z.infer<typeof ElementSchema> 15 + export type Element = z.infer<typeof zElement> 16 16 17 17 // lookup 18 18 type LookupRecordKey = {
-1
packages/types/src/hsr/index.ts
··· 1 1 export * from './element' 2 2 export * from './mechanic' 3 3 export * from './path' 4 - export * from './species'
+6 -6
packages/types/src/hsr/mechanic.ts
··· 5 5 export const MechanicArray = [...OffenseMechanicArray, ...DefenseMechanicArray] as const 6 6 7 7 // runtime types 8 - export const OffenseMechanicSchema = z.enum(OffenseMechanicArray) 9 - export const DefenseMechanicSchema = z.enum(DefenseMechanicArray) 10 - export const MechanicSchema = z.enum(MechanicArray) 8 + export const zOffenseMechanic = z.enum(OffenseMechanicArray) 9 + export const zDefenseMechanic = z.enum(DefenseMechanicArray) 10 + export const zMechanic = z.enum(MechanicArray) 11 11 12 12 // compile-time types 13 - export type OffenseMechanic = z.infer<typeof OffenseMechanicSchema> 14 - export type DefenseMechanic = z.infer<typeof DefenseMechanicSchema> 15 - export type Mechanic = z.infer<typeof MechanicSchema> 13 + export type OffenseMechanic = z.infer<typeof zOffenseMechanic> 14 + export type DefenseMechanic = z.infer<typeof zDefenseMechanic> 15 + export type Mechanic = z.infer<typeof zMechanic> 16 16 17 17 // lookup 18 18 type LookupRecordKey = {
+8 -6
packages/types/src/hsr/path.ts
··· 1 1 import z from 'zod' 2 2 3 3 // runtime types 4 - export const PathSchema = z.enum([ 4 + export const zPath = z.enum([ 5 5 'Abundance', 6 6 'Beauty', 7 7 'Destruction', ··· 21 21 'Trailblaze', 22 22 'Voracity', 23 23 ]) 24 - export const NonPlayablePathSchema = z.enum([ 24 + 25 + export const zNonPlayablePath = z.enum([ 25 26 'Beauty', 26 27 'Elation', 27 28 'Enigmata', ··· 33 34 'Trailblaze', 34 35 'Voracity', 35 36 ]) 36 - export const PlayablePathSchema = z.enum([ 37 + 38 + export const zPlayablePath = z.enum([ 37 39 'Abundance', 38 40 'Destruction', 39 41 'Erudition', ··· 45 47 ]) 46 48 47 49 // compile-time types 48 - export type Path = z.infer<typeof PathSchema> 49 - export type NonPlayablePath = z.infer<typeof NonPlayablePathSchema> 50 - export type PlayablePath = z.infer<typeof PlayablePathSchema> 50 + export type Path = z.infer<typeof zPath> 51 + export type NonPlayablePath = z.infer<typeof zNonPlayablePath> 52 + export type PlayablePath = z.infer<typeof zPlayablePath>
-14
packages/types/src/hsr/species.ts
··· 1 - import { z } from 'zod' 2 - 3 - // runtime types 4 - export const SpeciesSchema = z.enum([ 5 - 'borisin', 6 - 'foxian', 7 - 'halovian', 8 - 'intellitron', 9 - 'iron-calvary', 10 - 'vidyadhara', 11 - ]) 12 - 13 - // compile-time types 14 - export type Species = z.infer<typeof SpeciesSchema>
+13 -13
packages/types/tests/dnd/ability.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 2 import { 3 - AbilityNameSchema, 4 - AbilityShortSchema, 5 - AbilityRollSchema, 3 + AbilityAbbr, 4 + AbilityName, 6 5 getAbilityName, 7 - AbilityName, 8 - AbilityShort, 9 6 getAbilityDesc, 7 + zAbilityAbbr, 8 + zAbilityName, 9 + zAbilityRoll, 10 10 } from '../../src/dnd/ability' 11 11 12 - describe('AbilityShortSchema', () => { 12 + describe('zAbilityAbbr', () => { 13 13 describe('safeParse()', () => { 14 14 test.for([['STR'], ['DEX'], ['CON'], ['INT'], ['WIS'], ['CHA']])("is ok: '%s'", ([a]) => { 15 - expect(AbilityShortSchema.safeParse(a)).toMatchObject({ 15 + expect(zAbilityAbbr.safeParse(a)).toMatchObject({ 16 16 data: a, 17 17 success: true, 18 18 }) ··· 20 20 }) 21 21 }) 22 22 23 - describe('AbilityNameSchema', () => { 23 + describe('zAbilityName', () => { 24 24 describe('safeParse()', () => { 25 25 test.for([ 26 26 ['Strength'], ··· 30 30 ['Wisdom'], 31 31 ['Charisma'], 32 32 ])("is ok: '%s'", ([a]) => { 33 - expect(AbilityNameSchema.safeParse(a)).toMatchObject({ 33 + expect(zAbilityName.safeParse(a)).toMatchObject({ 34 34 data: a, 35 35 success: true, 36 36 }) ··· 38 38 }) 39 39 }) 40 40 41 - describe('AbilityRollSchema', () => { 41 + describe('zAbilityRoll', () => { 42 42 describe('safeParse()', () => { 43 43 test.for([['STR 10'], ['DEX 10'], ['CON 10'], ['INT 10'], ['WIS 10'], ['CHA 10']])( 44 44 "is ok: '%s'", 45 45 ([s]) => { 46 - expect(AbilityRollSchema.safeParse(s)).toMatchObject({ 46 + expect(zAbilityRoll.safeParse(s)).toMatchObject({ 47 47 data: s, 48 48 success: true, 49 49 }) ··· 61 61 ['INT', 'Intelligence'], 62 62 ['WIS', 'Wisdom'], 63 63 ['CHA', 'Charisma'], 64 - ] as [AbilityShort, AbilityName][])('is ok', ([key, expectedName]) => { 64 + ] as [AbilityAbbr, AbilityName][])('is ok', ([key, expectedName]) => { 65 65 expect(getAbilityName(key)).toEqual(expectedName) 66 66 }) 67 67 }) ··· 74 74 ['INT', 'A quality of reasoning and comprehension.'], 75 75 ['WIS', 'A quality of perceptive attunement.'], 76 76 ['CHA', 'A quality of social appeal and glamour.'], 77 - ] as [AbilityShort, string][])('is ok', ([key, expectedDesc]) => { 77 + ] as [AbilityAbbr, string][])('is ok', ([key, expectedDesc]) => { 78 78 expect(getAbilityDesc(key)).toEqual(expectedDesc) 79 79 }) 80 80 })
+7 -7
packages/types/tests/dnd/alignment.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { AlignmentSchema, AlignmentShortSchema } from '../../src/dnd/alignment' 2 + import { zAlignment, zAlignmentAbbr } from '../../src/dnd/alignment' 3 3 4 - describe('AlignmentShortSchema', () => { 4 + describe('zAlignmentAbbr', () => { 5 5 describe('safeParse()', () => { 6 - test.for([['lg'], ['ng'], ['cg'], ['ln'], ['n'], ['le'], ['ce'], ['ne']])( 6 + test.for([['lg'], ['ng'], ['cg'], ['ln'], ['tn'], ['le'], ['ce'], ['ne']])( 7 7 "is ok: '%s'", 8 8 ([a]) => { 9 - expect(AlignmentShortSchema.safeParse(a)).toMatchObject({ 9 + expect(zAlignmentAbbr.safeParse(a)).toMatchObject({ 10 10 data: a, 11 11 success: true, 12 12 }) ··· 15 15 }) 16 16 }) 17 17 18 - describe('AlignmentSchema', () => { 18 + describe('zAlignment', () => { 19 19 describe('safeParse()', () => { 20 20 test.for([ 21 21 ['Lawful Good'], 22 22 ['Neutral Good'], 23 23 ['Chaotic Good'], 24 24 ['Lawful Neutral'], 25 - ['Neutral'], 25 + ['True Neutral'], 26 26 ['Chaotic Neutral'], 27 27 ['Lawful Evil'], 28 28 ['Neutral Evil'], 29 29 ['Chaotic Evil'], 30 30 ])("is ok: '%s'", ([a]) => { 31 - expect(AlignmentSchema.safeParse(a)).toMatchObject({ 31 + expect(zAlignment.safeParse(a)).toMatchObject({ 32 32 data: a, 33 33 success: true, 34 34 })
+4 -4
packages/types/tests/dnd/character-level.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { CharacterLevelSchema } from '../../src/dnd/character-level' 2 + import { zCharacterLevel } from '../../src/dnd/character-level' 3 3 4 - describe('CharacterLevelSchema', () => { 4 + describe('zCharacterLevel', () => { 5 5 describe('safeParse()', () => { 6 6 test.for([[1], [10], [20]])("is ok: '%i'", ([a]) => { 7 - expect(CharacterLevelSchema.safeParse(a)).toMatchObject({ 7 + expect(zCharacterLevel.safeParse(a)).toMatchObject({ 8 8 data: a, 9 9 success: true, 10 10 }) 11 11 }) 12 12 13 13 test.for([[0], [21]])("errors: '%i'", ([a]) => { 14 - expect(CharacterLevelSchema.safeParse(a)).toMatchObject({ 14 + expect(zCharacterLevel.safeParse(a)).toMatchObject({ 15 15 success: false, 16 16 }) 17 17 })
+19 -26
packages/types/tests/dnd/dice-range.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { 3 - D10Schema, 4 - D12Schema, 5 - D20Schema, 6 - D4Schema, 7 - D6Schema, 8 - D8Schema, 9 - } from '../../src/dnd/dice-range' 2 + import { zD10, zD12, zD20, zD4, zD6, zD8 } from '../../src/dnd/dice-range' 10 3 11 - describe('D4Schema', () => { 4 + describe('zD4', () => { 12 5 describe('safeParse()', () => { 13 6 test.for([[1], [2], [3], [4]])('is ok: %i', ([a]) => { 14 - expect(D4Schema.safeParse(a)).toMatchObject({ 7 + expect(zD4.safeParse(a)).toMatchObject({ 15 8 data: a, 16 9 success: true, 17 10 }) 18 11 }) 19 12 20 13 test.for([[0], [5]])('errors: %i', ([a]) => { 21 - expect(D4Schema.safeParse(a)).toMatchObject({ 14 + expect(zD4.safeParse(a)).toMatchObject({ 22 15 success: false, 23 16 }) 24 17 }) 25 18 }) 26 19 }) 27 20 28 - describe('D6Schema', () => { 21 + describe('zD6', () => { 29 22 describe('safeParse()', () => { 30 23 test.for([[1], [2], [3], [4], [5], [6]])('is ok: %i', ([a]) => { 31 - expect(D6Schema.safeParse(a)).toMatchObject({ 24 + expect(zD6.safeParse(a)).toMatchObject({ 32 25 data: a, 33 26 success: true, 34 27 }) 35 28 }) 36 29 37 30 test.for([[0], [7]])('errors: %i', ([a]) => { 38 - expect(D6Schema.safeParse(a)).toMatchObject({ 31 + expect(zD6.safeParse(a)).toMatchObject({ 39 32 success: false, 40 33 }) 41 34 }) 42 35 }) 43 36 }) 44 37 45 - describe('D8Schema', () => { 38 + describe('zD8', () => { 46 39 describe('safeParse()', () => { 47 40 test.for([[1], [2], [3], [4], [5], [6], [7], [8]])('is ok: %i', ([a]) => { 48 - expect(D8Schema.safeParse(a)).toMatchObject({ 41 + expect(zD8.safeParse(a)).toMatchObject({ 49 42 data: a, 50 43 success: true, 51 44 }) 52 45 }) 53 46 54 47 test.for([[0], [9]])('errors: %i', ([a]) => { 55 - expect(D8Schema.safeParse(a)).toMatchObject({ 48 + expect(zD8.safeParse(a)).toMatchObject({ 56 49 success: false, 57 50 }) 58 51 }) 59 52 }) 60 53 }) 61 54 62 - describe('D10Schema', () => { 55 + describe('zD10', () => { 63 56 describe('safeParse()', () => { 64 57 test.for([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])('is ok: %i', ([a]) => { 65 - expect(D10Schema.safeParse(a)).toMatchObject({ 58 + expect(zD10.safeParse(a)).toMatchObject({ 66 59 data: a, 67 60 success: true, 68 61 }) 69 62 }) 70 63 71 64 test.for([[0], [11]])('errors: %i', ([a]) => { 72 - expect(D10Schema.safeParse(a)).toMatchObject({ 65 + expect(zD10.safeParse(a)).toMatchObject({ 73 66 success: false, 74 67 }) 75 68 }) 76 69 }) 77 70 }) 78 71 79 - describe('D12Schema', () => { 72 + describe('zD12', () => { 80 73 describe('safeParse()', () => { 81 74 test.for([[1], [6], [12]])('is ok: %i', ([a]) => { 82 - expect(D12Schema.safeParse(a)).toMatchObject({ 75 + expect(zD12.safeParse(a)).toMatchObject({ 83 76 data: a, 84 77 success: true, 85 78 }) 86 79 }) 87 80 88 81 test.for([[0], [13]])('errors: %i', ([a]) => { 89 - expect(D12Schema.safeParse(a)).toMatchObject({ 82 + expect(zD12.safeParse(a)).toMatchObject({ 90 83 success: false, 91 84 }) 92 85 }) 93 86 }) 94 87 }) 95 88 96 - describe('D20Schema', () => { 89 + describe('zD20', () => { 97 90 describe('safeParse()', () => { 98 91 test.for([[1], [10], [20]])('is ok: %i', ([a]) => { 99 - expect(D20Schema.safeParse(a)).toMatchObject({ 92 + expect(zD20.safeParse(a)).toMatchObject({ 100 93 data: a, 101 94 success: true, 102 95 }) 103 96 }) 104 97 105 98 test.for([[0], [21]])('errors: %i', ([a]) => { 106 - expect(D20Schema.safeParse(a)).toMatchObject({ 99 + expect(zD20.safeParse(a)).toMatchObject({ 107 100 success: false, 108 101 }) 109 102 })
+7 -7
packages/types/tests/dnd/dice-roll.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { D4RollSchema, DiceRollSchema } from '../../src/dnd/dice-roll' 2 + import { zD4Roll, zDiceRoll } from '../../src/dnd/dice-roll' 3 3 4 - describe('D4RollSchema', () => { 4 + describe('zD4Roll', () => { 5 5 describe('safeParse()', () => { 6 6 test.for([['1d4'], ['4d4'], ['7d4']])('is ok: %s', ([s]) => { 7 - expect(D4RollSchema.safeParse(s)).toMatchObject({ 7 + expect(zD4Roll.safeParse(s)).toMatchObject({ 8 8 data: s, 9 9 success: true, 10 10 }) 11 11 }) 12 12 13 13 test.for([['1.5d4']])('errors: %s', ([s]) => { 14 - expect(D4RollSchema.safeParse(s)).toMatchObject({ 14 + expect(zD4Roll.safeParse(s)).toMatchObject({ 15 15 success: false, 16 16 }) 17 17 }) 18 18 }) 19 19 }) 20 20 21 - describe('DiceRollSchema', () => { 21 + describe('zDiceRoll', () => { 22 22 describe('safeParse()', () => { 23 23 test.for([['1d4'], ['1d6'], ['1d8'], ['1d10'], ['1d12'], ['1d20']])('is ok: %s', ([s]) => { 24 - expect(DiceRollSchema.safeParse(s)).toMatchObject({ 24 + expect(zDiceRoll.safeParse(s)).toMatchObject({ 25 25 data: s, 26 26 success: true, 27 27 }) 28 28 }) 29 29 30 30 test.for([['1d0'], ['1d3'], ['1d99']])('errors: %s', ([s]) => { 31 - expect(DiceRollSchema.safeParse(s)).toMatchObject({ 31 + expect(zDiceRoll.safeParse(s)).toMatchObject({ 32 32 success: false, 33 33 }) 34 34 })
+5 -5
packages/types/tests/dnd/spell-component.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 2 import { 3 3 getSpellComponentName, 4 - SpellComponentLetter, 5 - SpellComponentLetterSchema, 4 + SpellComponentAbbr, 5 + zSpellComponentAbbr, 6 6 SpellComponentName, 7 7 } from '../../src/dnd/spell-component' 8 8 9 9 describe('SpellComponentLetterSchema', () => { 10 10 describe('safeParse()', () => { 11 11 test.for([['V'], ['S'], ['M']])("is ok: '%s'", ([a]) => { 12 - expect(SpellComponentLetterSchema.safeParse(a)).toMatchObject({ 12 + expect(zSpellComponentAbbr.safeParse(a)).toMatchObject({ 13 13 data: a, 14 14 success: true, 15 15 }) 16 16 }) 17 17 18 18 test.for([['v'], ['s'], ['m'], ['Z'], ['A'], ['B'], ['X']])("errors: '%s'", ([a]) => { 19 - expect(SpellComponentLetterSchema.safeParse(a)).toMatchObject({ 19 + expect(zSpellComponentAbbr.safeParse(a)).toMatchObject({ 20 20 success: false, 21 21 }) 22 22 }) ··· 29 29 ['V', 'Verbal'], 30 30 ['S', 'Somatic'], 31 31 ['M', 'Material'], 32 - ] as [SpellComponentLetter, SpellComponentName][])('is ok', ([key, expectedName]) => { 32 + ] as [SpellComponentAbbr, SpellComponentName][])('is ok', ([key, expectedName]) => { 33 33 expect(getSpellComponentName(key)).toEqual(expectedName) 34 34 }) 35 35 })
+31 -31
packages/types/tests/dnd/spell-duration.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 2 import { 3 - ConcentrationSchema, 4 - InstantaneousSchema, 5 - TimeUnitSchema, 6 - TimeSpanSchema, 7 - SpellDurationSchema, 3 + zConcentration, 4 + zInstantaneous, 5 + zTimeUnit, 6 + zTimeSpan, 7 + zSpellDuration, 8 8 } from '../../src/dnd/spell-duration' 9 9 10 - describe('ConcentrationSchema', () => { 10 + describe('zConcentration', () => { 11 11 describe('safeParse()', () => { 12 12 test('is ok', () => { 13 - expect(ConcentrationSchema.safeParse('Concentration')).toMatchObject({ 14 - data: 'Concentration', 13 + expect(zConcentration.safeParse({ kind: 'concentration' })).toMatchObject({ 14 + data: { kind: 'concentration' }, 15 15 success: true, 16 16 }) 17 17 }) 18 18 }) 19 19 }) 20 20 21 - describe('InstantaneousSchema', () => { 21 + describe('zInstantaneous', () => { 22 22 describe('safeParse()', () => { 23 23 test('is ok', () => { 24 - expect(InstantaneousSchema.safeParse('Instantaneous')).toMatchObject({ 25 - data: 'Instantaneous', 24 + expect(zInstantaneous.safeParse({ kind: 'instantaneous' })).toMatchObject({ 25 + data: { kind: 'instantaneous' }, 26 26 success: true, 27 27 }) 28 28 }) 29 29 }) 30 30 }) 31 31 32 - describe('TimeUnitSchema', () => { 32 + describe('zTimeUnit', () => { 33 33 describe('safeParse()', () => { 34 34 test.for([['second'], ['minute'], ['hour'], ['day']])('is ok: %s', ([s]) => { 35 - expect(TimeUnitSchema.safeParse(s)).toMatchObject({ 35 + expect(zTimeUnit.safeParse(s)).toMatchObject({ 36 36 data: s, 37 37 success: true, 38 38 }) ··· 40 40 }) 41 41 }) 42 42 43 - describe('TimeSpanSchema', () => { 43 + describe('zTimeSpan', () => { 44 44 describe('safeParse()', () => { 45 45 test.for([ 46 - [{ amount: 1, unit: 'second' }], 47 - [{ amount: 1, unit: 'minute' }], 48 - [{ amount: 1, unit: 'hour' }], 49 - [{ amount: 1, unit: 'day' }], 50 - [{ requiresConcentration: false, amount: 1, unit: 'hour' }], 51 - [{ requiresConcentration: true, amount: 1, unit: 'day' }], 46 + [{ kind: 'timespan', amount: 1, unit: 'second' }], 47 + [{ kind: 'timespan', amount: 1, unit: 'minute' }], 48 + [{ kind: 'timespan', amount: 1, unit: 'hour' }], 49 + [{ kind: 'timespan', amount: 1, unit: 'day' }], 50 + [{ kind: 'timespan', requiresConcentration: false, amount: 1, unit: 'hour' }], 51 + [{ kind: 'timespan', requiresConcentration: true, amount: 1, unit: 'day' }], 52 52 ])('is ok: %o', ([s]) => { 53 - expect(TimeSpanSchema.safeParse(s)).toMatchObject({ 53 + expect(zTimeSpan.safeParse(s)).toMatchObject({ 54 54 data: s, 55 55 success: true, 56 56 }) ··· 58 58 }) 59 59 }) 60 60 61 - describe('SpellDurationSchema', () => { 61 + describe('zSpellDuration', () => { 62 62 describe('safeParse()', () => { 63 63 test.for([ 64 - ['Concentration'], 65 - ['Instantaneous'], 66 - [{ amount: 1, unit: 'second' }], 67 - [{ amount: 1, unit: 'minute' }], 68 - [{ amount: 1, unit: 'hour' }], 69 - [{ amount: 1, unit: 'day' }], 70 - [{ requiresConcentration: false, amount: 1, unit: 'hour' }], 71 - [{ requiresConcentration: true, amount: 1, unit: 'day' }], 64 + [{ kind: 'concentration' }], 65 + [{ kind: 'instantaneous' }], 66 + [{ kind: 'timespan', amount: 1, unit: 'second' }], 67 + [{ kind: 'timespan', amount: 1, unit: 'minute' }], 68 + [{ kind: 'timespan', amount: 1, unit: 'hour' }], 69 + [{ kind: 'timespan', amount: 1, unit: 'day' }], 70 + [{ kind: 'timespan', requiresConcentration: false, amount: 1, unit: 'hour' }], 71 + [{ kind: 'timespan', requiresConcentration: true, amount: 1, unit: 'day' }], 72 72 ])('is ok: %o', ([s]) => { 73 - expect(SpellDurationSchema.safeParse(s)).toMatchObject({ 73 + expect(zSpellDuration.safeParse(s)).toMatchObject({ 74 74 data: s, 75 75 success: true, 76 76 })
+10 -10
packages/types/tests/dnd/spell-range.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 2 import { 3 - SpellDistanceLiteralSchema, 4 - SpellRangeSchema, 5 - SpellSelfSchema, 6 - SpellTouchSchema, 3 + zSpellDistanceLiteral, 4 + zSpellRange, 5 + zSpellSelf, 6 + zSpellTouch, 7 7 } from '../../src/dnd/spell-range' 8 8 9 9 describe('SpellTouchSchema', () => { 10 10 describe('safeParse()', () => { 11 11 test('is ok', () => { 12 - expect(SpellTouchSchema.safeParse('Touch')).toMatchObject({ 12 + expect(zSpellTouch.safeParse('Touch')).toMatchObject({ 13 13 data: 'Touch', 14 14 success: true, 15 15 }) ··· 20 20 describe('SpellSelfSchema', () => { 21 21 describe('safeParse()', () => { 22 22 test('is ok', () => { 23 - expect(SpellSelfSchema.safeParse('Self')).toMatchObject({ 23 + expect(zSpellSelf.safeParse('Self')).toMatchObject({ 24 24 data: 'Self', 25 25 success: true, 26 26 }) ··· 28 28 }) 29 29 }) 30 30 31 - describe('SpellDistanceLiteralSchema', () => { 31 + describe('zSpellDistanceLiteral', () => { 32 32 describe('safeParse()', () => { 33 33 test('is ok', () => { 34 - expect(SpellDistanceLiteralSchema.safeParse('1 feet')).toMatchObject({ 34 + expect(zSpellDistanceLiteral.safeParse('1 feet')).toMatchObject({ 35 35 data: '1 feet', 36 36 success: true, 37 37 }) ··· 39 39 }) 40 40 }) 41 41 42 - describe('SpellRangeSchema', () => { 42 + describe('zSpellRange', () => { 43 43 describe('safeParse()', () => { 44 44 test.for([['Touch'], ['Self'], ['1 feet'], ['20 feet']])("is ok: '%s'", ([s]) => { 45 - expect(SpellRangeSchema.safeParse(s)).toMatchObject({ 45 + expect(zSpellRange.safeParse(s)).toMatchObject({ 46 46 data: s, 47 47 success: true, 48 48 })
+3 -3
packages/types/tests/dnd/spell-school.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { SpellSchoolSchema } from '../../src/dnd/spell-school' 2 + import { zSpellSchool } from '../../src/dnd/spell-school' 3 3 4 - describe('SpellSchoolSchema', () => { 4 + describe('zSpellSchool', () => { 5 5 describe('safeParse()', () => { 6 6 test.for([ 7 7 ['Abjuration'], ··· 13 13 ['Necromany'], 14 14 ['Transmutation'], 15 15 ])("is ok: '%s'", ([a]) => { 16 - expect(SpellSchoolSchema.safeParse(a)).toMatchObject({ 16 + expect(zSpellSchool.safeParse(a)).toMatchObject({ 17 17 data: a, 18 18 success: true, 19 19 })
+3 -3
packages/types/tests/hsr/element.test.ts
··· 2 2 import { 3 3 Element, 4 4 ElementColor, 5 - ElementSchema, 6 5 getElementName, 7 6 getElementColor, 7 + zElement, 8 8 } from '../../src/hsr/element' 9 9 10 - describe('ElementSchema', () => { 10 + describe('zElement', () => { 11 11 describe('safeParse()', () => { 12 12 test.for([ 13 13 ['fire'], ··· 18 18 ['quantum'], 19 19 ['wind'], 20 20 ])("is ok: '%s'", ([a]) => { 21 - expect(ElementSchema.safeParse(a)).toMatchObject({ 21 + expect(zElement.safeParse(a)).toMatchObject({ 22 22 data: a, 23 23 success: true, 24 24 })
+10 -10
packages/types/tests/hsr/mechanic.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 2 import { 3 - DefenseMechanicSchema, 4 3 getMechanicName, 5 4 Mechanic, 6 - MechanicSchema, 7 - OffenseMechanicSchema, 5 + zDefenseMechanic, 6 + zMechanic, 7 + zOffenseMechanic, 8 8 } from '../../src/hsr/mechanic' 9 9 10 - describe('OffenseMechanicSchema', () => { 10 + describe('zOffenseMechanic', () => { 11 11 describe('safeParse', () => { 12 12 test.for([['single-target'], ['aoe'], ['bounce'], ['blast'], ['impair']])( 13 13 "is ok: '%s'", 14 14 ([s]) => { 15 - expect(OffenseMechanicSchema.safeParse(s)).toMatchObject({ 15 + expect(zOffenseMechanic.safeParse(s)).toMatchObject({ 16 16 data: s, 17 17 success: true, 18 18 }) ··· 20 20 ) 21 21 22 22 test.for([['support'], ['restore'], ['enhance'], ['defense']])("errors: '%s'", ([s]) => { 23 - expect(OffenseMechanicSchema.safeParse(s)).toMatchObject({ 23 + expect(zOffenseMechanic.safeParse(s)).toMatchObject({ 24 24 success: false, 25 25 }) 26 26 }) ··· 30 30 describe('DefenseMechanicSchema', () => { 31 31 describe('safeParse', () => { 32 32 test.for([['support'], ['restore'], ['enhance'], ['defense']])("is ok: '%s'", ([s]) => { 33 - expect(DefenseMechanicSchema.safeParse(s)).toMatchObject({ 33 + expect(zDefenseMechanic.safeParse(s)).toMatchObject({ 34 34 data: s, 35 35 success: true, 36 36 }) ··· 39 39 test.for([['single-target'], ['aoe'], ['bounce'], ['blast'], ['impair']])( 40 40 "errors: '%s'", 41 41 ([s]) => { 42 - expect(DefenseMechanicSchema.safeParse(s)).toMatchObject({ 42 + expect(zDefenseMechanic.safeParse(s)).toMatchObject({ 43 43 success: false, 44 44 }) 45 45 }, ··· 47 47 }) 48 48 }) 49 49 50 - describe('MechanicSchema', () => { 50 + describe('zMechanic', () => { 51 51 describe('safeParse', () => { 52 52 test.for([ 53 53 ['single-target'], ··· 60 60 ['enhance'], 61 61 ['defense'], 62 62 ])("is ok: '%s'", ([s]) => { 63 - expect(MechanicSchema.safeParse(s)).toMatchObject({ 63 + expect(zMechanic.safeParse(s)).toMatchObject({ 64 64 data: s, 65 65 success: true, 66 66 })
+7 -7
packages/types/tests/hsr/path.test.ts
··· 1 1 import { describe, expect, test } from 'vitest' 2 - import { NonPlayablePathSchema, PathSchema, PlayablePathSchema } from '../../src/hsr/path' 2 + import { zNonPlayablePath, zPath, zPlayablePath } from '../../src/hsr/path' 3 3 4 - describe('PathSchema', () => { 4 + describe('zPath', () => { 5 5 describe('safeParse()', () => { 6 6 test.for([ 7 7 ['Abundance'], ··· 23 23 ['Trailblaze'], 24 24 ['Voracity'], 25 25 ])("is ok: '%s'", ([s]) => { 26 - expect(PathSchema.safeParse(s)).toMatchObject({ 26 + expect(zPath.safeParse(s)).toMatchObject({ 27 27 data: s, 28 28 success: true, 29 29 }) ··· 31 31 }) 32 32 }) 33 33 34 - describe('NonPlayablePathSchema', () => { 34 + describe('zNonPlayablePath', () => { 35 35 describe('safeParse()', () => { 36 36 test.for([ 37 37 ['Beauty'], ··· 45 45 ['Trailblaze'], 46 46 ['Voracity'], 47 47 ])("is ok: '%s'", ([s]) => { 48 - expect(NonPlayablePathSchema.safeParse(s)).toMatchObject({ 48 + expect(zNonPlayablePath.safeParse(s)).toMatchObject({ 49 49 data: s, 50 50 success: true, 51 51 }) ··· 53 53 }) 54 54 }) 55 55 56 - describe('PlayablePathSchema', () => { 56 + describe('zPlayablePath', () => { 57 57 describe('safeParse()', () => { 58 58 test.for([ 59 59 ['Abundance'], ··· 65 65 ['Preservation'], 66 66 ['Remembrance'], 67 67 ])("is ok: '%s'", ([s]) => { 68 - expect(PlayablePathSchema.safeParse(s)).toMatchObject({ 68 + expect(zPlayablePath.safeParse(s)).toMatchObject({ 69 69 data: s, 70 70 success: true, 71 71 })
-20
packages/types/tests/hsr/species.test.ts
··· 1 - import { describe, expect, test } from 'vitest' 2 - import { SpeciesSchema } from '../../src/hsr/species' 3 - 4 - describe('SpeciesSchema', () => { 5 - describe('safeParse()', () => { 6 - test.for([ 7 - ['borisin'], 8 - ['foxian'], 9 - ['halovian'], 10 - ['intellitron'], 11 - ['iron-calvary'], 12 - ['vidyadhara'], 13 - ])("is ok: '%s'", ([a]) => { 14 - expect(SpeciesSchema.safeParse(a)).toMatchObject({ 15 - data: a, 16 - success: true, 17 - }) 18 - }) 19 - }) 20 - })
+88 -478
pnpm-lock.yaml
··· 6 6 7 7 catalogs: 8 8 app: 9 + '@better-auth/drizzle-adapter': 10 + specifier: ^1.5.4 11 + version: 1.5.4 9 12 '@fontsource-variable/fraunces': 10 13 specifier: ^5.2.9 11 14 version: 5.2.9 ··· 274 277 275 278 app: 276 279 dependencies: 280 + '@better-auth/drizzle-adapter': 281 + specifier: catalog:app 282 + version: 1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))) 277 283 '@fontsource-variable/fraunces': 278 284 specifier: catalog:app 279 285 version: 5.2.9 ··· 393 399 specifier: catalog:svelte 394 400 version: 2.0.2(svelte@5.53.6)(vitest@4.0.18) 395 401 396 - app2: 397 - devDependencies: 398 - '@better-auth/cli': 399 - specifier: ^1.4.18 400 - version: 1.4.20(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(better-call@1.1.8(zod@4.3.6))(drizzle-kit@0.31.9)(jose@6.1.3)(kysely@0.28.11)(mongodb@7.1.0)(mysql2@3.18.2(@types/node@24.11.0))(nanostores@1.1.1)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(svelte@5.53.6)(vitest@4.0.18) 401 - '@sveltejs/adapter-auto': 402 - specifier: ^7.0.0 403 - version: 7.0.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))) 404 - '@sveltejs/kit': 405 - specifier: ^2.50.2 406 - version: 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 407 - '@sveltejs/vite-plugin-svelte': 408 - specifier: ^6.2.4 409 - version: 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 410 - '@types/node': 411 - specifier: ^24 412 - version: 24.11.0 413 - better-auth: 414 - specifier: ^1.4.18 415 - version: 1.5.0(94a0722d03a14eea835a3a63cb2198b7) 416 - drizzle-kit: 417 - specifier: ^0.31.8 418 - version: 0.31.9 419 - drizzle-orm: 420 - specifier: ^0.45.1 421 - version: 0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 422 - postgres: 423 - specifier: ^3.4.8 424 - version: 3.4.8 425 - svelte: 426 - specifier: ^5.51.0 427 - version: 5.53.6 428 - svelte-check: 429 - specifier: ^4.4.2 430 - version: 4.4.4(picomatch@4.0.3)(svelte@5.53.6)(typescript@5.9.3) 431 - typescript: 432 - specifier: ^5.9.3 433 - version: 5.9.3 434 - vite: 435 - specifier: ^7.3.1 436 - version: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 437 - 438 402 packages/icons: 439 403 dependencies: 440 404 '@lucide/svelte': ··· 710 674 resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} 711 675 engines: {node: '>=18'} 712 676 713 - '@better-auth/cli@1.4.20': 714 - resolution: {integrity: sha512-n38Pv8CuL69D2dYUm7RH52L+y4dwumzsIy2PbrmCagu+22pnzBGwQ79staKYMN8z0zv0lKT09cpsy7MLSS3A6Q==} 715 - hasBin: true 716 - 717 - '@better-auth/core@1.4.20': 718 - resolution: {integrity: sha512-Qf29DOL4LricVJWsPOwg2Ymm+qfYQ14EkyTlnMOp8qKSPzbfMSgRvr6oiwZqmUFxystJ3ft8TzDwTvOSAuNbfA==} 677 + '@better-auth/core@1.5.0': 678 + resolution: {integrity: sha512-nDPmW7I9VGRACEei31fHaZxGwD/yICraDllZ/f25jbWXYaxDaW88RuH1ZhbOUKmGJlZtDxcjN1+YmcVIc1ioNw==} 719 679 peerDependencies: 720 - '@better-auth/utils': 0.3.0 680 + '@better-auth/utils': 0.3.1 721 681 '@better-fetch/fetch': 1.1.21 722 - better-call: 1.1.8 682 + '@cloudflare/workers-types': '>=4' 683 + better-call: 1.3.2 723 684 jose: ^6.1.0 724 685 kysely: ^0.28.5 725 686 nanostores: ^1.0.1 687 + peerDependenciesMeta: 688 + '@cloudflare/workers-types': 689 + optional: true 726 690 727 - '@better-auth/core@1.5.0': 728 - resolution: {integrity: sha512-nDPmW7I9VGRACEei31fHaZxGwD/yICraDllZ/f25jbWXYaxDaW88RuH1ZhbOUKmGJlZtDxcjN1+YmcVIc1ioNw==} 691 + '@better-auth/core@1.5.4': 692 + resolution: {integrity: sha512-k5AdwPRQETZn0vdB60EB9CDxxfllpJXKqVxTjyXIUSRz7delNGlU0cR/iRP3VfVJwvYR1NbekphBDNo+KGoEzQ==} 729 693 peerDependencies: 730 694 '@better-auth/utils': 0.3.1 731 695 '@better-fetch/fetch': 1.1.21 ··· 745 709 '@better-auth/utils': ^0.3.0 746 710 drizzle-orm: '>=0.41.0' 747 711 712 + '@better-auth/drizzle-adapter@1.5.4': 713 + resolution: {integrity: sha512-4M4nMAWrDd3TmpV6dONkJjybBVKRZghe5Oj0NNyDEoXubxastQdO7Sb5B54I1rTx5yoMgsqaB+kbJnu/9UgjQg==} 714 + peerDependencies: 715 + '@better-auth/core': 1.5.4 716 + '@better-auth/utils': ^0.3.0 717 + drizzle-orm: '>=0.41.0' 718 + 748 719 '@better-auth/kysely-adapter@1.5.0': 749 720 resolution: {integrity: sha512-dSC7yzF58YMrn39srrX/LwMLjd11PtTORjn3RKFwuzVCS07mqMZpPkk3XbQW/ZXxXbdUByrgYQo9z9zFCF37RQ==} 750 721 peerDependencies: ··· 773 744 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 774 745 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 775 746 776 - '@better-auth/telemetry@1.4.20': 777 - resolution: {integrity: sha512-ItRo5WswZl6gU8MPRrcn94d7mXk7vbN2zi6gSX8y2QcILRv7aXr6WhxTNKNeh5pnBUfIPdFYZcOnGf1uwgNKxg==} 778 - peerDependencies: 779 - '@better-auth/core': 1.4.20 780 - 781 747 '@better-auth/telemetry@1.5.0': 782 748 resolution: {integrity: sha512-/6ThGSnGPVTR4A/6F8kv65UomDHtM24y2yRZuJfWYbqkve0jn8+WVsxOfQN9bx7J16zIvYw5hJAYCwxoj20BTQ==} 783 749 peerDependencies: 784 750 '@better-auth/core': 1.5.0 785 - 786 - '@better-auth/utils@0.3.0': 787 - resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} 788 751 789 752 '@better-auth/utils@0.3.1': 790 753 resolution: {integrity: sha512-+CGp4UmZSUrHHnpHhLPYu6cV+wSUSvVbZbNykxhUDocpVNTo9uFFxw/NqJlh1iC4wQ9HKKWGCKuZ5wUgS0v6Kg==} ··· 1927 1890 '@prisma/client-runtime-utils@7.4.2': 1928 1891 resolution: {integrity: sha512-cID+rzOEb38VyMsx5LwJMEY4NGIrWCNpKu/0ImbeooQ2Px7TI+kOt7cm0NelxUzF2V41UVVXAmYjANZQtCu1/Q==} 1929 1892 1930 - '@prisma/client@5.22.0': 1931 - resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==} 1932 - engines: {node: '>=16.13'} 1933 - peerDependencies: 1934 - prisma: '*' 1935 - peerDependenciesMeta: 1936 - prisma: 1937 - optional: true 1938 - 1939 1893 '@prisma/client@7.4.2': 1940 1894 resolution: {integrity: sha512-ts2mu+cQHriAhSxngO3StcYubBGTWDtu/4juZhXCUKOwgh26l+s4KD3vT2kMUzFyrYnll9u/3qWrtzRv9CGWzA==} 1941 1895 engines: {node: ^20.19 || ^22.12 || >=24.0} ··· 2647 2601 '@types/mdx@2.0.13': 2648 2602 resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} 2649 2603 2650 - '@types/node@24.11.0': 2651 - resolution: {integrity: sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==} 2652 - 2653 2604 '@types/node@25.3.3': 2654 2605 resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} 2655 2606 ··· 2918 2869 vitest: 2919 2870 optional: true 2920 2871 vue: 2921 - optional: true 2922 - 2923 - better-call@1.1.8: 2924 - resolution: {integrity: sha512-XMQ2rs6FNXasGNfMjzbyroSwKwYbZ/T3IxruSS6U2MJRsSYh3wYtG3o6H00ZlKZ/C/UPOAD97tqgQJNsxyeTXw==} 2925 - peerDependencies: 2926 - zod: ^4.0.0 2927 - peerDependenciesMeta: 2928 - zod: 2929 2872 optional: true 2930 2873 2931 2874 better-call@1.3.2: ··· 4528 4471 seq-queue@0.0.5: 4529 4472 resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} 4530 4473 4531 - set-cookie-parser@2.7.2: 4532 - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} 4533 - 4534 4474 set-cookie-parser@3.0.1: 4535 4475 resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} 4536 4476 ··· 4864 4804 uncrypto@0.1.3: 4865 4805 resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 4866 4806 4867 - undici-types@7.16.0: 4868 - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 4869 - 4870 4807 undici-types@7.18.2: 4871 4808 resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} 4872 4809 ··· 5471 5408 5472 5409 '@bcoe/v8-coverage@1.0.2': {} 5473 5410 5474 - '@better-auth/cli@1.4.20(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(better-call@1.1.8(zod@4.3.6))(drizzle-kit@0.31.9)(jose@6.1.3)(kysely@0.28.11)(mongodb@7.1.0)(mysql2@3.18.2(@types/node@24.11.0))(nanostores@1.1.1)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(svelte@5.53.6)(vitest@4.0.18)': 5411 + '@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)': 5475 5412 dependencies: 5476 - '@babel/core': 7.29.0 5477 - '@babel/preset-react': 7.28.5(@babel/core@7.29.0) 5478 - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) 5479 - '@better-auth/core': 1.4.20(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5480 - '@better-auth/telemetry': 1.4.20(@better-auth/core@1.4.20(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)) 5481 - '@better-auth/utils': 0.3.0 5482 - '@clack/prompts': 0.11.0 5483 - '@mrleebo/prisma-ast': 0.13.1 5484 - '@prisma/client': 5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5485 - '@types/pg': 8.18.0 5486 - better-auth: 1.5.0(f7130ca8cf70b2989acb2679bb2f6b0a) 5487 - better-sqlite3: 12.6.2 5488 - c12: 3.3.3 5489 - chalk: 5.6.2 5490 - commander: 12.1.0 5491 - dotenv: 17.3.1 5492 - drizzle-orm: 0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5493 - open: 10.2.0 5494 - pg: 8.19.0 5495 - prettier: 3.8.1 5496 - prompts: 2.4.2 5497 - semver: 7.7.4 5498 - yocto-spinner: 0.2.3 5499 - zod: 4.3.6 5500 - transitivePeerDependencies: 5501 - - '@aws-sdk/client-rds-data' 5502 - - '@better-fetch/fetch' 5503 - - '@cloudflare/workers-types' 5504 - - '@electric-sql/pglite' 5505 - - '@libsql/client' 5506 - - '@libsql/client-wasm' 5507 - - '@lynx-js/react' 5508 - - '@neondatabase/serverless' 5509 - - '@op-engineering/op-sqlite' 5510 - - '@opentelemetry/api' 5511 - - '@planetscale/database' 5512 - - '@sveltejs/kit' 5513 - - '@tanstack/react-start' 5514 - - '@tanstack/solid-start' 5515 - - '@tidbcloud/serverless' 5516 - - '@types/better-sqlite3' 5517 - - '@types/sql.js' 5518 - - '@vercel/postgres' 5519 - - '@xata.io/client' 5520 - - better-call 5521 - - bun-types 5522 - - drizzle-kit 5523 - - expo-sqlite 5524 - - gel 5525 - - jose 5526 - - knex 5527 - - kysely 5528 - - magicast 5529 - - mongodb 5530 - - mysql2 5531 - - nanostores 5532 - - next 5533 - - pg-native 5534 - - postgres 5535 - - prisma 5536 - - react 5537 - - react-dom 5538 - - solid-js 5539 - - sql.js 5540 - - sqlite3 5541 - - supports-color 5542 - - svelte 5543 - - vitest 5544 - - vue 5545 - 5546 - '@better-auth/core@1.4.20(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)': 5547 - dependencies: 5548 - '@better-auth/utils': 0.3.0 5413 + '@better-auth/utils': 0.3.1 5549 5414 '@better-fetch/fetch': 1.1.21 5550 5415 '@standard-schema/spec': 1.1.0 5551 - better-call: 1.1.8(zod@4.3.6) 5416 + better-call: 1.3.2(zod@4.3.6) 5552 5417 jose: 6.1.3 5553 5418 kysely: 0.28.11 5554 5419 nanostores: 1.1.1 5555 5420 zod: 4.3.6 5421 + optionalDependencies: 5422 + '@cloudflare/workers-types': 4.20260301.1 5556 5423 5557 - '@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)': 5424 + '@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)': 5558 5425 dependencies: 5559 5426 '@better-auth/utils': 0.3.1 5560 5427 '@better-fetch/fetch': 1.1.21 ··· 5567 5434 optionalDependencies: 5568 5435 '@cloudflare/workers-types': 4.20260301.1 5569 5436 5570 - '@better-auth/drizzle-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5571 - dependencies: 5572 - '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5573 - '@better-auth/utils': 0.3.1 5574 - drizzle-orm: 0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5575 - 5576 5437 '@better-auth/drizzle-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5577 5438 dependencies: 5578 5439 '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5579 5440 '@better-auth/utils': 0.3.1 5580 5441 drizzle-orm: 0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5581 5442 5582 - '@better-auth/drizzle-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5443 + '@better-auth/drizzle-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5583 5444 dependencies: 5584 5445 '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5585 5446 '@better-auth/utils': 0.3.1 5586 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5447 + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5587 5448 5588 - '@better-auth/drizzle-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5449 + '@better-auth/drizzle-adapter@1.5.4(@better-auth/core@1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))': 5589 5450 dependencies: 5590 - '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5451 + '@better-auth/core': 1.5.4(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5591 5452 '@better-auth/utils': 0.3.1 5592 5453 drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5593 5454 ··· 5608 5469 '@better-auth/utils': 0.3.1 5609 5470 mongodb: 7.1.0 5610 5471 5611 - '@better-auth/prisma-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))': 5612 - dependencies: 5613 - '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5614 - '@better-auth/utils': 0.3.1 5615 - '@prisma/client': 5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 5616 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 5617 - 5618 5472 '@better-auth/prisma-adapter@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))': 5619 5473 dependencies: 5620 5474 '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) ··· 5622 5476 '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) 5623 5477 prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 5624 5478 5625 - '@better-auth/telemetry@1.4.20(@better-auth/core@1.4.20(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))': 5626 - dependencies: 5627 - '@better-auth/core': 1.4.20(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5628 - '@better-auth/utils': 0.3.0 5629 - '@better-fetch/fetch': 1.1.21 5630 - 5631 5479 '@better-auth/telemetry@1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))': 5632 5480 dependencies: 5633 5481 '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 5634 5482 '@better-auth/utils': 0.3.1 5635 5483 '@better-fetch/fetch': 1.1.21 5636 - 5637 - '@better-auth/utils@0.3.0': {} 5638 5484 5639 5485 '@better-auth/utils@0.3.1': {} 5640 5486 ··· 6343 6189 6344 6190 '@prisma/client-runtime-utils@7.4.2': {} 6345 6191 6346 - '@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))': 6347 - optionalDependencies: 6348 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 6349 - 6350 6192 '@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)': 6351 6193 dependencies: 6352 6194 '@prisma/client-runtime-utils': 7.4.2 ··· 6747 6589 dependencies: 6748 6590 '@sveltejs/kit': 2.53.3(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)) 6749 6591 6750 - '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))': 6751 - dependencies: 6752 - '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 6753 - 6754 6592 '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)))(wrangler@4.67.0(@cloudflare/workers-types@4.20260301.1))': 6755 6593 dependencies: 6756 6594 '@cloudflare/workers-types': 4.20260301.1 ··· 6775 6613 sirv: 3.0.2 6776 6614 svelte: 5.53.6 6777 6615 vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1) 6778 - optionalDependencies: 6779 - typescript: 5.9.3 6780 - 6781 - '@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))': 6782 - dependencies: 6783 - '@standard-schema/spec': 1.1.0 6784 - '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) 6785 - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 6786 - '@types/cookie': 0.6.0 6787 - acorn: 8.16.0 6788 - cookie: 0.6.0 6789 - devalue: 5.6.3 6790 - esm-env: 1.2.2 6791 - kleur: 4.1.5 6792 - magic-string: 0.30.21 6793 - mrmime: 2.0.1 6794 - set-cookie-parser: 3.0.1 6795 - sirv: 3.0.2 6796 - svelte: 5.53.6 6797 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 6798 6616 optionalDependencies: 6799 6617 typescript: 5.9.3 6800 6618 ··· 6829 6647 transitivePeerDependencies: 6830 6648 - typescript 6831 6649 6832 - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))': 6833 - dependencies: 6834 - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 6835 - obug: 2.1.1 6836 - svelte: 5.53.6 6837 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 6838 - 6839 6650 '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1))': 6840 6651 dependencies: 6841 6652 '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)) 6842 6653 obug: 2.1.1 6843 6654 svelte: 5.53.6 6844 6655 vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1) 6845 - 6846 - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))': 6847 - dependencies: 6848 - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 6849 - deepmerge: 4.3.1 6850 - magic-string: 0.30.21 6851 - obug: 2.1.1 6852 - svelte: 5.53.6 6853 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 6854 - vitefu: 1.1.2(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 6855 6656 6856 6657 '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1))': 6857 6658 dependencies: ··· 6991 6792 6992 6793 '@types/mdx@2.0.13': {} 6993 6794 6994 - '@types/node@24.11.0': 6995 - dependencies: 6996 - undici-types: 7.16.0 6997 - 6998 6795 '@types/node@25.3.3': 6999 6796 dependencies: 7000 6797 undici-types: 7.18.2 ··· 7052 6849 dlv: 1.1.3 7053 6850 normalize-url: 8.1.1 7054 6851 validator: 13.15.26 7055 - optional: true 7056 - 7057 - '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18)': 7058 - dependencies: 7059 - '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18) 7060 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 7061 - playwright: 1.58.2 7062 - tinyrainbow: 3.0.3 7063 - vitest: 4.0.18(@types/node@24.11.0)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1) 7064 - transitivePeerDependencies: 7065 - - bufferutil 7066 - - msw 7067 - - utf-8-validate 7068 - - vite 7069 6852 optional: true 7070 6853 7071 6854 '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18)': ··· 7081 6864 - utf-8-validate 7082 6865 - vite 7083 6866 7084 - '@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18)': 7085 - dependencies: 7086 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 7087 - '@vitest/utils': 4.0.18 7088 - magic-string: 0.30.21 7089 - pixelmatch: 7.1.0 7090 - pngjs: 7.0.0 7091 - sirv: 3.0.2 7092 - tinyrainbow: 3.0.3 7093 - vitest: 4.0.18(@types/node@24.11.0)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1) 7094 - ws: 8.19.0 7095 - transitivePeerDependencies: 7096 - - bufferutil 7097 - - msw 7098 - - utf-8-validate 7099 - - vite 7100 - optional: true 7101 - 7102 6867 '@vitest/browser@4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18)': 7103 6868 dependencies: 7104 6869 '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)) ··· 7148 6913 '@vitest/utils': 4.0.18 7149 6914 chai: 6.2.2 7150 6915 tinyrainbow: 3.0.3 7151 - 7152 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))': 7153 - dependencies: 7154 - '@vitest/spy': 4.0.18 7155 - estree-walker: 3.0.3 7156 - magic-string: 0.30.21 7157 - optionalDependencies: 7158 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 7159 - optional: true 7160 6916 7161 6917 '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1))': 7162 6918 dependencies: ··· 7358 7114 7359 7115 balanced-match@4.0.4: {} 7360 7116 7361 - base64-js@1.5.1: {} 7117 + base64-js@1.5.1: 7118 + optional: true 7362 7119 7363 7120 baseline-browser-mapping@2.10.0: {} 7364 7121 ··· 7434 7191 transitivePeerDependencies: 7435 7192 - '@cloudflare/workers-types' 7436 7193 7437 - better-auth@1.5.0(94a0722d03a14eea835a3a63cb2198b7): 7438 - dependencies: 7439 - '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 7440 - '@better-auth/drizzle-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))) 7441 - '@better-auth/kysely-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11) 7442 - '@better-auth/memory-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) 7443 - '@better-auth/mongo-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0) 7444 - '@better-auth/prisma-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7445 - '@better-auth/telemetry': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)) 7446 - '@better-auth/utils': 0.3.1 7447 - '@better-fetch/fetch': 1.1.21 7448 - '@noble/ciphers': 2.1.1 7449 - '@noble/hashes': 2.0.1 7450 - better-call: 1.3.2(zod@4.3.6) 7451 - defu: 6.1.4 7452 - jose: 6.1.3 7453 - kysely: 0.28.11 7454 - nanostores: 1.1.1 7455 - zod: 4.3.6 7456 - optionalDependencies: 7457 - '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) 7458 - '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 7459 - better-sqlite3: 12.6.2 7460 - drizzle-kit: 0.31.9 7461 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7462 - mongodb: 7.1.0 7463 - mysql2: 3.18.2(@types/node@24.11.0) 7464 - pg: 8.19.0 7465 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 7466 - react: 19.2.4 7467 - react-dom: 19.2.4(react@19.2.4) 7468 - svelte: 5.53.6 7469 - vitest: 4.0.18(@types/node@24.11.0)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1) 7470 - transitivePeerDependencies: 7471 - - '@cloudflare/workers-types' 7472 - 7473 - better-auth@1.5.0(f7130ca8cf70b2989acb2679bb2f6b0a): 7474 - dependencies: 7475 - '@better-auth/core': 1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) 7476 - '@better-auth/drizzle-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))) 7477 - '@better-auth/kysely-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11) 7478 - '@better-auth/memory-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) 7479 - '@better-auth/mongo-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(mongodb@7.1.0) 7480 - '@better-auth/prisma-adapter': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7481 - '@better-auth/telemetry': 1.5.0(@better-auth/core@1.5.0(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260301.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)) 7482 - '@better-auth/utils': 0.3.1 7483 - '@better-fetch/fetch': 1.1.21 7484 - '@noble/ciphers': 2.1.1 7485 - '@noble/hashes': 2.0.1 7486 - better-call: 1.3.2(zod@4.3.6) 7487 - defu: 6.1.4 7488 - jose: 6.1.3 7489 - kysely: 0.28.11 7490 - nanostores: 1.1.1 7491 - zod: 4.3.6 7492 - optionalDependencies: 7493 - '@prisma/client': 5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7494 - '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 7495 - better-sqlite3: 12.6.2 7496 - drizzle-kit: 0.31.9 7497 - drizzle-orm: 0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7498 - mongodb: 7.1.0 7499 - mysql2: 3.18.2(@types/node@24.11.0) 7500 - pg: 8.19.0 7501 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 7502 - react: 19.2.4 7503 - react-dom: 19.2.4(react@19.2.4) 7504 - svelte: 5.53.6 7505 - vitest: 4.0.18(@types/node@24.11.0)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1) 7506 - transitivePeerDependencies: 7507 - - '@cloudflare/workers-types' 7508 - 7509 - better-call@1.1.8(zod@4.3.6): 7510 - dependencies: 7511 - '@better-auth/utils': 0.3.1 7512 - '@better-fetch/fetch': 1.1.21 7513 - rou3: 0.7.12 7514 - set-cookie-parser: 2.7.2 7515 - optionalDependencies: 7516 - zod: 4.3.6 7517 - 7518 7194 better-call@1.3.2(zod@4.3.6): 7519 7195 dependencies: 7520 7196 '@better-auth/utils': 0.3.1 ··· 7528 7204 dependencies: 7529 7205 bindings: 1.5.0 7530 7206 prebuild-install: 7.1.3 7207 + optional: true 7531 7208 7532 7209 bindings@1.5.0: 7533 7210 dependencies: 7534 7211 file-uri-to-path: 1.0.0 7212 + optional: true 7535 7213 7536 7214 birpc@4.0.0: {} 7537 7215 ··· 7553 7231 buffer: 5.7.1 7554 7232 inherits: 2.0.4 7555 7233 readable-stream: 3.6.2 7234 + optional: true 7556 7235 7557 7236 blake3-wasm@2.1.5: {} 7558 7237 ··· 7576 7255 dependencies: 7577 7256 base64-js: 1.5.1 7578 7257 ieee754: 1.2.1 7258 + optional: true 7579 7259 7580 7260 bundle-name@4.1.0: 7581 7261 dependencies: ··· 7649 7329 dependencies: 7650 7330 readdirp: 5.0.0 7651 7331 7652 - chownr@1.1.4: {} 7332 + chownr@1.1.4: 7333 + optional: true 7653 7334 7654 7335 chromatic@13.3.5: {} 7655 7336 ··· 7712 7393 decompress-response@6.0.0: 7713 7394 dependencies: 7714 7395 mimic-response: 3.1.0 7396 + optional: true 7715 7397 7716 7398 dedent-js@1.0.1: {} 7717 7399 ··· 7719 7401 7720 7402 deep-eql@5.0.2: {} 7721 7403 7722 - deep-extend@0.6.0: {} 7404 + deep-extend@0.6.0: 7405 + optional: true 7723 7406 7724 7407 deep-is@0.1.4: {} 7725 7408 ··· 7768 7451 transitivePeerDependencies: 7769 7452 - supports-color 7770 7453 7771 - drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): 7772 - optionalDependencies: 7773 - '@cloudflare/workers-types': 4.20260301.1 7774 - '@electric-sql/pglite': 0.3.15 7775 - '@prisma/client': 5.22.0(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) 7776 - '@types/pg': 8.18.0 7777 - better-sqlite3: 12.6.2 7778 - kysely: 0.28.11 7779 - mysql2: 3.18.2(@types/node@24.11.0) 7780 - pg: 8.19.0 7781 - postgres: 3.4.8 7782 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 7783 - 7784 7454 drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): 7785 7455 optionalDependencies: 7786 7456 '@cloudflare/workers-types': 4.20260301.1 ··· 7794 7464 postgres: 3.4.8 7795 7465 prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 7796 7466 7797 - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@24.11.0))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): 7798 - optionalDependencies: 7799 - '@cloudflare/workers-types': 4.20260301.1 7800 - '@electric-sql/pglite': 0.3.15 7801 - '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) 7802 - '@types/pg': 8.18.0 7803 - better-sqlite3: 12.6.2 7804 - kysely: 0.28.11 7805 - mysql2: 3.18.2(@types/node@24.11.0) 7806 - pg: 8.19.0 7807 - postgres: 3.4.8 7808 - prisma: 7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) 7809 - 7810 7467 drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260301.1)(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/pg@8.18.0)(better-sqlite3@12.6.2)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.2(@types/react@19.2.14)(better-sqlite3@12.6.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): 7811 7468 optionalDependencies: 7812 7469 '@cloudflare/workers-types': 4.20260301.1 ··· 7840 7497 end-of-stream@1.4.5: 7841 7498 dependencies: 7842 7499 once: 1.4.0 7500 + optional: true 7843 7501 7844 7502 enhanced-resolve@5.19.0: 7845 7503 dependencies: ··· 8064 7722 8065 7723 esutils@2.0.3: {} 8066 7724 8067 - expand-template@2.0.3: {} 7725 + expand-template@2.0.3: 7726 + optional: true 8068 7727 8069 7728 expect-type@1.3.0: {} 8070 7729 ··· 8094 7753 dependencies: 8095 7754 flat-cache: 4.0.1 8096 7755 8097 - file-uri-to-path@1.0.0: {} 7756 + file-uri-to-path@1.0.0: 7757 + optional: true 8098 7758 8099 7759 find-up@5.0.0: 8100 7760 dependencies: ··· 8113 7773 cross-spawn: 7.0.6 8114 7774 signal-exit: 4.1.0 8115 7775 8116 - fs-constants@1.0.0: {} 7776 + fs-constants@1.0.0: 7777 + optional: true 8117 7778 8118 7779 fsevents@2.3.2: 8119 7780 optional: true ··· 8142 7803 nypm: 0.6.5 8143 7804 pathe: 2.0.3 8144 7805 8145 - github-from-package@0.0.0: {} 7806 + github-from-package@0.0.0: 7807 + optional: true 8146 7808 8147 7809 glob-parent@6.0.2: 8148 7810 dependencies: ··· 8182 7844 dependencies: 8183 7845 safer-buffer: 2.1.2 8184 7846 8185 - ieee754@1.2.1: {} 7847 + ieee754@1.2.1: 7848 + optional: true 8186 7849 8187 7850 ignore@5.3.2: {} 8188 7851 ··· 8192 7855 8193 7856 indent-string@4.0.0: {} 8194 7857 8195 - inherits@2.0.4: {} 7858 + inherits@2.0.4: 7859 + optional: true 8196 7860 8197 - ini@1.3.8: {} 7861 + ini@1.3.8: 7862 + optional: true 8198 7863 8199 7864 inline-style-parser@0.2.7: {} 8200 7865 ··· 8396 8061 8397 8062 memory-pager@1.5.0: {} 8398 8063 8399 - mimic-response@3.1.0: {} 8064 + mimic-response@3.1.0: 8065 + optional: true 8400 8066 8401 8067 min-indent@1.0.1: {} 8402 8068 ··· 8416 8082 dependencies: 8417 8083 brace-expansion: 5.0.4 8418 8084 8419 - minimist@1.2.8: {} 8085 + minimist@1.2.8: 8086 + optional: true 8420 8087 8421 - mkdirp-classic@0.5.3: {} 8088 + mkdirp-classic@0.5.3: 8089 + optional: true 8422 8090 8423 8091 mlly@1.8.0: 8424 8092 dependencies: ··· 8462 8130 seq-queue: 0.0.5 8463 8131 sqlstring: 2.3.3 8464 8132 8465 - mysql2@3.18.2(@types/node@24.11.0): 8466 - dependencies: 8467 - '@types/node': 24.11.0 8468 - aws-ssl-profiles: 1.1.2 8469 - denque: 2.1.0 8470 - generate-function: 2.3.1 8471 - iconv-lite: 0.7.2 8472 - long: 5.3.2 8473 - lru.min: 1.1.4 8474 - named-placeholders: 1.1.6 8475 - sql-escaper: 1.3.3 8476 - optional: true 8477 - 8478 8133 mysql2@3.18.2(@types/node@25.3.3): 8479 8134 dependencies: 8480 8135 '@types/node': 25.3.3 ··· 8496 8151 8497 8152 nanostores@1.1.1: {} 8498 8153 8499 - napi-build-utils@2.0.0: {} 8154 + napi-build-utils@2.0.0: 8155 + optional: true 8500 8156 8501 8157 natural-compare@1.4.0: {} 8502 8158 8503 8159 node-abi@3.87.0: 8504 8160 dependencies: 8505 8161 semver: 7.7.4 8162 + optional: true 8506 8163 8507 8164 node-fetch-native@1.6.7: {} 8508 8165 ··· 8590 8247 once@1.4.0: 8591 8248 dependencies: 8592 8249 wrappy: 1.0.2 8250 + optional: true 8593 8251 8594 8252 open@10.2.0: 8595 8253 dependencies: ··· 8807 8465 8808 8466 postgres@3.4.7: {} 8809 8467 8810 - postgres@3.4.8: {} 8468 + postgres@3.4.8: 8469 + optional: true 8811 8470 8812 8471 powershell-utils@0.1.0: {} 8813 8472 ··· 8825 8484 simple-get: 4.0.1 8826 8485 tar-fs: 2.1.4 8827 8486 tunnel-agent: 0.6.0 8487 + optional: true 8828 8488 8829 8489 prelude-ls@1.2.1: {} 8830 8490 ··· 8878 8538 dependencies: 8879 8539 end-of-stream: 1.4.5 8880 8540 once: 1.4.0 8541 + optional: true 8881 8542 8882 8543 punycode@2.3.1: {} 8883 8544 ··· 8898 8559 ini: 1.3.8 8899 8560 minimist: 1.2.8 8900 8561 strip-json-comments: 2.0.1 8562 + optional: true 8901 8563 8902 8564 react-dom@19.2.4(react@19.2.4): 8903 8565 dependencies: ··· 8913 8575 inherits: 2.0.4 8914 8576 string_decoder: 1.3.0 8915 8577 util-deprecate: 1.0.2 8578 + optional: true 8916 8579 8917 8580 readdirp@4.1.2: {} 8918 8581 ··· 9059 8722 dependencies: 9060 8723 mri: 1.2.0 9061 8724 9062 - safe-buffer@5.2.1: {} 8725 + safe-buffer@5.2.1: 8726 + optional: true 9063 8727 9064 8728 safer-buffer@2.1.2: {} 9065 8729 ··· 9072 8736 semver@7.7.4: {} 9073 8737 9074 8738 seq-queue@0.0.5: {} 9075 - 9076 - set-cookie-parser@2.7.2: {} 9077 8739 9078 8740 set-cookie-parser@3.0.1: {} 9079 8741 ··· 9122 8784 9123 8785 signal-exit@4.1.0: {} 9124 8786 9125 - simple-concat@1.0.1: {} 8787 + simple-concat@1.0.1: 8788 + optional: true 9126 8789 9127 8790 simple-get@4.0.1: 9128 8791 dependencies: 9129 8792 decompress-response: 6.0.0 9130 8793 once: 1.4.0 9131 8794 simple-concat: 1.0.1 8795 + optional: true 9132 8796 9133 8797 sirv@3.0.2: 9134 8798 dependencies: ··· 9193 8857 string_decoder@1.3.0: 9194 8858 dependencies: 9195 8859 safe-buffer: 5.2.1 8860 + optional: true 9196 8861 9197 8862 strip-indent@3.0.0: 9198 8863 dependencies: 9199 8864 min-indent: 1.0.1 9200 8865 9201 - strip-json-comments@2.0.1: {} 8866 + strip-json-comments@2.0.1: 8867 + optional: true 9202 8868 9203 8869 structured-clone-es@1.0.0: {} 9204 8870 ··· 9347 9013 mkdirp-classic: 0.5.3 9348 9014 pump: 3.0.4 9349 9015 tar-stream: 2.2.0 9016 + optional: true 9350 9017 9351 9018 tar-stream@2.2.0: 9352 9019 dependencies: ··· 9355 9022 fs-constants: 1.0.0 9356 9023 inherits: 2.0.4 9357 9024 readable-stream: 3.6.2 9025 + optional: true 9358 9026 9359 9027 tiny-case@1.0.3: 9360 9028 optional: true ··· 9429 9097 tunnel-agent@0.6.0: 9430 9098 dependencies: 9431 9099 safe-buffer: 5.2.1 9100 + optional: true 9432 9101 9433 9102 tw-animate-css@1.4.0: {} 9434 9103 ··· 9463 9132 unconfig-core: 7.5.0 9464 9133 9465 9134 uncrypto@0.1.3: {} 9466 - 9467 - undici-types@7.16.0: {} 9468 9135 9469 9136 undici-types@7.18.2: {} 9470 9137 ··· 9521 9188 validator@13.15.26: 9522 9189 optional: true 9523 9190 9524 - vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1): 9525 - dependencies: 9526 - esbuild: 0.27.3 9527 - fdir: 6.5.0(picomatch@4.0.3) 9528 - picomatch: 4.0.3 9529 - postcss: 8.5.6 9530 - rollup: 4.59.0 9531 - tinyglobby: 0.2.15 9532 - optionalDependencies: 9533 - '@types/node': 24.11.0 9534 - fsevents: 2.3.3 9535 - jiti: 2.6.1 9536 - lightningcss: 1.31.1 9537 - 9538 9191 vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1): 9539 9192 dependencies: 9540 9193 esbuild: 0.27.3 ··· 9548 9201 fsevents: 2.3.3 9549 9202 jiti: 2.6.1 9550 9203 lightningcss: 1.31.1 9551 - 9552 - vitefu@1.1.2(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)): 9553 - optionalDependencies: 9554 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 9555 9204 9556 9205 vitefu@1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)): 9557 9206 optionalDependencies: ··· 9563 9212 svelte: 5.53.6 9564 9213 vitest: 4.0.18(@types/node@25.3.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1) 9565 9214 9566 - vitest@4.0.18(@types/node@24.11.0)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1): 9567 - dependencies: 9568 - '@vitest/expect': 4.0.18 9569 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1)) 9570 - '@vitest/pretty-format': 4.0.18 9571 - '@vitest/runner': 4.0.18 9572 - '@vitest/snapshot': 4.0.18 9573 - '@vitest/spy': 4.0.18 9574 - '@vitest/utils': 4.0.18 9575 - es-module-lexer: 1.7.0 9576 - expect-type: 1.3.0 9577 - magic-string: 0.30.21 9578 - obug: 2.1.1 9579 - pathe: 2.0.3 9580 - picomatch: 4.0.3 9581 - std-env: 3.10.0 9582 - tinybench: 2.9.0 9583 - tinyexec: 1.0.2 9584 - tinyglobby: 0.2.15 9585 - tinyrainbow: 3.0.3 9586 - vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1) 9587 - why-is-node-running: 2.3.0 9588 - optionalDependencies: 9589 - '@types/node': 24.11.0 9590 - '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.31.1))(vitest@4.0.18) 9591 - '@vitest/ui': 4.0.18(vitest@4.0.18) 9592 - transitivePeerDependencies: 9593 - - jiti 9594 - - less 9595 - - lightningcss 9596 - - msw 9597 - - sass 9598 - - sass-embedded 9599 - - stylus 9600 - - sugarss 9601 - - terser 9602 - - tsx 9603 - - yaml 9604 - optional: true 9605 - 9606 9215 vitest@4.0.18(@types/node@25.3.3)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(lightningcss@1.31.1): 9607 9216 dependencies: 9608 9217 '@vitest/expect': 4.0.18 ··· 9692 9301 - bufferutil 9693 9302 - utf-8-validate 9694 9303 9695 - wrappy@1.0.2: {} 9304 + wrappy@1.0.2: 9305 + optional: true 9696 9306 9697 9307 ws@8.18.0: {} 9698 9308
+1
pnpm-workspace.yaml
··· 4 4 5 5 catalogs: 6 6 app: 7 + '@better-auth/drizzle-adapter': '^1.5.4' 7 8 '@fontsource-variable/fraunces': ^5.2.9 8 9 '@fontsource-variable/suse': ^5.2.9 9 10 '@fontsource-variable/suse-mono': ^5.2.1