Skip to content

Commit

Permalink
Fix set method param types
Browse files Browse the repository at this point in the history
  • Loading branch information
kafkas committed Dec 23, 2023
1 parent 1353669 commit c2627d2
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ defaultMigrator.setWithDerivedData((doc) => {
});
defaultMigrator.setWithDerivedData(
(doc) => {
// TODO: We probably want firestore.QueryDocumentSnapshot<D> here
expectType<firestore.QueryDocumentSnapshot<Partial<D>>>(doc);
expectType<firestore.QueryDocumentSnapshot<D>>(doc);
return { num: 0 };
},
{ merge: true }
Expand Down
4 changes: 2 additions & 2 deletions src/api/createBatchMigrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export function createBatchMigrator<D = firestore.DocumentData>(
traversalConfig?: Partial<TraversalConfig>
): BatchMigrator<D> {
const traverser = isTraverser(traversableOrTraverser)
? traversableOrTraverser
: createTraverser(traversableOrTraverser, traversalConfig);
? (traversableOrTraverser as Traverser<D>)
: createTraverser(traversableOrTraverser as Traversable<D>, traversalConfig);
return new BasicBatchMigratorImpl(traverser);
}
4 changes: 2 additions & 2 deletions src/api/createMigrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function createMigrator<D = firestore.DocumentData>(
traversalConfig?: Partial<TraversalConfig>
): DefaultMigrator<D> {
const traverser = isTraverser(traversableOrTraverser)
? traversableOrTraverser
: createTraverser(traversableOrTraverser, traversalConfig);
? (traversableOrTraverser as Traverser<D>)
: createTraverser(traversableOrTraverser as Traversable<D>, traversalConfig);
return new BasicDefaultMigratorImpl(traverser);
}
19 changes: 10 additions & 9 deletions src/api/interfaces/Migrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
MigrationResult,
SetDataGetter,
SetOptions,
SetPartialDataGetter,
Traverser,
UpdateDataGetter,
UpdateFieldValueGetter,
Expand Down Expand Up @@ -208,9 +209,10 @@ export interface Migrator<D = firestore.DocumentData> {
* - _SC_(`traverser`): space complexity of the underlying traverser
*
* @param data - A data object with which to set each document.
* @param options - An object to configure the set behavior.
* @returns A Promise resolving to an object representing the details of the migration.
*/
set(data: D): Promise<MigrationResult>;
set(data: firestore.PartialWithFieldValue<D>, options: SetOptions): Promise<MigrationResult>;

/**
* Sets all documents in this collection with the provided data.
Expand All @@ -232,10 +234,9 @@ export interface Migrator<D = firestore.DocumentData> {
* - _SC_(`traverser`): space complexity of the underlying traverser
*
* @param data - A data object with which to set each document.
* @param options - An object to configure the set behavior.
* @returns A Promise resolving to an object representing the details of the migration.
*/
set(data: Partial<D>, options: SetOptions): Promise<MigrationResult>;
set(data: firestore.WithFieldValue<D>): Promise<MigrationResult>;

/**
* Sets all documents in this collection with the provided data.
Expand All @@ -258,9 +259,13 @@ export interface Migrator<D = firestore.DocumentData> {
*
* @param getData - A function that takes a document snapshot and returns a data object with
* which to set each document.
* @param options - An object to configure the set behavior.
* @returns A Promise resolving to an object representing the details of the migration.
*/
setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;
setWithDerivedData(
getData: SetPartialDataGetter<D>,
options: SetOptions
): Promise<MigrationResult>;

/**
* Sets all documents in this collection with the provided data.
Expand All @@ -283,13 +288,9 @@ export interface Migrator<D = firestore.DocumentData> {
*
* @param getData - A function that takes a document snapshot and returns a data object with
* which to set each document.
* @param options - An object to configure the set behavior.
* @returns A Promise resolving to an object representing the details of the migration.
*/
setWithDerivedData(
getData: SetDataGetter<Partial<D>>,
options: SetOptions
): Promise<MigrationResult>;
setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

/**
* Updates all documents in this collection with the provided data.
Expand Down
2 changes: 1 addition & 1 deletion src/api/interfaces/SetDataGetter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ import type { firestore } from 'firebase-admin';
*/
export type SetDataGetter<D = firestore.DocumentData> = (
doc: firestore.QueryDocumentSnapshot<D>
) => D;
) => firestore.WithFieldValue<D>;
8 changes: 8 additions & 0 deletions src/api/interfaces/SetPartialDataGetter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { firestore } from 'firebase-admin';

/**
* A function that takes a document snapshot and derives the data with which to partially set that document.
*/
export type SetPartialDataGetter<D = firestore.DocumentData> = (
doc: firestore.QueryDocumentSnapshot<D>
) => firestore.PartialWithFieldValue<D>;
1 change: 1 addition & 0 deletions src/api/interfaces/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export type { MigrationResult } from './MigrationResult';
export type { Migrator } from './Migrator';
export type { SetDataGetter } from './SetDataGetter';
export type { SetOptions } from './SetOptions';
export type { SetPartialDataGetter } from './SetPartialDataGetter';
export type { Traversable } from './Traversable';
export type { TraversalConfig } from './TraversalConfig';
export type { TraversalResult } from './TraversalResult';
Expand Down
37 changes: 22 additions & 15 deletions src/internal/implementations/BasicBatchMigratorImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
MigrationResult,
SetDataGetter,
SetOptions,
SetPartialDataGetter,
Traverser,
UpdateDataGetter,
UpdateFieldValueGetter,
Expand Down Expand Up @@ -53,41 +54,47 @@ export class BasicBatchMigratorImpl<D> extends AbstractMigrator<D> implements Ba
);
}

public set(data: D): Promise<MigrationResult>;
public set(
data: firestore.PartialWithFieldValue<D>,
options: SetOptions
): Promise<MigrationResult>;

public set(data: Partial<D>, options: SetOptions): Promise<MigrationResult>;
public set(data: firestore.WithFieldValue<D>): Promise<MigrationResult>;

public async set(data: D | Partial<D>, options?: SetOptions): Promise<MigrationResult> {
public async set(
data: firestore.PartialWithFieldValue<D> | firestore.WithFieldValue<D>,
options?: SetOptions
): Promise<MigrationResult> {
return this.#migrate((writeBatch, doc) => {
if (options === undefined) {
// Signature 1
writeBatch.set(doc.ref, data as D);
} else {
// Signature 2
writeBatch.set(doc.ref, data as Partial<D>, options);
writeBatch.set(doc.ref, data as firestore.WithFieldValue<D>);
} else {
// Signature 1
writeBatch.set(doc.ref, data as firestore.PartialWithFieldValue<D>, options);
}
});
}

public setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

public setWithDerivedData(
getData: SetDataGetter<Partial<D>>,
getData: SetPartialDataGetter<D>,
options: SetOptions
): Promise<MigrationResult>;

public setWithDerivedData(
getData: SetDataGetter<D> | SetDataGetter<Partial<D>>,
public setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

public async setWithDerivedData(
getData: SetPartialDataGetter<D> | SetDataGetter<D>,
options?: SetOptions
): Promise<MigrationResult> {
return this.#migrate((writeBatch, doc) => {
if (options === undefined) {
// Signature 1
// Signature 2
const data = (getData as SetDataGetter<D>)(doc);
writeBatch.set(doc.ref, data);
} else {
// Signature 2
const data = (getData as SetDataGetter<D | Partial<D>>)(doc);
// Signature 1
const data = (getData as SetPartialDataGetter<D>)(doc);
writeBatch.set(doc.ref, data, options);
}
});
Expand Down
35 changes: 21 additions & 14 deletions src/internal/implementations/BasicDefaultMigratorImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
MigrationResult,
SetDataGetter,
SetOptions,
SetPartialDataGetter,
Traverser,
UpdateDataGetter,
UpdateFieldValueGetter,
Expand Down Expand Up @@ -35,41 +36,47 @@ export class BasicDefaultMigratorImpl<D> extends AbstractMigrator<D> implements
);
}

public set(data: D): Promise<MigrationResult>;
public set(
data: firestore.PartialWithFieldValue<D>,
options: SetOptions
): Promise<MigrationResult>;

public set(data: Partial<D>, options: SetOptions): Promise<MigrationResult>;
public set(data: firestore.WithFieldValue<D>): Promise<MigrationResult>;

public async set(data: D | Partial<D>, options?: SetOptions): Promise<MigrationResult> {
public async set(
data: firestore.PartialWithFieldValue<D> | firestore.WithFieldValue<D>,
options?: SetOptions
): Promise<MigrationResult> {
return this.#migrate(async (doc) => {
if (options === undefined) {
// Signature 1
await doc.ref.set(data as D);
} else {
// Signature 2
await doc.ref.set(data as Partial<D>, options);
await doc.ref.set(data as firestore.WithFieldValue<D>);
} else {
// Signature 1
await doc.ref.set(data as firestore.PartialWithFieldValue<D>, options);
}
});
}

public setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

public setWithDerivedData(
getData: SetDataGetter<Partial<D>>,
getData: SetPartialDataGetter<D>,
options: SetOptions
): Promise<MigrationResult>;

public setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

public async setWithDerivedData(
getData: SetDataGetter<D> | SetDataGetter<Partial<D>>,
getData: SetPartialDataGetter<D> | SetDataGetter<D>,
options?: SetOptions
): Promise<MigrationResult> {
return this.#migrate(async (doc) => {
if (options === undefined) {
// Signature 1
// Signature 2
const data = (getData as SetDataGetter<D>)(doc);
await doc.ref.set(data);
} else {
// Signature 2
const data = (getData as SetDataGetter<D | Partial<D>>)(doc);
// Signature 1
const data = (getData as SetPartialDataGetter<D>)(doc);
await doc.ref.set(data, options);
}
});
Expand Down
14 changes: 9 additions & 5 deletions src/internal/implementations/abstract/AbstractMigrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {
Migrator,
SetDataGetter,
SetOptions,
SetPartialDataGetter,
Traverser,
UpdateDataGetter,
UpdateFieldValueGetter,
Expand Down Expand Up @@ -109,17 +110,20 @@ export abstract class AbstractMigrator<D> implements Migrator<D> {

public abstract withTraverser(traverser: Traverser<D>): Migrator<D>;

public abstract set(data: D): Promise<MigrationResult>;

public abstract set(data: Partial<D>, options: SetOptions): Promise<MigrationResult>;
public abstract set(
data: firestore.PartialWithFieldValue<D>,
options: SetOptions
): Promise<MigrationResult>;

public abstract setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;
public abstract set(data: firestore.WithFieldValue<D>): Promise<MigrationResult>;

public abstract setWithDerivedData(
getData: SetDataGetter<Partial<D>>,
getData: SetPartialDataGetter<D>,
options: SetOptions
): Promise<MigrationResult>;

public abstract setWithDerivedData(getData: SetDataGetter<D>): Promise<MigrationResult>;

public abstract update<D>(
data: firestore.UpdateData<D>,
precondition?: firestore.Precondition
Expand Down

0 comments on commit c2627d2

Please sign in to comment.