@@ -23,9 +23,22 @@ func (m *Modeler) Model(schema *firemodel.Schema, sourceCoder firemodel.SourceCo
2323 }
2424 defer f .Close ()
2525
26+ // d, err := os.Create("firebase.d.ts")
27+ d , err := sourceCoder .NewFile ("firebase.d.ts" )
28+ if err != nil {
29+ return errors .Wrapf (err , "firemodel/ts: create typescript definition file" )
30+ }
31+ defer d .Close ()
32+
2633 if err := tpl .Execute (f , schema ); err != nil {
2734 return errors .Wrapf (err , "firemodel/ts: generating typescript" )
2835 }
36+
37+ _ , err = d .Write ([]byte (definitions ))
38+ if err != nil {
39+ return errors .Wrapf (err , "firemodel/ts: writing typescript definitions" )
40+ }
41+
2942 return nil
3043}
3144
@@ -71,7 +84,7 @@ func toTypescriptType(firetype firemodel.SchemaFieldType) string {
7184 return "firestore.Blob"
7285 case * firemodel.Reference :
7386 if firetype .T != nil {
74- return fmt .Sprintf ("DocumentReference<%s>" , interfaceName (firetype .T .Name ))
87+ return fmt .Sprintf ("firestore. DocumentReference<%s>" , interfaceName (firetype .T .Name ))
7588 } else {
7689 return "firestore.DocumentReference"
7790 }
@@ -137,128 +150,6 @@ const (
137150 file = `// DO NOT EDIT - Code generated by firemodel {{firemodelVersion}}.
138151import { firestore } from 'firebase';
139152
140- type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
141-
142- export interface Query<DataType = firestore.DocumentData>
143- extends firestore.Query {
144- where(
145- fieldPath: string | firestore.FieldPath,
146- opStr: firestore.WhereFilterOp,
147- value: any,
148- ): Query<DataType>;
149- orderBy(
150- fieldPath: string | firestore.FieldPath,
151- directionStr?: firestore.OrderByDirection,
152- ): Query<DataType>;
153- limit(limit: number): Query<DataType>;
154- startAt(snapshot: DocumentSnapshot): Query<DataType>;
155- startAt(...fieldValues: any[]): Query<DataType>;
156- startAfter(snapshot: DocumentSnapshot): Query<DataType>;
157- startAfter(...fieldValues: any[]): Query<DataType>;
158- endBefore(snapshot: DocumentSnapshot): Query<DataType>;
159- endBefore(...fieldValues: any[]): Query<DataType>;
160- endAt(snapshot: DocumentSnapshot): Query<DataType>;
161- endAt(...fieldValues: any[]): Query<DataType>;
162- get(options?: firestore.GetOptions): Promise<QuerySnapshot<DataType>>;
163- onSnapshot(observer: {
164- next?: (snapshot: QuerySnapshot<DataType>) => void;
165- error?: (error: Error) => void;
166- complete?: () => void;
167- }): () => void;
168- onSnapshot(
169- options: firestore.SnapshotListenOptions,
170- observer: {
171- next?: (snapshot: QuerySnapshot<DataType>) => void;
172- error?: (error: Error) => void;
173- complete?: () => void;
174- },
175- ): () => void;
176- onSnapshot(
177- onNext: (snapshot: QuerySnapshot<DataType>) => void,
178- onError?: (error: Error) => void,
179- onCompletion?: () => void,
180- ): () => void;
181- onSnapshot(
182- options: firestore.SnapshotListenOptions,
183- onNext: (snapshot: QuerySnapshot<DataType>) => void,
184- onError?: (error: Error) => void,
185- onCompletion?: () => void,
186- ): () => void;
187- }
188-
189-
190- export interface DocumentSnapshot<DataType = firestore.DocumentData>
191- extends firestore.DocumentSnapshot {
192- data(options?: firestore.SnapshotOptions): DataType | undefined;
193- }
194- export interface QueryDocumentSnapshot<DataType = firestore.DocumentData>
195- extends firestore.QueryDocumentSnapshot {
196- data(options?: firestore.SnapshotOptions): DataType | undefined;
197- }
198- export interface QuerySnapshot<DataType = firestore.DocumentData>
199- extends firestore.QuerySnapshot {
200- readonly docs: QueryDocumentSnapshot<DataType>[];
201- }
202- export interface DocumentSnapshotExpanded<DataType = firestore.DocumentData> {
203- exists: firestore.DocumentSnapshot['exists'];
204- ref: firestore.DocumentSnapshot['ref'];
205- id: firestore.DocumentSnapshot['id'];
206- metadata: firestore.DocumentSnapshot['metadata'];
207- data: DataType;
208- }
209- export interface QuerySnapshotExpanded<DataType = firestore.DocumentData> {
210- metadata: {
211- hasPendingWrites: firestore.QuerySnapshot['metadata']['hasPendingWrites'];
212- fromCache: firestore.QuerySnapshot['metadata']['fromCache'];
213- };
214- size: firestore.QuerySnapshot['size'];
215- empty: firestore.QuerySnapshot['empty'];
216- docs: {
217- [docId: string]: DocumentSnapshotExpanded<DataType>;
218- };
219- }
220- export interface DocumentReference<DataType = firestore.DocumentData>
221- extends firestore.DocumentReference {
222- set(data: DataType, options?: firestore.SetOptions): Promise<void>;
223- get(options?: firestore.GetOptions): Promise<DocumentSnapshot<DataType>>;
224- onSnapshot(observer: {
225- next?: (snapshot: DocumentSnapshot<DataType>) => void;
226- error?: (error: firestore.FirestoreError) => void;
227- complete?: () => void;
228- }): () => void;
229- onSnapshot(
230- options: firestore.SnapshotListenOptions,
231- observer: {
232- next?: (snapshot: DocumentSnapshot<DataType>) => void;
233- error?: (error: Error) => void;
234- complete?: () => void;
235- },
236- ): () => void;
237- onSnapshot(
238- onNext: (snapshot: DocumentSnapshot<DataType>) => void,
239- onError?: (error: Error) => void,
240- onCompletion?: () => void,
241- ): () => void;
242- onSnapshot(
243- options: firestore.SnapshotListenOptions,
244- onNext: (snapshot: DocumentSnapshot<DataType>) => void,
245- onError?: (error: Error) => void,
246- onCompletion?: () => void,
247- ): () => void;
248- }
249-
250-
251-
252- export interface CollectionReference<DataType = firestore.DocumentData>
253- extends Query<DataType>,
254- Omit<firestore.CollectionReference, keyof Query> {
255- add(data: DataType): Promise<DocumentReference>;
256- }
257- export interface Collection<DataType = firestore.DocumentData> {
258- [id: string]: DocumentSnapshotExpanded<DataType>;
259- }
260-
261-
262153// tslint:disable-next-line:no-namespace
263154export namespace {{.Options | getSchemaOption "ts" "namespace" "firemodel"}} {
264155 type URL = string;
@@ -295,7 +186,7 @@ export namespace {{.Options | getSchemaOption "ts" "namespace" "firemodel"}} {
295186 {{- else }}
296187 /** TODO: Add documentation to {{.Name}} in firemodel schema. */
297188 {{- end}}
298- {{.Name | ToLowerCamel}}: CollectionReference<{{.Type.Name | interfaceName | ToCamel}}>;
189+ {{.Name | ToLowerCamel}}: firestore. CollectionReference<{{.Type.Name | interfaceName | ToCamel}}>;
299190 {{- end}}
300191
301192 {{- range .Fields}}
@@ -352,4 +243,77 @@ export namespace {{.Options | getSchemaOption "ts" "namespace" "firemodel"}} {
352243 {{.Name}} = '{{.Name | ToScreamingSnake}}',
353244 {{- end}}
354245 }`
246+
247+ definitions = `import * as FIREBASE from 'firebase';
248+
249+ declare module 'firebase' {
250+ namespace firestore {
251+ // Snapshots
252+ export interface DocumentSnapshot<T = DocumentData> {
253+ data(options?: SnapshotOptions): D | undefined;
254+ }
255+ export interface QueryDocumentSnapshot<T = DocumentData> extends DocumentSnapshot {
256+ data(options?: SnapshotOptions): T;
257+ }
258+ export interface QuerySnapshot<T = DocumentData> {
259+ readonly docs: QueryDocumentSnapshot<T>[];
260+ forEach(callback: (result: QueryDocumentSnapshot<T>) => void, thisArg?: any): void;
261+ }
262+
263+ // References + Queries
264+ export interface DocumentReference<T = DocumentData> {
265+ onSnapshot(observer: {
266+ next?: (snapshot: DocumentSnapshot<T>) => void;
267+ error?: (error: FirestoreError) => void;
268+ complete?: () => void;
269+ }): () => void;
270+ onSnapshot(
271+ options: SnapshotListenOptions,
272+ observer: {
273+ next?: (snapshot: DocumentSnapshot<T>) => void;
274+ error?: (error: Error) => void;
275+ complete?: () => void;
276+ },
277+ ): () => void;
278+ onSnapshot(
279+ onNext: (snapshot: DocumentSnapshot<T>) => void,
280+ onError?: (error: Error) => void,
281+ onCompletion?: () => void,
282+ ): () => void;
283+ onSnapshot(
284+ options: SnapshotListenOptions,
285+ onNext: (snapshot: DocumentSnapshot<T>) => void,
286+ onError?: (error: Error) => void,
287+ onCompletion?: () => void,
288+ ): () => void;
289+ }
290+ export interface Query<T = DocumentData> {
291+ onSnapshot(observer: {
292+ next?: (snapshot: QuerySnapshot<T>) => void;
293+ error?: (error: Error) => void;
294+ complete?: () => void;
295+ }): () => void;
296+ onSnapshot(
297+ options: SnapshotListenOptions,
298+ observer: {
299+ next?: (snapshot: QuerySnapshot<T>) => void;
300+ error?: (error: Error) => void;
301+ complete?: () => void;
302+ },
303+ ): () => void;
304+ onSnapshot(
305+ onNext: (snapshot: QuerySnapshot<T>) => void,
306+ onError?: (error: Error) => void,
307+ onCompletion?: () => void,
308+ ): () => void;
309+ onSnapshot(
310+ options: SnapshotListenOptions,
311+ onNext: (snapshot: QuerySnapshot<T>) => void,
312+ onError?: (error: Error) => void,
313+ onCompletion?: () => void,
314+ ): () => void;
315+ }
316+ export interface CollectionReference<T = DocumentData> extends Query<T> {}
317+ }
318+ }`
355319)
0 commit comments