From e801ca7b655220d8a6fce386926960627eaed4df Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sat, 22 Aug 2026 23:16:01 +0800 Subject: [PATCH 1/6] fix(date): support string adapter --- packages/vuetify-nuxt-module/src/types.ts | 2 +- .../src/vite/vuetify-date-configuration-plugin.ts | 8 ++++++++ .../test/date-configuration-plugin.test.ts | 13 +++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/vuetify-nuxt-module/src/types.ts b/packages/vuetify-nuxt-module/src/types.ts index 03e8465..c1bcb5f 100644 --- a/packages/vuetify-nuxt-module/src/types.ts +++ b/packages/vuetify-nuxt-module/src/types.ts @@ -1,6 +1,6 @@ import type { LocaleOptions, RtlOptions, VuetifyOptions } from 'vuetify' -export type DateAdapter = 'vuetify' | 'date-fns' | 'moment' | 'luxon' | 'dayjs' | 'js-joda' | 'date-fns-jalali' | 'jalaali' | 'hijri' | 'custom' +export type DateAdapter = 'vuetify' | 'string' | 'date-fns' | 'moment' | 'luxon' | 'dayjs' | 'js-joda' | 'date-fns-jalali' | 'jalaali' | 'hijri' | 'custom' /** * Date configuration. diff --git a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts index 2a14647..76fc3f5 100644 --- a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts +++ b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts @@ -71,6 +71,10 @@ export function dateConfiguration() { return `options.adapter = new Adapter({ locale: ${dateFnsLocale} })` } + if (ctx.dateAdapter === 'string') { + return 'options.adapter = new StringDateAdapter(options)' + } + return 'options.adapter = Adapter' } @@ -83,6 +87,10 @@ export function dateConfiguration() { return 'import { VuetifyDateAdapter } from \'vuetify/labs/date/adapters/vuetify\'' } + if (ctx.dateAdapter === 'string') { + return 'import { StringDateAdapter } from \'vuetify/labs/date/adapters/string\'' + } + const imports = [`import Adapter from '@date-io/${ctx.dateAdapter}'`] if (ctx.dateAdapter === 'date-fns') { imports.push(`import { ${dateFnsLocale} } from 'date-fns/locale'`) diff --git a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts index fee42ac..aa6a0f1 100644 --- a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts +++ b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts @@ -53,3 +53,16 @@ describe('vuetifyDateConfigurationPlugin date-fns locale', () => { expect(ctx.logger.warn).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('(unset)')) }) }) + +describe('vuetifyDateConfigurationPlugin string adapter', () => { + it('imports and configures Vuetify StringDateAdapter', async () => { + const ctx = makeCtx('en') + ctx.dateAdapter = 'string' + ctx.vuetifyOptions.date.adapter = 'string' + + const code = await loadModule(ctx) + + expect(code).toContain('import { StringDateAdapter } from \'vuetify/labs/date/adapters/string\'') + expect(code).toContain('options.adapter = new StringDateAdapter(options)') + }) +}) From 2735384e623f862580c89356b685986fb4745af8 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sat, 22 Aug 2026 23:31:43 +0800 Subject: [PATCH 2/6] fix(date): guard string adapter compatibility --- .../src/vite/vuetify-date-configuration-plugin.ts | 4 ++++ .../test/date-configuration-plugin.test.ts | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts index 76fc3f5..b88a017 100644 --- a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts +++ b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts @@ -32,6 +32,10 @@ export function dateConfiguration() { ` } + if (ctx.dateAdapter === 'string' && !ctx.vuetifyGte('3.9.0')) { + throw new Error('[vuetify-nuxt-module] The "string" date adapter requires Vuetify 3.9.0 or newer.') + } + const { adapter: _adapter, ...newDateOptions } = ctx.vuetifyOptions.date ?? {} let dateFnsLocale: string | undefined diff --git a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts index aa6a0f1..6a1f751 100644 --- a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts +++ b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts @@ -65,4 +65,13 @@ describe('vuetifyDateConfigurationPlugin string adapter', () => { expect(code).toContain('import { StringDateAdapter } from \'vuetify/labs/date/adapters/string\'') expect(code).toContain('options.adapter = new StringDateAdapter(options)') }) + + it('rejects Vuetify versions without StringDateAdapter', async () => { + const ctx = makeCtx('en') + ctx.dateAdapter = 'string' + ctx.vuetifyOptions.date.adapter = 'string' + ctx.vuetifyGte = (version: string) => version !== '3.9.0' + + await expect(loadModule(ctx)).rejects.toThrow('requires Vuetify 3.9.0 or newer') + }) }) From 8a2d04dae5cdbffc4714c6a2596e9277c8982b35 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Mon, 24 Aug 2026 07:39:28 +0800 Subject: [PATCH 3/6] fix(date): use stable string adapter export --- .../src/vite/vuetify-date-configuration-plugin.ts | 4 ++-- .../test/date-configuration-plugin.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts index b88a017..53f80fe 100644 --- a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts +++ b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts @@ -76,7 +76,7 @@ export function dateConfiguration() { } if (ctx.dateAdapter === 'string') { - return 'options.adapter = new StringDateAdapter(options)' + return 'options.adapter = StringDateAdapter' } return 'options.adapter = Adapter' @@ -92,7 +92,7 @@ export function dateConfiguration() { } if (ctx.dateAdapter === 'string') { - return 'import { StringDateAdapter } from \'vuetify/labs/date/adapters/string\'' + return 'import { StringDateAdapter } from \'vuetify/date/adapters/string\'' } const imports = [`import Adapter from '@date-io/${ctx.dateAdapter}'`] diff --git a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts index 6a1f751..8b1449d 100644 --- a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts +++ b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts @@ -62,8 +62,8 @@ describe('vuetifyDateConfigurationPlugin string adapter', () => { const code = await loadModule(ctx) - expect(code).toContain('import { StringDateAdapter } from \'vuetify/labs/date/adapters/string\'') - expect(code).toContain('options.adapter = new StringDateAdapter(options)') + expect(code).toContain('import { StringDateAdapter } from \'vuetify/date/adapters/string\'') + expect(code).toContain('options.adapter = StringDateAdapter') }) it('rejects Vuetify versions without StringDateAdapter', async () => { From 86a9e8247a721e7170426d1992f3af807a42748a Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sun, 13 Sep 2026 14:54:58 +0800 Subject: [PATCH 4/6] fix(date): document string adapter version floor --- .../src/vite/vuetify-date-configuration-plugin.ts | 2 ++ .../vuetify-nuxt-module/test/date-configuration-plugin.test.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts index 53f80fe..fd9b2d8 100644 --- a/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts +++ b/packages/vuetify-nuxt-module/src/vite/vuetify-date-configuration-plugin.ts @@ -32,6 +32,8 @@ export function dateConfiguration() { ` } + // StringDateAdapter was added in Vuetify 3.9.0: + // https://github.com/vuetifyjs/vuetify/releases/tag/v3.9.0 if (ctx.dateAdapter === 'string' && !ctx.vuetifyGte('3.9.0')) { throw new Error('[vuetify-nuxt-module] The "string" date adapter requires Vuetify 3.9.0 or newer.') } diff --git a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts index 8b1449d..7ec192e 100644 --- a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts +++ b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts @@ -64,6 +64,7 @@ describe('vuetifyDateConfigurationPlugin string adapter', () => { expect(code).toContain('import { StringDateAdapter } from \'vuetify/date/adapters/string\'') expect(code).toContain('options.adapter = StringDateAdapter') + await expect(import('vuetify/date/adapters/string')).resolves.toHaveProperty('StringDateAdapter') }) it('rejects Vuetify versions without StringDateAdapter', async () => { From 138ab7dd2f63785717b68add68dd3c2616b12967 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Tue, 22 Sep 2026 08:31:05 +0800 Subject: [PATCH 5/6] test(date): load generated string adapter module --- .../test/date-configuration-plugin.test.ts | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts index 7ec192e..f62a2e8 100644 --- a/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts +++ b/packages/vuetify-nuxt-module/test/date-configuration-plugin.test.ts @@ -1,5 +1,7 @@ +import { createServer } from 'vite' import { describe, expect, it, vi } from 'vitest' -import { RESOLVED_VIRTUAL_VUETIFY_DATE_CONFIGURATION } from '../src/vite/constants' +import { StringDateAdapter } from 'vuetify/date/adapters/string' +import { RESOLVED_VIRTUAL_VUETIFY_DATE_CONFIGURATION, VIRTUAL_VUETIFY_DATE_CONFIGURATION } from '../src/vite/constants' import { vuetifyDateConfigurationPlugin } from '../src/vite/vuetify-date-configuration-plugin' function makeCtx (localeCode: string | undefined) { @@ -55,16 +57,24 @@ describe('vuetifyDateConfigurationPlugin date-fns locale', () => { }) describe('vuetifyDateConfigurationPlugin string adapter', () => { - it('imports and configures Vuetify StringDateAdapter', async () => { + it('loads and configures Vuetify StringDateAdapter', async () => { const ctx = makeCtx('en') ctx.dateAdapter = 'string' ctx.vuetifyOptions.date.adapter = 'string' - const code = await loadModule(ctx) + const server = await createServer({ + logLevel: 'silent', + plugins: [vuetifyDateConfigurationPlugin(ctx)], + }) + + try { + const module = await server.ssrLoadModule(VIRTUAL_VUETIFY_DATE_CONFIGURATION) - expect(code).toContain('import { StringDateAdapter } from \'vuetify/date/adapters/string\'') - expect(code).toContain('options.adapter = StringDateAdapter') - await expect(import('vuetify/date/adapters/string')).resolves.toHaveProperty('StringDateAdapter') + expect(module.adapter).toBe('string') + expect(module.dateConfiguration().adapter).toBe(StringDateAdapter) + } finally { + await server.close() + } }) it('rejects Vuetify versions without StringDateAdapter', async () => { From 0f274f420bd73abd90b028818f9109e1d7224899 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Fri, 9 Oct 2026 14:28:51 +0800 Subject: [PATCH 6/6] fix(date): recognize string adapter in Nuxt configuration --- packages/vuetify-nuxt-module/src/utils/loader.ts | 2 +- .../test/fixtures/string-date-adapter/app.vue | 11 +++++++++++ .../fixtures/string-date-adapter/nuxt.config.ts | 10 ++++++++++ .../fixtures/string-date-adapter/package.json | 5 +++++ .../test/string-date-adapter.test.ts | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/app.vue create mode 100644 packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/nuxt.config.ts create mode 100644 packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/package.json create mode 100644 packages/vuetify-nuxt-module/test/string-date-adapter.test.ts diff --git a/packages/vuetify-nuxt-module/src/utils/loader.ts b/packages/vuetify-nuxt-module/src/utils/loader.ts index 121b9bc..0eed352 100644 --- a/packages/vuetify-nuxt-module/src/utils/loader.ts +++ b/packages/vuetify-nuxt-module/src/utils/loader.ts @@ -56,7 +56,7 @@ export async function load ( } if (adapter) { - if (adapter === 'vuetify' || adapter === 'custom') { + if (['vuetify', 'string', 'custom'].includes(adapter)) { ctx.dateAdapter = adapter } else { if (date.includes(adapter)) { diff --git a/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/app.vue b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/app.vue new file mode 100644 index 0000000..f58d966 --- /dev/null +++ b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/app.vue @@ -0,0 +1,11 @@ + + + diff --git a/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/nuxt.config.ts b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/nuxt.config.ts new file mode 100644 index 0000000..28b35c8 --- /dev/null +++ b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/nuxt.config.ts @@ -0,0 +1,10 @@ +import MyModule from '../../../src/module' + +export default defineNuxtConfig({ + modules: [MyModule], + vuetify: { + vuetifyOptions: { + date: { adapter: 'string' }, + }, + }, +}) diff --git a/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/package.json b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/package.json new file mode 100644 index 0000000..990d4e1 --- /dev/null +++ b/packages/vuetify-nuxt-module/test/fixtures/string-date-adapter/package.json @@ -0,0 +1,5 @@ +{ + "name": "string-date-adapter", + "type": "module", + "private": true +} diff --git a/packages/vuetify-nuxt-module/test/string-date-adapter.test.ts b/packages/vuetify-nuxt-module/test/string-date-adapter.test.ts new file mode 100644 index 0000000..4492131 --- /dev/null +++ b/packages/vuetify-nuxt-module/test/string-date-adapter.test.ts @@ -0,0 +1,15 @@ +import { fileURLToPath } from 'node:url' +import { $fetch, setup } from '@nuxt/test-utils' +import { describe, expect, it } from 'vitest' + +describe('string date adapter', async () => { + await setup({ + rootDir: fileURLToPath(new URL('fixtures/string-date-adapter', import.meta.url)), + }) + + it('uses the built-in string adapter from Nuxt configuration', async () => { + const html = await $fetch('/') + expect(html).toContain('data-date-type="string"') + expect(html).toContain('>2026-08-22

') + }) +})