convex-helpers
Advanced tools
Comparing version 0.1.12 to 0.1.13
@@ -8,3 +8,3 @@ /** | ||
*/ | ||
export declare function asyncMap<FromType, ToType>(list: Iterable<FromType>, asyncTransform: (item: FromType) => Promise<ToType>): Promise<ToType[]>; | ||
export declare function asyncMap<FromType, ToType>(list: Iterable<FromType>, asyncTransform: (item: FromType, index: number) => Promise<ToType>): Promise<ToType[]>; | ||
/** | ||
@@ -11,0 +11,0 @@ * Filters out null elements from an array. |
@@ -10,4 +10,6 @@ /** | ||
const promises = []; | ||
let index = 0; | ||
for (const item of list) { | ||
promises.push(asyncTransform(item)); | ||
promises.push(asyncTransform(item, index)); | ||
index += 1; | ||
} | ||
@@ -14,0 +16,0 @@ return Promise.all(promises); |
@@ -1,2 +0,2 @@ | ||
import { FieldTypeFromFieldPath, TableNamesInDataModel, GenericDataModel, GenericDatabaseReader, DocumentByName, SystemTableNames } from "convex/server"; | ||
import { FieldTypeFromFieldPath, TableNamesInDataModel, GenericDataModel, GenericDatabaseReader, DocumentByName, SystemTableNames, NamedIndex, NamedTableInfo, IndexNames, FieldPaths } from "convex/server"; | ||
import { GenericId } from "convex/values"; | ||
@@ -21,10 +21,11 @@ /** | ||
export declare function getAllOrThrow<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>>(db: GenericDatabaseReader<DataModel>, ids: Iterable<GenericId<TableName>>): Promise<DocumentByName<DataModel, TableName>[]>; | ||
type UserIndexes<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>> = Exclude<keyof DataModel[TableName]["indexes"], "by_creation_time"> & string; | ||
type UserIndexes<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>> = Exclude<IndexNames<NamedTableInfo<DataModel, TableName>>, "by_creation_time"> & string; | ||
type TablesWithLookups<DataModel extends GenericDataModel> = { | ||
[T in TableNamesInDataModel<DataModel>]: UserIndexes<DataModel, T> extends never ? never : T; | ||
}[TableNamesInDataModel<DataModel>]; | ||
type FirstIndexField<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>, IndexName extends IndexNames<NamedTableInfo<DataModel, TableName>>> = NamedIndex<NamedTableInfo<DataModel, TableName>, IndexName>[0]; | ||
type LookupFieldPaths<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>> = { | ||
[Index in UserIndexes<DataModel, TableName>]: DataModel[TableName]["indexes"][Index][0]; | ||
[IndexName in UserIndexes<DataModel, TableName>]: FirstIndexField<DataModel, TableName, IndexName>; | ||
}[UserIndexes<DataModel, TableName>]; | ||
type FieldIfDoesntMatchIndex<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>, IndexName extends UserIndexes<DataModel, TableName>> = DataModel[TableName]["indexes"][IndexName][0] extends IndexName ? [DataModel[TableName]["indexes"][IndexName][0]?] : [DataModel[TableName]["indexes"][IndexName][0]]; | ||
type FieldIfDoesntMatchIndex<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>, IndexName extends UserIndexes<DataModel, TableName>> = FirstIndexField<DataModel, TableName, IndexName> extends IndexName ? IndexName extends `by_${infer _}` ? never : [FirstIndexField<DataModel, TableName, IndexName>?] : `by_${FirstIndexField<DataModel, TableName, IndexName>}` extends IndexName ? [FirstIndexField<DataModel, TableName, IndexName>?] : [FirstIndexField<DataModel, TableName, IndexName>]; | ||
/** | ||
@@ -49,3 +50,3 @@ * Get a document matching the given value for a specified field. | ||
*/ | ||
export declare function getOneFrom<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, DataModel[TableName]["indexes"][IndexName][0]>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName> | null>; | ||
export declare function getOneFrom<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, FirstIndexField<DataModel, TableName, IndexName>>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName> | null>; | ||
/** | ||
@@ -70,3 +71,3 @@ * Get a document matching the given value for a specified field. | ||
*/ | ||
export declare function getOneFromOrThrow<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, DataModel[TableName]["indexes"][IndexName][0]>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName>>; | ||
export declare function getOneFromOrThrow<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, FirstIndexField<DataModel, TableName, IndexName>>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName>>; | ||
/** | ||
@@ -90,6 +91,6 @@ * Get a list of documents matching the given value for a specified field. | ||
*/ | ||
export declare function getManyFrom<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, DataModel[TableName]["indexes"][IndexName][0]>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName>[]>; | ||
export declare function getManyFrom<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>, IndexName extends UserIndexes<DataModel, TableName>>(db: GenericDatabaseReader<DataModel>, table: TableName, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, TableName>, FirstIndexField<DataModel, TableName, IndexName>>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName>): Promise<DocumentByName<DataModel, TableName>[]>; | ||
type IdFilePaths<DataModel extends GenericDataModel, InTableName extends TableNamesInDataModel<DataModel>, TableName extends TableNamesInDataModel<DataModel> | SystemTableNames> = { | ||
[FieldName in DataModel[InTableName]["fieldPaths"]]: FieldTypeFromFieldPath<DocumentByName<DataModel, InTableName>, FieldName> extends GenericId<TableName> ? FieldName extends "_id" ? never : FieldName : never; | ||
}[DataModel[InTableName]["fieldPaths"]]; | ||
[FieldName in FieldPaths<NamedTableInfo<DataModel, InTableName>>]: FieldTypeFromFieldPath<DocumentByName<DataModel, InTableName>, FieldName> extends GenericId<TableName> ? FieldName extends "_id" ? never : FieldName : never; | ||
}[FieldPaths<NamedTableInfo<DataModel, InTableName>>]; | ||
type LookupAndIdFilePaths<DataModel extends GenericDataModel, TableName extends TablesWithLookups<DataModel>> = { | ||
@@ -125,3 +126,3 @@ [FieldPath in IdFilePaths<DataModel, TableName, TableNamesInDataModel<DataModel> | SystemTableNames>]: LookupFieldPaths<DataModel, TableName> extends FieldPath ? never : true; | ||
*/ | ||
export declare function getManyVia<DataModel extends GenericDataModel, JoinTableName extends JoinTables<DataModel>, ToField extends IdFilePaths<DataModel, JoinTableName, TableNamesInDataModel<DataModel> | SystemTableNames>, IndexName extends UserIndexes<DataModel, JoinTableName>, TargetTableName extends FieldTypeFromFieldPath<DocumentByName<DataModel, JoinTableName>, ToField> extends GenericId<infer TargetTableName> ? TargetTableName : never>(db: GenericDatabaseReader<DataModel>, table: JoinTableName, toField: ToField, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, JoinTableName>, DataModel[JoinTableName]["indexes"][IndexName][0]>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, JoinTableName, IndexName>): Promise<(DocumentByName<DataModel, TargetTableName> | null)[]>; | ||
export declare function getManyVia<DataModel extends GenericDataModel, JoinTableName extends JoinTables<DataModel>, ToField extends IdFilePaths<DataModel, JoinTableName, TableNamesInDataModel<DataModel> | SystemTableNames>, IndexName extends UserIndexes<DataModel, JoinTableName>, TargetTableName extends FieldTypeFromFieldPath<DocumentByName<DataModel, JoinTableName>, ToField> extends GenericId<infer TargetTableName> ? TargetTableName : never>(db: GenericDatabaseReader<DataModel>, table: JoinTableName, toField: ToField, index: IndexName, value: FieldTypeFromFieldPath<DocumentByName<DataModel, JoinTableName>, FirstIndexField<DataModel, JoinTableName, IndexName>>, ...fieldArg: FieldIfDoesntMatchIndex<DataModel, JoinTableName, IndexName>): Promise<(DocumentByName<DataModel, TargetTableName> | null)[]>; | ||
/** | ||
@@ -128,0 +129,0 @@ * Get related documents by using a join table. |
@@ -24,2 +24,9 @@ import { asyncMap, nullThrows } from ".."; | ||
} | ||
function firstIndexField(index, field) { | ||
if (field) | ||
return field; | ||
if (index.startsWith("by_")) | ||
return index.slice(3); | ||
return index; | ||
} | ||
/** | ||
@@ -45,3 +52,3 @@ * Get a document matching the given value for a specified field. | ||
export async function getOneFrom(db, table, index, value, ...fieldArg) { | ||
const field = fieldArg[0] ?? index; | ||
const field = firstIndexField(index, fieldArg[0]); | ||
return db | ||
@@ -72,3 +79,3 @@ .query(table) | ||
export async function getOneFromOrThrow(db, table, index, value, ...fieldArg) { | ||
const field = fieldArg[0] ?? index; | ||
const field = firstIndexField(index, fieldArg[0]); | ||
const ret = await db | ||
@@ -99,3 +106,3 @@ .query(table) | ||
export async function getManyFrom(db, table, index, value, ...fieldArg) { | ||
const field = fieldArg[0] ?? index; | ||
const field = firstIndexField(index, fieldArg[0]); | ||
return db | ||
@@ -102,0 +109,0 @@ .query(table) |
@@ -10,7 +10,9 @@ /** | ||
list: Iterable<FromType>, | ||
asyncTransform: (item: FromType) => Promise<ToType> | ||
asyncTransform: (item: FromType, index: number) => Promise<ToType> | ||
): Promise<ToType[]> { | ||
const promises: Promise<ToType>[] = []; | ||
let index = 0; | ||
for (const item of list) { | ||
promises.push(asyncTransform(item)); | ||
promises.push(asyncTransform(item, index)); | ||
index += 1; | ||
} | ||
@@ -17,0 +19,0 @@ return Promise.all(promises); |
{ | ||
"name": "convex-helpers", | ||
"version": "0.1.12", | ||
"version": "0.1.13", | ||
"description": "A collection of useful code to complement the official convex package.", | ||
@@ -5,0 +5,0 @@ "exports": { |
@@ -8,2 +8,6 @@ import { | ||
SystemTableNames, | ||
NamedIndex, | ||
NamedTableInfo, | ||
IndexNames, | ||
FieldPaths, | ||
} from "convex/server"; | ||
@@ -52,3 +56,7 @@ import { GenericId } from "convex/values"; | ||
TableName extends TableNamesInDataModel<DataModel> | ||
> = Exclude<keyof DataModel[TableName]["indexes"], "by_creation_time"> & string; | ||
> = Exclude< | ||
IndexNames<NamedTableInfo<DataModel, TableName>>, | ||
"by_creation_time" | ||
> & | ||
string; | ||
@@ -64,2 +72,8 @@ type TablesWithLookups<DataModel extends GenericDataModel> = { | ||
type FirstIndexField< | ||
DataModel extends GenericDataModel, | ||
TableName extends TableNamesInDataModel<DataModel>, | ||
IndexName extends IndexNames<NamedTableInfo<DataModel, TableName>> | ||
> = NamedIndex<NamedTableInfo<DataModel, TableName>, IndexName>[0]; | ||
// `FieldPath`s that have an index starting with them | ||
@@ -71,6 +85,7 @@ // e.g. `.index("...", [FieldPath, ...])` on the table. | ||
> = { | ||
[Index in UserIndexes< | ||
[IndexName in UserIndexes<DataModel, TableName>]: FirstIndexField< | ||
DataModel, | ||
TableName | ||
>]: DataModel[TableName]["indexes"][Index][0]; | ||
TableName, | ||
IndexName | ||
>; | ||
}[UserIndexes<DataModel, TableName>]; | ||
@@ -80,2 +95,4 @@ | ||
// To be used as a spread argument to optionally require the field name. | ||
// It also allows a field to have an index `by_${field}`, though this means | ||
// it doesn't allow fields that start with a `by_` prefix. | ||
type FieldIfDoesntMatchIndex< | ||
@@ -85,6 +102,24 @@ DataModel extends GenericDataModel, | ||
IndexName extends UserIndexes<DataModel, TableName> | ||
> = DataModel[TableName]["indexes"][IndexName][0] extends IndexName | ||
? [DataModel[TableName]["indexes"][IndexName][0]?] | ||
: [DataModel[TableName]["indexes"][IndexName][0]]; | ||
> = FirstIndexField<DataModel, TableName, IndexName> extends IndexName | ||
? // Enforce the variable itself doesn't start with "by_" | ||
IndexName extends `by_${infer _}` | ||
? never | ||
: [FirstIndexField<DataModel, TableName, IndexName>?] | ||
: `by_${FirstIndexField<DataModel, TableName, IndexName>}` extends IndexName | ||
? [FirstIndexField<DataModel, TableName, IndexName>?] | ||
: [FirstIndexField<DataModel, TableName, IndexName>]; | ||
function firstIndexField< | ||
DataModel extends GenericDataModel, | ||
TableName extends TablesWithLookups<DataModel>, | ||
IndexName extends UserIndexes<DataModel, TableName> | ||
>( | ||
index: IndexName, | ||
field?: FirstIndexField<DataModel, TableName, IndexName> | ||
): FirstIndexField<DataModel, TableName, IndexName> { | ||
if (field) return field; | ||
if (index.startsWith("by_")) return index.slice(3); | ||
return index; | ||
} | ||
/** | ||
@@ -119,8 +154,7 @@ * Get a document matching the given value for a specified field. | ||
DocumentByName<DataModel, TableName>, | ||
DataModel[TableName]["indexes"][IndexName][0] | ||
FirstIndexField<DataModel, TableName, IndexName> | ||
>, | ||
...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName> | ||
): Promise<DocumentByName<DataModel, TableName> | null> { | ||
const field = | ||
fieldArg[0] ?? (index as DataModel[TableName]["indexes"][IndexName][0]); | ||
const field = firstIndexField(index, fieldArg[0]); | ||
return db | ||
@@ -161,8 +195,7 @@ .query(table) | ||
DocumentByName<DataModel, TableName>, | ||
DataModel[TableName]["indexes"][IndexName][0] | ||
FirstIndexField<DataModel, TableName, IndexName> | ||
>, | ||
...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName> | ||
): Promise<DocumentByName<DataModel, TableName>> { | ||
const field = | ||
fieldArg[0] ?? (index as DataModel[TableName]["indexes"][IndexName][0]); | ||
const field = firstIndexField(index, fieldArg[0]); | ||
const ret = await db | ||
@@ -206,8 +239,7 @@ .query(table) | ||
DocumentByName<DataModel, TableName>, | ||
DataModel[TableName]["indexes"][IndexName][0] | ||
FirstIndexField<DataModel, TableName, IndexName> | ||
>, | ||
...fieldArg: FieldIfDoesntMatchIndex<DataModel, TableName, IndexName> | ||
): Promise<DocumentByName<DataModel, TableName>[]> { | ||
const field = | ||
fieldArg[0] ?? (index as DataModel[TableName]["indexes"][IndexName][0]); | ||
const field = firstIndexField(index, fieldArg[0]); | ||
return db | ||
@@ -225,3 +257,5 @@ .query(table) | ||
> = { | ||
[FieldName in DataModel[InTableName]["fieldPaths"]]: FieldTypeFromFieldPath< | ||
[FieldName in FieldPaths< | ||
NamedTableInfo<DataModel, InTableName> | ||
>]: FieldTypeFromFieldPath< | ||
DocumentByName<DataModel, InTableName>, | ||
@@ -234,3 +268,3 @@ FieldName | ||
: never; | ||
}[DataModel[InTableName]["fieldPaths"]]; | ||
}[FieldPaths<NamedTableInfo<DataModel, InTableName>>]; | ||
@@ -313,3 +347,3 @@ // Whether a table has an ID field that isn't its sole lookup field. | ||
DocumentByName<DataModel, JoinTableName>, | ||
DataModel[JoinTableName]["indexes"][IndexName][0] | ||
FirstIndexField<DataModel, JoinTableName, IndexName> | ||
>, | ||
@@ -316,0 +350,0 @@ ...fieldArg: FieldIfDoesntMatchIndex<DataModel, JoinTableName, IndexName> |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
253904
4777