From 3321189feebd70db3cba597e95e8f927f81e416d Mon Sep 17 00:00:00 2001 From: trickstival Date: Sat, 28 Sep 2019 13:01:55 -0300 Subject: [PATCH] fix(typings): added support for this referencing inside firestore and firebase functions --- packages/vuefire/src/firestore.ts | 13 +++++++++++-- packages/vuefire/src/index.ts | 30 ++++++++++++++++++++++++++++++ packages/vuefire/src/rtdb.ts | 12 ++++++++++-- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/packages/vuefire/src/firestore.ts b/packages/vuefire/src/firestore.ts index 13b22f7a..64e14195 100644 --- a/packages/vuefire/src/firestore.ts +++ b/packages/vuefire/src/firestore.ts @@ -8,6 +8,7 @@ import { } from '@posva/vuefire-core' import { firestore } from 'firebase' import Vue, { PluginFunction } from 'vue' +import { CombinedVueInstance } from 'vue/types/vue' const ops: OperationsType = { set: (target, key, value) => walkSet(target, key, value), @@ -96,8 +97,15 @@ type VueFirestoreObject = Record< type FirestoreOption = VueFirestoreObject | ((this: V) => VueFirestoreObject) declare module 'vue/types/options' { - interface ComponentOptions { - firestore?: FirestoreOption + interface ComponentOptions< + V extends Vue, + Data = DefaultData, + Methods = DefaultMethods, + Computed = DefaultComputed, + PropsDef = PropsDefinition, + Props = DefaultProps + > { + firestore?: FirestoreOption> } } @@ -142,6 +150,7 @@ export const firestorePlugin: PluginFunction = function firestore }, created(this: Vue) { const { firestore } = this.$options + // @ts-ignore const refs = typeof firestore === 'function' ? firestore.call(this) : firestore if (!refs) return for (const key in refs) { diff --git a/packages/vuefire/src/index.ts b/packages/vuefire/src/index.ts index eec583b5..aecda5c5 100644 --- a/packages/vuefire/src/index.ts +++ b/packages/vuefire/src/index.ts @@ -1,2 +1,32 @@ +import { + DefaultData, + DefaultMethods, + DefaultComputed, + ThisTypedComponentOptionsWithArrayProps, + DefaultProps, + ThisTypedComponentOptionsWithRecordProps, +} from 'vue/types/options' + export * from './rtdb' export * from './firestore' + +declare module 'vue/types/vue' { + interface VueConstructor { + extend< + Data = DefaultData, + Methods = DefaultMethods, + Computed = DefaultComputed, + PropNames extends string = never + >( + options?: ThisTypedComponentOptionsWithArrayProps + ): ExtendedVue> + extend< + Data = DefaultData, + Methods = DefaultMethods, + Computed = DefaultComputed, + Props = DefaultProps + >( + options?: ThisTypedComponentOptionsWithRecordProps + ): ExtendedVue + } +} diff --git a/packages/vuefire/src/rtdb.ts b/packages/vuefire/src/rtdb.ts index 0686d8bf..b691426a 100644 --- a/packages/vuefire/src/rtdb.ts +++ b/packages/vuefire/src/rtdb.ts @@ -8,6 +8,7 @@ import { } from '@posva/vuefire-core' import { database } from 'firebase' import Vue, { PluginFunction } from 'vue' +import { CombinedVueInstance } from 'vue/types/vue' /** * Returns the original reference of a Firebase reference or query across SDK versions. @@ -99,8 +100,15 @@ type VueFirebaseObject = Record type FirebaseOption = VueFirebaseObject | ((this: V) => VueFirebaseObject) declare module 'vue/types/options' { - interface ComponentOptions { - firebase?: FirebaseOption + interface ComponentOptions< + V extends Vue, + Data = DefaultData, + Methods = DefaultMethods, + Computed = DefaultComputed, + PropsDef = PropsDefinition, + Props = DefaultProps + > { + firebase?: FirebaseOption> } }