Skip to content

Commit 76e1527

Browse files
committed
fix(types): add undefined for initial values
1 parent 098c16c commit 76e1527

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed

src/database/index.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,23 @@ export function useList<T = unknown>(
190190
}) as _RefDatabase<VueDatabaseQueryData<T>>
191191
}
192192

193+
/**
194+
* Creates a reactive variable connected to the database as an object. If the reference is a primitive, it will be
195+
* converted to an object containing a `$value` property with the primitive value and an `id` property with the
196+
* reference's key.
197+
*
198+
* @param reference - Reference or query to the database
199+
* @param options - optional options
200+
*/
193201
export function useObject<T = unknown>(
194202
reference: _MaybeRef<DatabaseReference>,
195203
options?: UseObjectOptions
196204
): _RefDatabase<VueDatabaseDocumentData<T> | undefined> {
197-
const data = ref<T>() as Ref<T | undefined>
205+
const data = ref<T | null>()
198206
return _useDatabaseRef(reference, {
199207
target: data,
200208
...options,
201-
}) as _RefDatabase<VueDatabaseDocumentData<T> | undefined>
209+
}) as _RefDatabase<VueDatabaseDocumentData<T>>
202210
}
203211

204212
export const unbind = (target: Ref, reset?: ResetOption) =>

src/firestore/index.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ export function useDocument<
250250
>(
251251
documentRef: _MaybeRef<_Nullable<R>>,
252252
options?: UseDocumentOptions
253-
): _RefFirestore<_InferReferenceType<R>> // this one can't be null or should be specified in the converter
253+
): _RefFirestore<_InferReferenceType<R> | undefined> // this one can't be null or should be specified in the converter
254254

255255
/**
256256
* Creates a reactive collection (usually an array) of documents from a collection ref or a query from Firestore.
@@ -263,14 +263,12 @@ export function useDocument<
263263
export function useDocument<T>(
264264
documentRef: _MaybeRef<_Nullable<DocumentReference>>,
265265
options?: UseDocumentOptions
266-
): _RefFirestore<VueFirestoreDocumentData<T>>
266+
): _RefFirestore<VueFirestoreDocumentData<T> | undefined>
267267

268268
export function useDocument<T>(
269269
documentRef: _MaybeRef<_Nullable<DocumentReference<unknown>>>,
270270
options?: UseDocumentOptions
271-
):
272-
| _RefFirestore<VueFirestoreDocumentData<T> | null>
273-
| _RefFirestore<VueFirestoreDocumentData<T> | null> {
271+
): _RefFirestore<VueFirestoreDocumentData<T> | undefined> {
274272
// no unwrapRef to have a simpler type
275273
return _useFirestoreRef(documentRef, options) as _RefFirestore<
276274
VueFirestoreDocumentData<T>

tests/database/list.spec.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,13 @@ describe('Database lists', () => {
364364
tds(() => {
365365
const db = database
366366
const databaseRef = _databaseRef
367-
expectType<Ref<unknown[]>>(useList(databaseRef(db, 'todos')))
368-
expectType<Ref<number[]>>(useList<number>(databaseRef(db, 'todos')))
367+
expectType<Ref<VueDatabaseQueryData>>(useList(databaseRef(db, 'todos')))
368+
expectType<string | undefined>(
369+
useList(databaseRef(db, 'todos')).value?.[0]?.id
370+
)
371+
expectType<Ref<VueDatabaseQueryData<number>>>(
372+
useList<number>(databaseRef(db, 'todos'))
373+
)
369374

370375
// TODO: tests for id field
371376
})

tests/database/objects.spec.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { mount } from '@vue/test-utils'
22
import { describe, expect, it } from 'vitest'
33
import {
44
UseDatabaseRefOptions,
5-
useList,
65
useObject,
76
VueDatabaseDocumentData,
87
_RefDatabase,
@@ -196,7 +195,13 @@ describe('Database objects', () => {
196195
tds(() => {
197196
const db = database
198197
const databaseRef = _databaseRef
199-
expectType<Ref<unknown[]>>(useList(databaseRef(db, 'todos')))
200-
expectType<Ref<number[]>>(useList<number>(databaseRef(db, 'todos')))
198+
expectType<Ref<unknown>>(useObject(databaseRef(db, 'todo')))
199+
expectType<Ref<{ name: string } | null | undefined>>(
200+
useObject<{ name: string }>(databaseRef(db, 'todo'))
201+
)
202+
expectType<undefined | string>(useObject(databaseRef(db, 'todo')).value?.id)
203+
expectType<Ref<number | null | undefined>>(
204+
useObject<number>(databaseRef(db, 'todo'))
205+
)
201206
})
202207
})

tests/firestore/document.spec.ts

+21-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from 'firebase/firestore'
99
import { expectType, setupFirestoreRefs, tds, firestore } from '../utils'
1010
import { nextTick, ref, shallowRef, unref, type Ref } from 'vue'
11-
import { _MaybeRef } from '../../src/shared'
11+
import { _MaybeRef, _Nullable } from '../../src/shared'
1212
import {
1313
useDocument,
1414
VueFirestoreDocumentData,
@@ -243,14 +243,17 @@ describe(
243243
finished: boolean
244244
}
245245

246-
expectType<Ref<DocumentData | null>>(useDocument(itemRef))
246+
expectType<Ref<DocumentData | null | undefined>>(useDocument(itemRef))
247247
// @ts-expect-error
248248
expectType<Ref<number | null>>(useDocument(itemRef))
249249

250250
// Adds the id
251251
// FIXME: this one is any but the test passes
252-
expectType<string>(useDocument(doc(db, 'todos', '1')).value.id)
252+
expectType<string>(useDocument(doc(db, 'todos', '1')).value?.id)
253253
expectType<string>(useDocument<TodoI>(doc(db, 'todos', '1')).value!.id)
254+
expectType<_Nullable<TodoI>>(
255+
useDocument<TodoI>(doc(db, 'todos', '1')).value
256+
)
254257
expectType<string>(useDocument<unknown>(doc(db, 'todos', '1')).value!.id)
255258
useDocument(
256259
doc(db, 'todos').withConverter<TodoI>({
@@ -261,28 +264,36 @@ describe(
261264
toFirestore: (todo) => todo,
262265
})
263266
// @ts-expect-error: no id with custom converter
264-
).value.id
267+
).value?.id
265268

266-
expectType<Ref<number | null>>(useDocument<number>(itemRef))
267-
expectType<Ref<number | null>>(useDocument<number>(itemRef).data)
269+
expectType<Ref<number | null | undefined>>(useDocument<number>(itemRef))
270+
expectType<Ref<number | null | undefined>>(
271+
useDocument<number>(itemRef).data
272+
)
268273
// @ts-expect-error
269274
expectType<Ref<string | null>>(useDocument<number>(itemRef))
270275

271276
const refWithConverter = itemRef.withConverter<number>({
272277
toFirestore: (data) => ({ n: data }),
273278
fromFirestore: (snap, options) => snap.data(options).n as number,
274279
})
275-
expectType<Ref<number>>(useDocument(refWithConverter))
276-
expectType<Ref<number>>(useDocument(refWithConverter).data)
280+
expectType<Ref<number | number | undefined>>(
281+
useDocument(refWithConverter)
282+
)
283+
expectType<Ref<number | number | undefined>>(
284+
useDocument(refWithConverter).data
285+
)
277286
// should not be null
278-
useDocument(refWithConverter).value.toFixed(14)
287+
useDocument(refWithConverter).value?.toFixed(14)
279288
// @ts-expect-error: string is not assignable to number
280289
expectType<Ref<string>>(useDocument(refWithConverter))
281290
// @ts-expect-error: no id when a custom converter is used
282291
useDocument(refWithConverter).value.id
283292

284293
// destructuring
285-
expectType<Ref<DocumentData | null>>(useDocument(itemRef).data)
294+
expectType<Ref<DocumentData | null | undefined>>(
295+
useDocument(itemRef).data
296+
)
286297
expectType<Ref<FirestoreError | undefined>>(useDocument(itemRef).error)
287298
expectType<Ref<boolean>>(useDocument(itemRef).pending)
288299
})

0 commit comments

Comments
 (0)