Skip to content

Commit ec58eff

Browse files
fix: improve composable getter support
1 parent b4e1699 commit ec58eff

File tree

5 files changed

+33
-17
lines changed

5 files changed

+33
-17
lines changed

docs/api/use-kql.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Query responses are cached.
1010
function useKql<
1111
ResT extends KirbyQueryResponse = KirbyQueryResponse,
1212
ReqT extends KirbyQueryRequest = KirbyQueryRequest,
13-
>(query: (() => ReqT) | ReqT | Ref<ReqT>, opts?: UseKqlOptions<ResT>): AsyncData<ResT, true | Error>
13+
>(query: MaybeComputedRef<ReqT>, opts?: UseKqlOptions<ResT>): AsyncData<ResT, true | Error>
1414

1515
type UseKqlOptions<T> = Omit<
1616
UseFetchOptions<T>,

docs/api/use-public-kql.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Authorization credentials will be publicly visible. Also, possible CORS issues a
1414
function usePublicKql<
1515
ResT extends KirbyQueryResponse = KirbyQueryResponse,
1616
ReqT extends KirbyQueryRequest = KirbyQueryRequest,
17-
>(query: (() => ReqT) | ReqT | Ref<ReqT>, opts?: UseKqlOptions<ResT>): AsyncData<ResT, true | Error>
17+
>(query: MaybeComputedRef<ReqT>, opts?: UseKqlOptions<ResT>): AsyncData<ResT, true | Error>
1818

1919
type UseKqlOptions<T> = Omit<
2020
UseFetchOptions<T>,

src/runtime/composables/useKql.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { computed, unref } from 'vue'
1+
import { computed } from 'vue'
22
import { hash } from 'ohash'
3-
import type { Ref } from 'vue'
43
import type { NitroFetchRequest } from 'nitropack'
54
import type { AsyncData, UseFetchOptions } from 'nuxt/app'
6-
import { headersToObject } from '../utils'
5+
import type { MaybeComputedRef } from '../utils'
6+
import { headersToObject, resolveUnref } from '../utils'
77
import type { KirbyQueryRequest, KirbyQueryResponse } from '#nuxt-kql'
88
import { useFetch } from '#imports'
99
import { apiRoute } from '#build/nuxt-kql/options'
@@ -28,10 +28,8 @@ export type UseKqlOptions<T> = Omit<
2828
export function useKql<
2929
ResT extends KirbyQueryResponse = KirbyQueryResponse,
3030
ReqT extends KirbyQueryRequest = KirbyQueryRequest,
31-
>(query: (() => ReqT) | ReqT | Ref<ReqT>, opts: UseKqlOptions<ResT> = {}) {
32-
const _query = computed(() => typeof query === 'function'
33-
? (query as () => ReqT)()
34-
: unref(query))
31+
>(query: MaybeComputedRef<ReqT>, opts: UseKqlOptions<ResT> = {}) {
32+
const _query = computed(() => resolveUnref(query))
3533

3634
if (Object.keys(_query.value).length === 0 || !_query.value.query)
3735
console.error('[useKql] Empty KQL query')

src/runtime/composables/usePublicKql.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { computed, unref } from 'vue'
1+
import { computed } from 'vue'
22
import { hash } from 'ohash'
3-
import type { Ref } from 'vue'
43
import type { NitroFetchRequest } from 'nitropack'
54
import type { AsyncData, UseFetchOptions } from 'nuxt/app'
65
import type { ModuleOptions } from '../../module'
7-
import { getAuthHeaders, headersToObject } from '../utils'
6+
import type { MaybeComputedRef } from '../utils'
7+
import { getAuthHeaders, headersToObject, resolveUnref } from '../utils'
88
import type { KirbyQueryRequest, KirbyQueryResponse } from '#nuxt-kql'
99
import { useFetch, useRuntimeConfig } from '#imports'
1010

@@ -28,15 +28,13 @@ export type UseKqlOptions<T> = Omit<
2828
export function usePublicKql<
2929
ResT extends KirbyQueryResponse = KirbyQueryResponse,
3030
ReqT extends KirbyQueryRequest = KirbyQueryRequest,
31-
>(query: (() => ReqT) | ReqT | Ref<ReqT>, opts: UseKqlOptions<ResT> = {}) {
31+
>(query: MaybeComputedRef<ReqT>, opts: UseKqlOptions<ResT> = {}) {
3232
const { kql } = useRuntimeConfig().public
3333

3434
if (!kql?.clientRequests)
3535
throw new Error('Fetching queries client-side isn\'t allowed. Enable it by setting "clientRequests" to "true".')
3636

37-
const _query = computed(() => typeof query === 'function'
38-
? (query as () => ReqT)()
39-
: unref(query))
37+
const _query = computed(() => resolveUnref(query))
4038

4139
if (Object.keys(_query.value).length === 0 || !_query.value.query)
4240
console.error('[usePublicKql] Empty KQL query')
@@ -51,7 +49,6 @@ export function usePublicKql<
5149
...headersToObject(opts.headers),
5250
...getAuthHeaders(kql as ModuleOptions),
5351
...(opts.language ? { 'X-Language': opts.language } : {}),
54-
5552
},
5653
}) as AsyncData<ResT, true | Error>
5754
}

src/runtime/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
1+
import type { ComputedRef, Ref } from 'vue'
12
import type { ModuleOptions } from '../module'
23

4+
/**
5+
* Maybe it's a ref, or a plain value, or a getter function
6+
*/
7+
export type MaybeComputedRef<T> = (() => T) | ComputedRef<T> | T | Ref<T>
8+
9+
/**
10+
* Normalize value/ref/getter to `ref` or `computed`.
11+
*/
12+
export function resolveUnref<T>(r: MaybeComputedRef<T>): T {
13+
return typeof r === 'function'
14+
? (r as any)()
15+
: unref(r)
16+
}
17+
18+
/**
19+
* Normalize headers to object
20+
*/
321
export function headersToObject(headers: HeadersInit = {}): Record<string, string> {
422
// SSR compatibility for `Headers` prototype
523
if (typeof Headers !== 'undefined' && headers instanceof Headers)
@@ -11,6 +29,9 @@ export function headersToObject(headers: HeadersInit = {}): Record<string, strin
1129
return headers as Record<string, string>
1230
}
1331

32+
/**
33+
* Generate authentication headers for KQL fetch requests
34+
*/
1435
export function getAuthHeaders({ auth, token, credentials }: ModuleOptions) {
1536
const headers: Record<string, string> = {}
1637

0 commit comments

Comments
 (0)