diff --git a/packages/nuxt/nuxt.d.ts b/packages/nuxt/nuxt.d.ts index aa490ba..aa854f3 100644 --- a/packages/nuxt/nuxt.d.ts +++ b/packages/nuxt/nuxt.d.ts @@ -1,4 +1,13 @@ // only to resolve runtime plugin types on local, not shipped declare module '#imports' { - export { defineNuxtPlugin, useRuntimeConfig } from 'nuxt/app' + export interface RuntimeConfig { + public: { + devframe: { + baseURL: string + } + } + } + + export { defineNuxtPlugin } from 'nuxt/app' + export const useRuntimeConfig: () => RuntimeConfig } diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index f1730e1..f382c00 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -19,10 +19,13 @@ ], "sideEffects": false, "exports": { - ".": "./dist/index.mjs", + ".": { + "types": "./dist/types.d.mts", + "default": "./dist/module.mjs" + }, "./package.json": "./package.json" }, - "types": "./dist/index.d.mts", + "types": "./dist/types.d.mts", "files": [ "dist" ], diff --git a/packages/nuxt/src/index.ts b/packages/nuxt/src/module.ts similarity index 94% rename from packages/nuxt/src/index.ts rename to packages/nuxt/src/module.ts index 5853db7..dce82f2 100644 --- a/packages/nuxt/src/index.ts +++ b/packages/nuxt/src/module.ts @@ -49,6 +49,8 @@ export interface DevframeNuxtModuleOptions { } } +export type ModuleOptions = DevframeNuxtModuleOptions + /** * Nuxt module that wires a Nuxt-built SPA up as a devframe client, and * (optionally) serves the dev-time RPC bridge alongside `nuxt dev`. @@ -80,9 +82,9 @@ export interface DevframeNuxtModuleOptions { * } * ``` */ -export default defineNuxtModule({ +export default defineNuxtModule({ meta: { - name: 'devframe', + name: '@devframes/nuxt', configKey: 'devframe', }, defaults: { @@ -108,10 +110,12 @@ export default defineNuxtModule({ nuxt.options.runtimeConfig ??= {} as any nuxt.options.runtimeConfig.public ??= {} as any const publicConfig = nuxt.options.runtimeConfig.public as Record - publicConfig.devframe = { - ...(publicConfig.devframe ?? {}), + + // override baseURL + publicConfig.devframe ??= {} + Object.assign(publicConfig.devframe, publicConfig.devframe ?? {}, { baseURL: options.baseURL, - } + }) const runtimeDir = resolve('./runtime') diff --git a/packages/nuxt/src/runtime/plugin.client.ts b/packages/nuxt/src/runtime/plugin.client.ts index e0c2f39..43061f1 100644 --- a/packages/nuxt/src/runtime/plugin.client.ts +++ b/packages/nuxt/src/runtime/plugin.client.ts @@ -7,8 +7,7 @@ import { defineNuxtPlugin, useRuntimeConfig } from '#imports' */ export default defineNuxtPlugin({ async setup() { - const config = useRuntimeConfig() - const baseURL = (config.public as any)?.devframe?.baseURL ?? './' + const baseURL = useRuntimeConfig().public.devframe.baseURL ?? './' const rpc = await connectDevframe({ baseURL }) return { provide: { diff --git a/packages/nuxt/tsdown.config.ts b/packages/nuxt/tsdown.config.ts index 71f92ad..9dd368b 100644 --- a/packages/nuxt/tsdown.config.ts +++ b/packages/nuxt/tsdown.config.ts @@ -1,12 +1,15 @@ import fs from 'node:fs/promises' +import { createRequire } from 'node:module' import { defineConfig } from 'tsdown' +const require = createRequire(import.meta.url) + export default defineConfig([{ - entry: './src/index.ts', + entry: './src/module.ts', // tsconfig: '../../tsconfig.base.json', clean: true, dts: true, - exports: true, + exports: false, // Keep transitive Nuxt/Vite type graphs out of dts bundling. Consumers // resolve these via their own node_modules at install time. deps: { @@ -39,7 +42,8 @@ export default defineConfig([{ }, hooks: { 'build:done': async () => { - // copy types and generate plugin dts + const { name, version, devDependencies } = require('./package.json') + // copy types and generate plugin d.ts, module types.d.mts and module.json files await Promise.all([ fs.cp('src/runtime/types.d.ts', 'dist/runtime/types.d.ts'), fs.writeFile('dist/runtime/plugin.client.d.ts', `import type { Plugin } from '#app'; @@ -48,6 +52,19 @@ declare const plugin: Plugin<{ rpc: DevToolsRpcClient; }>; export default plugin; +`, 'utf-8'), + fs.writeFile('dist/types.d.mts', `export { default } from './module.mjs'; + +export { type ModuleOptions, type DevframeNuxtModuleOptions } from './module.mjs'; +`, 'utf-8'), + fs.writeFile('dist/module.json', `{ + "name": "${name}", + "configKey": "devframe", + "version": "${version}", + "builder": { + "tsdown": "${devDependencies.tsdown}" + } +} `, 'utf-8'), ]) }, diff --git a/tests/__snapshots__/tsnapi/@devframes/nuxt/index.snapshot.d.ts b/tests/__snapshots__/tsnapi/@devframes/nuxt/index.snapshot.d.ts index ef7578d..ffad16e 100644 --- a/tests/__snapshots__/tsnapi/@devframes/nuxt/index.snapshot.d.ts +++ b/tests/__snapshots__/tsnapi/@devframes/nuxt/index.snapshot.d.ts @@ -1,20 +1,7 @@ /** * Generated by tsnapi — public API snapshot of `@devframes/nuxt` */ -// #region Interfaces -export interface DevframeNuxtModuleOptions { - baseURL?: string; - skipAppDefaults?: boolean; - devframe?: DevframeDefinition; - devMiddleware?: boolean | { - port?: number; - host?: string; - flags?: Record; - }; -} -// #endregion - -// #region Default Export -declare const _default: _$_nuxt_schema0.NuxtModule; -export default _default +// #region Re-exports +export { default } from './module.mjs'; +export { type ModuleOptions, type DevframeNuxtModuleOptions } from './module.mjs'; // #endregion \ No newline at end of file