Skip to content

Commit

Permalink
fix: types
Browse files Browse the repository at this point in the history
  • Loading branch information
rdunk committed Jan 25, 2024
1 parent 126c20c commit 7411043
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 73 deletions.
4 changes: 4 additions & 0 deletions .nuxtrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
sanity.apiVersion=2021-03-25
sanity.stega=true
sanity.visualEditing.token=token
sanity.visualEditing.studioUrl="http://localhost:3333"
39 changes: 17 additions & 22 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { ClientPerspective, StegaConfig } from '@sanity/client/stega'
import type { SanityHelper } from '#sanity-helper'
import type { SanityHelper } from '#sanity-composables'

type nullish = null | undefined | void

declare module '#app' {
interface NuxtApp {
Expand All @@ -10,55 +12,48 @@ declare module '#app' {
declare module 'nuxt/schema' {
interface RuntimeConfig {
sanity: {
dataset?: string
apiVersion?: string
withCredentials?: boolean
additionalClients: Record<string,any>
visualEditing:
| {
draftMode:
| boolean
| false
| {
enable?: string
disable?: string
enable: string
disable: string
}
mode: 'global' | 'component'
studioUrl: string
draftModeId: string
token: string
}
| null
| undefined
| void
}
}

interface PublicRuntimeConfig {
sanity: {
projectId: string
useCdn: boolean
dataset: string
additionalClients: Record<string, any>
apiVersion: string
withCredentials: boolean
token: string
dataset: string
disableSmartCdn?: boolean
perspective: ClientPerspective
additionalClients: Record<string, any>
projectId: string
stega: StegaConfig
token: string
useCdn: boolean
visualEditing:
| {
draftMode:
| boolean
| false
| {
enable?: string
disable?: string
enable: string
disable: string
}
mode: 'global' | 'component'
studioUrl: string
}
| null
| undefined
| void
| nullish
}
withCredentials: boolean
}
}

Expand Down
File renamed without changes.
85 changes: 55 additions & 30 deletions src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,18 @@ import {
isNuxt3,
tryResolveModule,
requireModule,
resolveModule,
useLogger,
} from '@nuxt/kit'

import chalk from 'chalk'
import { join, resolve } from 'pathe'
import { defu } from 'defu'
import { genExport } from 'knitwork'
import { genExport, genTypeExport } from 'knitwork'

import { name, version } from '../package.json'

import type { SanityConfiguration } from './runtime/client'
import type { SanityConfiguration } from '#build/sanity-config'
import type { StegaConfig } from '@sanity/client/stega'

export interface SanityModuleVisualEditingOptions {
Expand Down Expand Up @@ -106,10 +107,11 @@ export default defineNuxtModule<SanityModuleOptions>({
},
},
defaults: nuxt => ({
dataset: 'production',
additionalClients: {},
apiVersion: '1',
dataset: 'production',
perspective: 'raw',
withCredentials: false,
additionalClients: {},
...getDefaultSanityConfig(resolve(nuxt.options.rootDir, './sanity.json')),
}),
async setup (options, nuxt) {
Expand Down Expand Up @@ -166,12 +168,12 @@ export default defineNuxtModule<SanityModuleOptions>({

// Final resolved configuration
const visualEditing = options.visualEditing && {
draftMode: options.visualEditing.draftMode
draftMode: (options.visualEditing.draftMode
? defu(options.visualEditing.draftMode, {
enable: '/draft/enable',
disable: '/draft/disable',
})
: false,
: false) as { enable: string; disable: string } | false,
mode: options.visualEditing.mode || 'global',
studioUrl: options.visualEditing.studioUrl || '',
}
Expand All @@ -189,22 +191,22 @@ export default defineNuxtModule<SanityModuleOptions>({

const { projectId, dataset } = (nuxt.options.runtimeConfig.public.sanity =
defu(nuxt.options.runtimeConfig.public.sanity, {
useCdn: options.useCdn,
projectId: options.projectId,
dataset: options.dataset,
apiVersion: options.apiVersion,
withCredentials: options.withCredentials || false,
token: options.token,
perspective: options.perspective || 'raw',
additionalClients: options.additionalClients,
additionalClients: options.additionalClients, // has default
apiVersion: options.apiVersion, // has default
dataset: options.dataset, // has default
perspective: options.perspective, // has default
projectId: options.projectId || '',
stega:
(options.visualEditing?.stega === true &&
({
enabled: true,
studioUrl: options.visualEditing.studioUrl,
} as StegaConfig)) ||
{},
visualEditing: visualEditing || null,
token: options.token || '',
useCdn: options.useCdn, // enforced
visualEditing: visualEditing,
withCredentials: options.withCredentials, // has default
}))

if (!projectId) {
Expand All @@ -214,16 +216,32 @@ export default defineNuxtModule<SanityModuleOptions>({
}

const runtimeDir = fileURLToPath(new URL('./runtime', import.meta.url))
const typesDir = fileURLToPath(new URL('./types', import.meta.url))
nuxt.options.build.transpile.push(runtimeDir, '@nuxtjs/sanity')

const clientSpecifier = options.minimal
? join(runtimeDir, 'client')
: options.visualEditing
? '@sanity/client/stega'
: '@sanity/client'

addTemplate({
filename: 'sanity-client.mjs',
getContents: () => genExport(clientSpecifier, ['createClient']),
})
addTemplate({
filename: 'sanity-config.ts',
getContents: () =>
options.minimal
? genExport(join(runtimeDir, 'client'), ['createClient'])
: options.visualEditing
? genExport('@sanity/client/stega', [{ name: 'createClient' }])
: genExport('@sanity/client', [{ name: 'createClient' }]),
genTypeExport(clientSpecifier, [
{
name: options.minimal
? 'SanityConfiguration'
: options.visualEditing
? 'ClientStegaConfig'
: 'ClientConfig',
as: 'SanityConfiguration',
},
]),
})

if (options.globalHelper) {
Expand Down Expand Up @@ -252,13 +270,15 @@ export default defineNuxtModule<SanityModuleOptions>({
]
: []),
])
nuxt.hook('prepare:types', async ({ tsConfig }) => {
const clientPath = await resolveModule(clientSpecifier)

nuxt.hook('prepare:types', ({ tsConfig }) => {
tsConfig.compilerOptions ||= {}
tsConfig.compilerOptions.paths['#sanity-client'] = [
join(runtimeDir, 'client'),
tsConfig.compilerOptions.paths['#sanity-client'] = [clientPath]
tsConfig.compilerOptions.paths['#sanity-client/types'] = [
join(typesDir, 'client'),
]
tsConfig.compilerOptions.paths['#sanity-helper'] = [
tsConfig.compilerOptions.paths['#sanity-composables'] = [
join(composablesDir, 'composables'),
]
})
Expand All @@ -267,12 +287,17 @@ export default defineNuxtModule<SanityModuleOptions>({
if (config.imports === false) return

config.virtual ||= {}
config.virtual['#sanity-client'] =
options.minimal
? genExport(join(runtimeDir, 'client'), ['createClient'])
: options.visualEditing
? genExport('@sanity/client/stega', [{ name: 'createClient' }])
: genExport('@sanity/client', [{ name: 'createClient' }])
config.virtual['#sanity-client'] = genExport(clientSpecifier, ['createClient'])
config.virtual['#sanity-config'] = genTypeExport(clientSpecifier, [
{
name: options.minimal
? 'SanityConfiguration'
: options.visualEditing
? 'ClientStegaConfig'
: 'ClientConfig',
as: 'SanityConfiguration',
},
])

config.externals ||= {}
config.externals.inline ||= []
Expand Down
1 change: 0 additions & 1 deletion src/runtime/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { $fetch } from 'ofetch'
const apiHost = 'api.sanity.io'
const cdnHost = 'apicdn.sanity.io'

export type SanityClient = ReturnType<typeof createClient>

export interface SanityConfiguration {
useCdn?: boolean
Expand Down
17 changes: 12 additions & 5 deletions src/runtime/composables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,15 @@ import { hash } from 'ohash'
import { reactive } from 'vue'

import type { AsyncData, AsyncDataOptions } from 'nuxt/app'
import type { SanityClient, SanityConfiguration } from './client'
import { useNuxtApp, useRuntimeConfig, useAsyncData, useLazyAsyncData, createSanityClient } from '#imports'
import type { SanityClient } from '#sanity-client/types'
import type { SanityConfiguration } from '#build/sanity-config'
import {
useNuxtApp,
useRuntimeConfig,
useAsyncData,
useLazyAsyncData,
createSanityClient,
} from '#imports'

export interface SanityHelper {
client: SanityClient
Expand All @@ -20,7 +27,7 @@ const createSanityHelper = (options: SanityConfiguration): SanityHelper => {
return {
client,
config,
fetch: (...args) => client.fetch(...args),
fetch: client.fetch,
setToken (token) {
config.token = token
client = createSanityClient(config)
Expand Down Expand Up @@ -64,7 +71,7 @@ export const useSanityQuery = <T = unknown, E = Error> (query: string, _params?:
options.watch = options.watch || []
options.watch.push(params)
}
return useAsyncData('sanity-' + hash(query + (params ? JSON.stringify(params) : '')), () => sanity.fetch<T>(query, params), options) as AsyncData<T | null, E>
return useAsyncData('sanity-' + hash(query + (params ? JSON.stringify(params) : '')), () => sanity.fetch<T>(query, params || {}), options) as AsyncData<T | null, E>
}

export const useLazySanityQuery = <T = unknown, E = Error> (query: string, _params?: Record<string, any>, _options: UseSanityQueryOptions<T> = {}): AsyncData<T | null, E> => {
Expand All @@ -75,5 +82,5 @@ export const useLazySanityQuery = <T = unknown, E = Error> (query: string, _para
options.watch = options.watch || []
options.watch.push(params)
}
return useLazyAsyncData('sanity-' + hash(query + (params ? JSON.stringify(params) : '')), () => sanity.fetch<T>(query, params), options) as AsyncData<T | null, E>
return useLazyAsyncData('sanity-' + hash(query + (params ? JSON.stringify(params) : '')), () => sanity.fetch<T>(query, params || {}), options) as AsyncData<T | null, E>
}
7 changes: 4 additions & 3 deletions src/runtime/nitro-imports.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defu } from 'defu'

import type { SanityConfiguration } from './client'
import type { SanityHelper } from '#sanity-helper'
import type { SanityConfiguration } from '#build/sanity-config'
import type { SanityHelper } from '#sanity-composables'

import { useRuntimeConfig } from '#imports'
import { createClient } from '#sanity-client'
Expand All @@ -16,7 +16,7 @@ const createSanityHelper = (options: SanityConfiguration): SanityHelper => {
return {
client,
config,
fetch: (...args) => client.fetch(...args),
fetch: client.fetch,
setToken (token) {
config.token = token
client = createClient(config)
Expand All @@ -31,6 +31,7 @@ export const useSanity = (client = 'default'): SanityHelper => {

const {
additionalClients = {},
// eslint-disable-next-line @typescript-eslint/no-unused-vars
visualEditing,
...options
} = defu($config.sanity, $config.public.sanity)
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { SanityHelper } from '#sanity-helper'
import type { SanityHelper } from '#sanity-composables'
import { defineNuxtPlugin, useSanity } from '#imports'

export default defineNuxtPlugin((nuxtApp) => {
Expand Down
Loading

0 comments on commit 7411043

Please sign in to comment.