@farming-labs/orm-firestore 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +860 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +60 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +843 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createDriverHandle,\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n type OrmDriver,\n type OrmDriverHandle,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype FirestoreRow = Record<string, unknown>;\ntype FirestoreWhere = Where<Record<string, unknown>>;\n\nexport type FirestoreDocumentSnapshotLike = {\n id: string;\n exists: boolean;\n data(): FirestoreRow | undefined;\n ref?: FirestoreDocumentReferenceLike;\n};\n\nexport type FirestoreQuerySnapshotLike = {\n docs: FirestoreDocumentSnapshotLike[];\n};\n\nexport type FirestoreQueryLike = {\n get(): Promise<FirestoreQuerySnapshotLike>;\n};\n\nexport type FirestoreDocumentReferenceLike = {\n id: string;\n get(): Promise<FirestoreDocumentSnapshotLike>;\n set(data: FirestoreRow, options?: { merge?: boolean }): Promise<unknown>;\n update(data: Partial<FirestoreRow>): Promise<unknown>;\n delete(): Promise<unknown>;\n};\n\nexport type FirestoreCollectionLike = FirestoreQueryLike & {\n doc(id?: string): FirestoreDocumentReferenceLike;\n id?: string;\n};\n\nexport type FirestoreTransactionLike = {\n get(\n target: FirestoreCollectionLike | FirestoreQueryLike | FirestoreDocumentReferenceLike,\n ): Promise<FirestoreQuerySnapshotLike | FirestoreDocumentSnapshotLike>;\n set(\n reference: FirestoreDocumentReferenceLike,\n data: FirestoreRow,\n options?: { merge?: boolean },\n ): unknown;\n update(reference: FirestoreDocumentReferenceLike, data: Partial<FirestoreRow>): unknown;\n delete(reference: FirestoreDocumentReferenceLike): unknown;\n};\n\nexport type FirestoreDbLike = {\n collection(name: string): FirestoreCollectionLike;\n runTransaction?<TResult>(\n updateFunction: (transaction: FirestoreTransactionLike) => Promise<TResult>,\n ): Promise<TResult>;\n getAll?(...references: unknown[]): Promise<unknown[]>;\n batch?(): unknown;\n};\n\nexport type FirestoreCollectionMap<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, FirestoreCollectionLike>\n>;\n\nexport type FirestoreFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type FirestoreDriverConfig<TSchema extends SchemaDefinition<any>> = {\n db: FirestoreDbLike;\n collections?: FirestoreCollectionMap<TSchema>;\n transforms?: Partial<Record<string, Partial<Record<string, FirestoreFieldTransform>>>>;\n};\n\nexport type FirestoreDriverClient<TSchema extends SchemaDefinition<any>> = {\n db: FirestoreDbLike;\n collections?: FirestoreCollectionMap<TSchema>;\n};\n\nexport type FirestoreDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"firestore\",\n FirestoreDriverClient<TSchema>\n>;\n\ntype LoadedRow = {\n docId: string;\n ref: FirestoreDocumentReferenceLike;\n data: FirestoreRow;\n stored: FirestoreRow;\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction isTimestampLike(value: unknown): value is { toDate(): Date } {\n return (\n !!value && typeof value === \"object\" && \"toDate\" in value && typeof value.toDate === \"function\"\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction isComparable(value: unknown) {\n return (\n value instanceof Date ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n );\n}\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n if (\"eq\" in filter && !equalValues(value, filter.eq)) return false;\n if (\"not\" in filter && equalValues(value, filter.not)) return false;\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in filter) {\n if (typeof value !== \"string\" || typeof filter.contains !== \"string\") return false;\n if (!value.includes(filter.contains)) return false;\n }\n if (\"gt\" in filter) {\n if (!isComparable(value) || value <= filter.gt!) return false;\n }\n if (\"gte\" in filter) {\n if (!isComparable(value) || value < filter.gte!) return false;\n }\n if (\"lt\" in filter) {\n if (!isComparable(value) || value >= filter.lt!) return false;\n }\n if (\"lte\" in filter) {\n if (!isComparable(value) || value > filter.lte!) return false;\n }\n\n return true;\n}\n\nfunction matchesWhere<TRecord extends Record<string, unknown>>(\n record: TRecord,\n where?: FirestoreWhere,\n) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause) => matchesWhere(record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesWhere(record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateFilter(record[key], filter)) return false;\n }\n\n return true;\n}\n\nfunction sortRows(rows: LoadedRow[], orderBy?: Partial<Record<string, \"asc\" | \"desc\">>) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left.data[field];\n const b = right.data[field];\n if (equalValues(a, b)) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n\n return 0;\n });\n}\n\nfunction pageRows(rows: LoadedRow[], skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\nfunction applyQuery(\n rows: LoadedRow[],\n args: {\n where?: FirestoreWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n } = {},\n) {\n const filtered = rows.filter((row) => matchesWhere(row.data, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n}\n\nfunction firestoreConstraintError(target: string | string[]) {\n const fields = Array.isArray(target) ? target.join(\", \") : target;\n const error = new Error(`Firestore unique constraint violation on ${fields}.`);\n Object.assign(error, {\n code: 6,\n details: error.message,\n target,\n });\n return error;\n}\n\nfunction normalizeDocumentId(value: unknown) {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction hasTransactionSupport(db: FirestoreDbLike) {\n return typeof db.runTransaction === \"function\";\n}\n\nfunction createFirestoreDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: FirestoreDriverConfig<TSchema>,\n state: {\n transaction?: FirestoreTransactionLike;\n } = {},\n): OrmDriver<TSchema, FirestoreDriverHandle<TSchema>> {\n function getSupportedManifest(schema: TSchema) {\n const manifest = getManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n if (model.schema) {\n throw new Error(\n `The Firestore runtime does not support schema-qualified tables for model \"${model.name}\". Use flat collection names instead.`,\n );\n }\n\n const idField = model.fields.id;\n if (\n idField?.kind === \"id\" &&\n idField.idType === \"integer\" &&\n idField.generated === \"increment\"\n ) {\n throw new Error(\n `The Firestore runtime does not support generated integer ids for model \"${model.name}\". Use manual numeric ids or a string id instead.`,\n );\n }\n }\n\n return manifest;\n }\n\n function getCollection(schema: TSchema, modelName: ModelName<TSchema>) {\n const manifest = getSupportedManifest(schema);\n return (\n config.collections?.[modelName] ?? config.db.collection(manifest.models[modelName].table)\n );\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n if (transform?.encode) {\n return transform.encode(value);\n }\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"enum\") {\n return String(value);\n }\n\n if (field.kind === \"boolean\") {\n return Boolean(value);\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"bigint\") {\n return typeof value === \"bigint\"\n ? value.toString()\n : BigInt(value as string | number).toString();\n }\n\n if (field.kind === \"decimal\") {\n return typeof value === \"string\" ? normalizeDecimalString(value) : String(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) return value;\n if (isTimestampLike(value)) return value;\n return new Date(value as string | number);\n }\n\n return value;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown, docId?: string) {\n const transform = fieldTransform(modelName, field.name);\n if (transform?.decode) {\n return transform.decode(value);\n }\n\n if (value === undefined && field.kind === \"id\" && docId !== undefined) {\n if (field.idType === \"integer\") {\n const numeric = Number(docId);\n return Number.isFinite(numeric) ? numeric : undefined;\n }\n return docId;\n }\n\n if (value === undefined || value === null) return value ?? null;\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"enum\") {\n return String(value);\n }\n\n if (field.kind === \"boolean\") {\n return Boolean(value);\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"bigint\") {\n return typeof value === \"bigint\" ? value : BigInt(value as string | number);\n }\n\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(String(value));\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) return value;\n if (isTimestampLike(value)) return value.toDate();\n return new Date(value as string | number);\n }\n\n return value;\n }\n\n function buildStoredRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const stored: FirestoreRow = {};\n const decoded: FirestoreRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value === undefined) continue;\n const encoded = encodeValue(model.name, field, value);\n stored[field.column] = encoded;\n decoded[field.name] = decodeValue(model.name, field, encoded);\n }\n\n const idField = model.fields.id;\n if (!idField) {\n return {\n docId: randomUUID(),\n stored,\n decoded,\n };\n }\n\n let idValue = decoded[idField.name];\n if (idValue === undefined || idValue === null) {\n idValue = randomUUID();\n const encodedId = encodeValue(model.name, idField, idValue);\n stored[idField.column] = encodedId;\n decoded[idField.name] = decodeValue(model.name, idField, encodedId);\n idValue = decoded[idField.name];\n }\n\n return {\n docId: String(idValue),\n stored,\n decoded,\n };\n }\n\n function buildUpdatedRow(\n model: ManifestModel,\n current: LoadedRow,\n data: Partial<Record<string, unknown>>,\n ) {\n const stored = {\n ...current.stored,\n };\n const decoded = {\n ...current.data,\n };\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n const encoded = encodeValue(model.name, field, value);\n stored[field.column] = encoded;\n decoded[field.name] = decodeValue(model.name, field, encoded);\n }\n\n const idField = model.fields.id;\n const docId =\n idField && decoded[idField.name] !== undefined && decoded[idField.name] !== null\n ? String(decoded[idField.name])\n : current.docId;\n\n return {\n docId,\n stored,\n decoded,\n };\n }\n\n async function getQuerySnapshot(\n query: FirestoreCollectionLike | FirestoreQueryLike,\n ): Promise<FirestoreQuerySnapshotLike> {\n if (state.transaction) {\n const result = await state.transaction.get(query);\n if (\"docs\" in result) {\n return result;\n }\n return {\n docs: result.exists ? [result] : [],\n };\n }\n\n return query.get();\n }\n\n async function getDocumentSnapshot(reference: FirestoreDocumentReferenceLike) {\n if (state.transaction) {\n const result = await state.transaction.get(reference);\n if (\"exists\" in result) {\n return result;\n }\n return (\n result.docs[0] ?? {\n id: reference.id,\n exists: false,\n data: () => undefined,\n ref: reference,\n }\n );\n }\n\n return reference.get();\n }\n\n async function loadRows<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n ) {\n const model = getSupportedManifest(schema).models[modelName];\n const collection = getCollection(schema, modelName);\n const snapshot = await getQuerySnapshot(collection);\n\n return snapshot.docs\n .filter((doc) => doc.exists)\n .map((doc) => {\n const stored = doc.data() ?? {};\n const decoded: FirestoreRow = {};\n\n for (const field of Object.values(model.fields)) {\n decoded[field.name] = decodeValue(model.name, field, stored[field.column], doc.id);\n }\n\n return {\n docId: doc.id,\n ref: doc.ref ?? collection.doc(doc.id),\n data: decoded,\n stored,\n } satisfies LoadedRow;\n });\n }\n\n async function loadUniqueRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n where: Record<string, unknown>,\n ) {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const lookup = requireUniqueLookup(model, where, \"FindUnique\");\n\n if (lookup.kind === \"id\") {\n const reference = getCollection(schema, modelName).doc(\n String(lookup.values[lookup.fields[0]!.name]),\n );\n const doc = await getDocumentSnapshot(reference);\n if (!doc.exists) return null;\n const stored = doc.data() ?? {};\n const decoded: FirestoreRow = {};\n\n for (const field of Object.values(model.fields)) {\n decoded[field.name] = decodeValue(model.name, field, stored[field.column], doc.id);\n }\n\n return {\n docId: doc.id,\n ref: doc.ref ?? reference,\n data: decoded,\n stored,\n } satisfies LoadedRow;\n }\n\n const rows = await loadRows(schema, modelName);\n return rows.find((row) => matchesModelWhere(model, row.data, where as FirestoreWhere)) ?? null;\n }\n\n function findUniqueConflict(\n model: ManifestModel,\n candidate: FirestoreRow,\n existingRows: LoadedRow[],\n ignoreDocIds: Set<string> = new Set(),\n ) {\n const idField = model.fields.id;\n\n for (const row of existingRows) {\n if (ignoreDocIds.has(row.docId)) continue;\n\n if (\n idField &&\n candidate[idField.name] !== undefined &&\n candidate[idField.name] !== null &&\n row.data[idField.name] !== undefined &&\n row.data[idField.name] !== null &&\n equalValues(candidate[idField.name], row.data[idField.name])\n ) {\n return [idField.name];\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.unique) continue;\n if (candidate[field.name] === undefined || candidate[field.name] === null) continue;\n if (row.data[field.name] === undefined || row.data[field.name] === null) continue;\n if (equalValues(candidate[field.name], row.data[field.name])) {\n return [field.name];\n }\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n !constraint.fields.every(\n (fieldName) =>\n candidate[fieldName] !== undefined &&\n candidate[fieldName] !== null &&\n row.data[fieldName] !== undefined &&\n row.data[fieldName] !== null,\n )\n ) {\n continue;\n }\n\n if (\n constraint.fields.every((fieldName) =>\n equalValues(candidate[fieldName], row.data[fieldName]),\n )\n ) {\n return [...constraint.fields];\n }\n }\n }\n\n return null;\n }\n\n async function writeDocument(\n schema: TSchema,\n modelName: ModelName<TSchema>,\n next: { docId: string; stored: FirestoreRow },\n previousDocId?: string,\n ) {\n const collection = getCollection(schema, modelName);\n const reference = collection.doc(next.docId);\n\n if (state.transaction) {\n state.transaction.set(reference, next.stored);\n if (previousDocId && previousDocId !== next.docId) {\n state.transaction.delete(collection.doc(previousDocId));\n }\n return;\n }\n\n await reference.set(next.stored);\n if (previousDocId && previousDocId !== next.docId) {\n await collection.doc(previousDocId).delete();\n }\n }\n\n async function deleteDocument(schema: TSchema, modelName: ModelName<TSchema>, docId: string) {\n const reference = getCollection(schema, modelName).doc(docId);\n\n if (state.transaction) {\n state.transaction.delete(reference);\n return;\n }\n\n await reference.delete();\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: FirestoreRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[modelName];\n const output: FirestoreRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.fields)) {\n output[fieldName] = row[fieldName];\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: FirestoreRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data.id, foreignValue),\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(\n schema,\n relation.target as ModelName<TSchema>,\n target.data,\n relationArgs.select,\n )\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.foreignKey], row.id),\n );\n const target = applyQuery(targetRows, relationArgs)[0];\n return target\n ? projectRow(\n schema,\n relation.target as ModelName<TSchema>,\n target.data,\n relationArgs.select,\n )\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.foreignKey], row.id),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item.data, relationArgs.select),\n ),\n );\n }\n\n const throughRows = (await loadRows(schema, relation.through as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.from], row.id),\n );\n const targetIds = throughRows.map((item) => item.data[relation.to]);\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => targetIds.some((targetId) => equalValues(targetId, item.data.id)),\n );\n const matchedRows = applyQuery(targetRows, relationArgs);\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item.data, relationArgs.select),\n ),\n );\n }\n\n function normalizeFilterValue(model: ManifestModel, fieldName: string, value: unknown) {\n const field = model.fields[fieldName];\n if (!field || value === undefined || value === null) {\n return value;\n }\n\n return decodeValue(model.name, field, encodeValue(model.name, field, value));\n }\n\n function evaluateModelFilter(\n model: ManifestModel,\n fieldName: string,\n value: unknown,\n filter: unknown,\n ) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, normalizeFilterValue(model, fieldName, filter));\n }\n\n const normalized = {\n ...(filter.eq !== undefined ? { eq: normalizeFilterValue(model, fieldName, filter.eq) } : {}),\n ...(filter.not !== undefined\n ? { not: normalizeFilterValue(model, fieldName, filter.not) }\n : {}),\n ...(filter.in !== undefined\n ? {\n in: (Array.isArray(filter.in) ? filter.in : []).map((entry) =>\n normalizeFilterValue(model, fieldName, entry),\n ),\n }\n : {}),\n ...(filter.contains !== undefined ? { contains: String(filter.contains) } : {}),\n ...(filter.gt !== undefined ? { gt: normalizeFilterValue(model, fieldName, filter.gt) } : {}),\n ...(filter.gte !== undefined\n ? { gte: normalizeFilterValue(model, fieldName, filter.gte) }\n : {}),\n ...(filter.lt !== undefined ? { lt: normalizeFilterValue(model, fieldName, filter.lt) } : {}),\n ...(filter.lte !== undefined\n ? { lte: normalizeFilterValue(model, fieldName, filter.lte) }\n : {}),\n };\n\n return evaluateFilter(value, normalized);\n }\n\n function matchesModelWhere(\n model: ManifestModel,\n record: FirestoreRow,\n where?: FirestoreWhere,\n ): boolean {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause) => matchesModelWhere(model, record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause) => matchesModelWhere(model, record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesModelWhere(model, record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateModelFilter(model, key, record[key], filter)) return false;\n }\n\n return true;\n }\n\n function applyModelQuery(\n model: ManifestModel,\n rows: LoadedRow[],\n args: {\n where?: FirestoreWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n skip?: number;\n take?: number;\n } = {},\n ) {\n const filtered = rows.filter((row) => matchesModelWhere(model, row.data, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n }\n\n async function runWrite<TResult>(run: () => Promise<TResult>) {\n if (state.transaction || !hasTransactionSupport(config.db)) {\n return run();\n }\n\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return run.call({\n driver: txDriver,\n });\n });\n }\n\n let driver!: OrmDriver<TSchema, FirestoreDriverHandle<TSchema>>;\n\n driver = {\n handle: createDriverHandle({\n kind: \"firestore\",\n client: {\n db: config.db,\n collections: config.collections,\n },\n capabilities: {\n supportsNumericIds: true,\n numericIds: \"manual\",\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: hasTransactionSupport(config.db),\n supportsSchemaNamespaces: false,\n supportsTransactionalDDL: false,\n supportsJoin: false,\n nativeRelationLoading: \"none\",\n textComparison: \"case-sensitive\",\n textMatching: {\n equality: \"case-sensitive\",\n contains: \"case-sensitive\",\n ordering: \"case-sensitive\",\n },\n upsert: \"native\",\n returning: {\n create: true,\n update: true,\n delete: false,\n },\n returningMode: {\n create: \"record\",\n update: \"record\",\n delete: \"none\",\n },\n nativeRelations: {\n singularChains: false,\n hasMany: false,\n manyToMany: false,\n filtered: false,\n ordered: false,\n paginated: false,\n },\n },\n }),\n async findMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = applyModelQuery(model, await loadRows(schema, modelName), args);\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row.data, args.select)));\n },\n async findFirst(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = applyModelQuery(model, await loadRows(schema, modelName), args)[0];\n if (!row) return null;\n return projectRow(schema, modelName, row.data, args.select);\n },\n async findUnique(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = await loadUniqueRow(schema, modelName, args.where as Record<string, unknown>);\n if (!row || !matchesModelWhere(model, row.data, args.where as FirestoreWhere)) {\n return null;\n }\n\n return projectRow(schema, modelName, row.data, args.select);\n },\n async count(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n return applyModelQuery(model, await loadRows(schema, modelName), args).length;\n },\n async create(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.create(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const existingRows = await loadRows(schema, modelName);\n const built = buildStoredRow(model, args.data as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, built.decoded, existingRows);\n\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n await writeDocument(schema, modelName, built);\n return projectRow(schema, modelName, built.decoded, args.select);\n },\n async createMany(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.createMany(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const existingRows = await loadRows(schema, modelName);\n const created: Array<{ docId: string; stored: FirestoreRow; decoded: FirestoreRow }> = [];\n\n for (const entry of args.data) {\n const built = buildStoredRow(model, entry as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, built.decoded, [\n ...existingRows,\n ...created.map((row) => ({\n docId: row.docId,\n ref: getCollection(schema, modelName).doc(row.docId),\n data: row.decoded,\n stored: row.stored,\n })),\n ]);\n\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n created.push(built);\n }\n\n for (const row of created) {\n await writeDocument(schema, modelName, row);\n }\n\n return Promise.all(\n created.map((row) => projectRow(schema, modelName, row.decoded, args.select)),\n );\n },\n async update(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.update(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const rows = await loadRows(schema, modelName);\n const current = applyModelQuery(model, rows, {\n where: args.where as FirestoreWhere,\n take: 1,\n })[0];\n if (!current) return null;\n\n const next = buildUpdatedRow(model, current, args.data as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, next.decoded, rows, new Set([current.docId]));\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n await writeDocument(schema, modelName, next, current.docId);\n return projectRow(schema, modelName, next.decoded, args.select);\n },\n async updateMany(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.updateMany(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const rows = await loadRows(schema, modelName);\n const matched = applyModelQuery(model, rows, {\n where: args.where as FirestoreWhere,\n });\n if (!matched.length) return 0;\n\n const nextRows = matched.map((row) =>\n buildUpdatedRow(model, row, args.data as Partial<Record<string, unknown>>),\n );\n const keepIds = new Set(matched.map((row) => row.docId));\n const remaining = rows.filter((row) => !keepIds.has(row.docId));\n const pending: LoadedRow[] = [];\n\n for (const next of nextRows) {\n const conflict = findUniqueConflict(model, next.decoded, [...remaining, ...pending]);\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n pending.push({\n docId: next.docId,\n ref: getCollection(schema, modelName).doc(next.docId),\n data: next.decoded,\n stored: next.stored,\n });\n }\n\n for (let index = 0; index < matched.length; index += 1) {\n await writeDocument(schema, modelName, nextRows[index]!, matched[index]!.docId);\n }\n\n return nextRows.length;\n },\n async upsert(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.upsert(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const lookup = requireUniqueLookup(model, args.where as Record<string, unknown>, \"Upsert\");\n validateUniqueLookupUpdateData(\n model,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n\n const current = await loadUniqueRow(schema, modelName, args.where as Record<string, unknown>);\n if (current && matchesModelWhere(model, current.data, args.where as FirestoreWhere)) {\n const rows = await loadRows(schema, modelName);\n const next = buildUpdatedRow(\n model,\n current,\n args.update as Partial<Record<string, unknown>>,\n );\n const conflict = findUniqueConflict(model, next.decoded, rows, new Set([current.docId]));\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n await writeDocument(schema, modelName, next, current.docId);\n return projectRow(schema, modelName, next.decoded, args.select);\n }\n\n const created = buildStoredRow(\n model,\n mergeUniqueLookupCreateData(\n model,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const rows = await loadRows(schema, modelName);\n const conflict = findUniqueConflict(model, created.decoded, rows);\n if (conflict) {\n throw firestoreConstraintError(conflict);\n }\n\n await writeDocument(schema, modelName, created);\n return projectRow(schema, modelName, created.decoded, args.select);\n },\n async delete(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.delete(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const row = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as FirestoreWhere,\n take: 1,\n })[0];\n if (!row) return 0;\n\n await deleteDocument(schema, modelName, row.docId);\n return 1;\n },\n async deleteMany(schema, modelName, args) {\n if (!state.transaction && hasTransactionSupport(config.db)) {\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return txDriver.deleteMany(schema, modelName, args);\n });\n }\n\n const model = getSupportedManifest(schema).models[modelName];\n const rows = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as FirestoreWhere,\n });\n\n for (const row of rows) {\n await deleteDocument(schema, modelName, row.docId);\n }\n\n return rows.length;\n },\n async transaction(schema, run) {\n getSupportedManifest(schema);\n\n if (state.transaction || !hasTransactionSupport(config.db)) {\n return run(driver);\n }\n\n return config.db.runTransaction!(async (transaction) => {\n const txDriver = createFirestoreDriverInternal(config, {\n transaction,\n });\n return run(txDriver);\n });\n },\n };\n\n return driver;\n}\n\nexport function createFirestoreDriver<TSchema extends SchemaDefinition<any>>(\n config: FirestoreDriverConfig<TSchema>,\n): OrmDriver<TSchema, FirestoreDriverHandle<TSchema>> {\n return createFirestoreDriverInternal(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,iBA4BO;AAwFP,IAAM,gBAAgB,oBAAI,QAAgC;AAE1D,SAAS,YAAY,QAA+B;AAClD,QAAM,SAAS,cAAc,IAAI,MAAM;AACvC,MAAI,OAAQ,QAAO;AACnB,QAAM,WAAO,2BAAe,MAAM;AAClC,gBAAc,IAAI,QAAQ,IAAI;AAC9B,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAe;AAC7C,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,QAAQ,wBAAwB,KAAK,OAAO;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,aAAa,cAAc,IAAI;AACxC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,eAAe,QAAQ,QAAQ,EAAE;AAC5D,SAAO,mBAAmB,SAAS,GAAG,WAAW,IAAI,kBAAkB,KAAK;AAC9E;AAEA,SAAS,gBAAgB,OAA6C;AACpE,SACE,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,YAAY,SAAS,OAAO,MAAM,WAAW;AAEzF;AAEA,SAAS,aAAa,OAAgB,OAAsB;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,cAAc,KAAM,YAAO,+BAAW;AAChD,MAAI,MAAM,cAAc,MAAO,QAAO,oBAAI,KAAK;AAC/C,MAAI,OAAO,MAAM,iBAAiB,YAAY;AAC5C,WAAQ,MAAM,aAA+B;AAAA,EAC/C;AACA,SAAO,MAAM;AACf;AAEA,SAAS,aAAa,OAAgB;AACpC,SACE,iBAAiB,QACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU;AAErB;AAEA,SAAS,eAAe,OAAgB,QAAiB;AACvD,MAAI,KAAC,mCAAuB,MAAM,GAAG;AACnC,eAAO,wBAAY,OAAO,MAAM;AAAA,EAClC;AAEA,MAAI,QAAQ,UAAU,KAAC,wBAAY,OAAO,OAAO,EAAE,EAAG,QAAO;AAC7D,MAAI,SAAS,cAAU,wBAAY,OAAO,OAAO,GAAG,EAAG,QAAO;AAC9D,MAAI,QAAQ,QAAQ;AAClB,UAAM,SAAS,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC;AACvD,QAAI,CAAC,OAAO,KAAK,CAAC,kBAAc,wBAAY,WAAW,KAAK,CAAC,EAAG,QAAO;AAAA,EACzE;AACA,MAAI,cAAc,QAAQ;AACxB,QAAI,OAAO,UAAU,YAAY,OAAO,OAAO,aAAa,SAAU,QAAO;AAC7E,QAAI,CAAC,MAAM,SAAS,OAAO,QAAQ,EAAG,QAAO;AAAA,EAC/C;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,SAAS,OAAO,GAAK,QAAO;AAAA,EAC1D;AACA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,aAAa,KAAK,KAAK,QAAQ,OAAO,IAAM,QAAO;AAAA,EAC1D;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,SAAS,OAAO,GAAK,QAAO;AAAA,EAC1D;AACA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,aAAa,KAAK,KAAK,QAAQ,OAAO,IAAM,QAAO;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,aACP,QACA,OACA;AACA,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,MAAM,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,aAAa,QAAQ,MAAM,CAAC,GAAG;AAC3E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,aAAa,QAAQ,MAAM,CAAC,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,OAAO,aAAa,QAAQ,MAAM,GAAG,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,QAAI,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,MAAO;AACpD,QAAI,CAAC,eAAe,OAAO,GAAG,GAAG,MAAM,EAAG,QAAO;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,MAAmB,SAAmD;AACtF,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,OAAO,QAAQ,OAAO;AACtC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,MAAM,UAAU;AACrC,eAAW,CAAC,OAAO,SAAS,KAAK,SAAS;AACxC,YAAM,IAAI,KAAK,KAAK,KAAK;AACzB,YAAM,IAAI,MAAM,KAAK,KAAK;AAC1B,cAAI,wBAAY,GAAG,CAAC,EAAG;AACvB,UAAI,MAAM,OAAW,QAAO,cAAc,QAAQ,KAAK;AACvD,UAAI,MAAM,OAAW,QAAO,cAAc,QAAQ,IAAI;AACtD,UAAI,KAAK,KAAM,QAAO,cAAc,QAAQ,KAAK;AACjD,UAAI,KAAK,KAAM,QAAO,cAAc,QAAQ,IAAI;AAChD,UAAI,IAAI,EAAG,QAAO,cAAc,QAAQ,KAAK;AAC7C,UAAI,IAAI,EAAG,QAAO,cAAc,QAAQ,IAAI;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,SAAS,MAAmB,MAAe,MAAe;AACjE,QAAM,QAAQ,QAAQ;AACtB,QAAM,MAAM,SAAS,SAAY,SAAY,QAAQ;AACrD,SAAO,KAAK,MAAM,OAAO,GAAG;AAC9B;AAEA,SAAS,WACP,MACA,OAKI,CAAC,GACL;AACA,QAAM,WAAW,KAAK,OAAO,CAAC,QAAQ,aAAa,IAAI,MAAM,KAAK,KAAK,CAAC;AACxE,QAAM,SAAS,SAAS,UAAU,KAAK,OAAO;AAC9C,SAAO,SAAS,QAAQ,KAAK,MAAM,KAAK,IAAI;AAC9C;AAEA,SAAS,yBAAyB,QAA2B;AAC3D,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI;AAC3D,QAAM,QAAQ,IAAI,MAAM,4CAA4C,MAAM,GAAG;AAC7E,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMA,SAAS,sBAAsB,IAAqB;AAClD,SAAO,OAAO,GAAG,mBAAmB;AACtC;AAEA,SAAS,8BACP,QACA,QAEI,CAAC,GAC+C;AACpD,WAAS,qBAAqB,QAAiB;AAC7C,UAAM,WAAW,YAAY,MAAM;AAEnC,eAAW,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;AAClD,UAAI,MAAM,QAAQ;AAChB,cAAM,IAAI;AAAA,UACR,6EAA6E,MAAM,IAAI;AAAA,QACzF;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,OAAO;AAC7B,UACE,SAAS,SAAS,QAClB,QAAQ,WAAW,aACnB,QAAQ,cAAc,aACtB;AACA,cAAM,IAAI;AAAA,UACR,2EAA2E,MAAM,IAAI;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,QAAiB,WAA+B;AACrE,UAAM,WAAW,qBAAqB,MAAM;AAC5C,WACE,OAAO,cAAc,SAAS,KAAK,OAAO,GAAG,WAAW,SAAS,OAAO,SAAS,EAAE,KAAK;AAAA,EAE5F;AAEA,WAAS,eAAe,WAAmB,WAAmB;AAC5D,WAAO,OAAO,aAAa,SAAS,IAAI,SAAS;AAAA,EACnD;AAEA,WAAS,YAAY,WAAmB,OAAsB,OAAgB;AAC5E,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI,UAAU,KAAM,QAAO;AAE3B,UAAM,YAAY,eAAe,WAAW,MAAM,IAAI;AACtD,QAAI,WAAW,QAAQ;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,MAAM,SAAS,QAAQ,MAAM,WAAW,WAAW;AACrD,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO,OAAO,UAAU,WACpB,MAAM,SAAS,IACf,OAAO,KAAwB,EAAE,SAAS;AAAA,IAChD;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,UAAU,WAAW,uBAAuB,KAAK,IAAI,OAAO,KAAK;AAAA,IACjF;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,iBAAiB,KAAM,QAAO;AAClC,UAAI,gBAAgB,KAAK,EAAG,QAAO;AACnC,aAAO,IAAI,KAAK,KAAwB;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,YAAY,WAAmB,OAAsB,OAAgB,OAAgB;AAC5F,UAAM,YAAY,eAAe,WAAW,MAAM,IAAI;AACtD,QAAI,WAAW,QAAQ;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,UAAU,UAAa,MAAM,SAAS,QAAQ,UAAU,QAAW;AACrE,UAAI,MAAM,WAAW,WAAW;AAC9B,cAAM,UAAU,OAAO,KAAK;AAC5B,eAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,MAC9C;AACA,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO,SAAS;AAE3D,QAAI,MAAM,SAAS,QAAQ,MAAM,WAAW,WAAW;AACrD,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAwB;AAAA,IAC5E;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,uBAAuB,OAAO,KAAK,CAAC;AAAA,IAC7C;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,iBAAiB,KAAM,QAAO;AAClC,UAAI,gBAAgB,KAAK,EAAG,QAAO,MAAM,OAAO;AAChD,aAAO,IAAI,KAAK,KAAwB;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,OAAsB,MAAwC;AACpF,UAAM,SAAuB,CAAC;AAC9B,UAAM,UAAwB,CAAC;AAE/B,eAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,YAAM,QAAQ,aAAa,KAAK,MAAM,IAAI,GAAG,KAAK;AAClD,UAAI,UAAU,OAAW;AACzB,YAAM,UAAU,YAAY,MAAM,MAAM,OAAO,KAAK;AACpD,aAAO,MAAM,MAAM,IAAI;AACvB,cAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9D;AAEA,UAAM,UAAU,MAAM,OAAO;AAC7B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,WAAO,+BAAW;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,QAAQ,IAAI;AAClC,QAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,oBAAU,+BAAW;AACrB,YAAM,YAAY,YAAY,MAAM,MAAM,SAAS,OAAO;AAC1D,aAAO,QAAQ,MAAM,IAAI;AACzB,cAAQ,QAAQ,IAAI,IAAI,YAAY,MAAM,MAAM,SAAS,SAAS;AAClE,gBAAU,QAAQ,QAAQ,IAAI;AAAA,IAChC;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,gBACP,OACA,SACA,MACA;AACA,UAAM,SAAS;AAAA,MACb,GAAG,QAAQ;AAAA,IACb;AACA,UAAM,UAAU;AAAA,MACd,GAAG,QAAQ;AAAA,IACb;AAEA,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AACrD,UAAI,UAAU,OAAW;AACzB,YAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,MAC1E;AACA,YAAM,UAAU,YAAY,MAAM,MAAM,OAAO,KAAK;AACpD,aAAO,MAAM,MAAM,IAAI;AACvB,cAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9D;AAEA,UAAM,UAAU,MAAM,OAAO;AAC7B,UAAM,QACJ,WAAW,QAAQ,QAAQ,IAAI,MAAM,UAAa,QAAQ,QAAQ,IAAI,MAAM,OACxE,OAAO,QAAQ,QAAQ,IAAI,CAAC,IAC5B,QAAQ;AAEd,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,iBACb,OACqC;AACrC,QAAI,MAAM,aAAa;AACrB,YAAM,SAAS,MAAM,MAAM,YAAY,IAAI,KAAK;AAChD,UAAI,UAAU,QAAQ;AACpB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,MAAM,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,iBAAe,oBAAoB,WAA2C;AAC5E,QAAI,MAAM,aAAa;AACrB,YAAM,SAAS,MAAM,MAAM,YAAY,IAAI,SAAS;AACpD,UAAI,YAAY,QAAQ;AACtB,eAAO;AAAA,MACT;AACA,aACE,OAAO,KAAK,CAAC,KAAK;AAAA,QAChB,IAAI,UAAU;AAAA,QACd,QAAQ;AAAA,QACR,MAAM,MAAM;AAAA,QACZ,KAAK;AAAA,MACP;AAAA,IAEJ;AAEA,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,iBAAe,SACb,QACA,WACA;AACA,UAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAM,aAAa,cAAc,QAAQ,SAAS;AAClD,UAAM,WAAW,MAAM,iBAAiB,UAAU;AAElD,WAAO,SAAS,KACb,OAAO,CAAC,QAAQ,IAAI,MAAM,EAC1B,IAAI,CAAC,QAAQ;AACZ,YAAM,SAAS,IAAI,KAAK,KAAK,CAAC;AAC9B,YAAM,UAAwB,CAAC;AAE/B,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,gBAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,GAAG,IAAI,EAAE;AAAA,MACnF;AAEA,aAAO;AAAA,QACL,OAAO,IAAI;AAAA,QACX,KAAK,IAAI,OAAO,WAAW,IAAI,IAAI,EAAE;AAAA,QACrC,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,iBAAe,cACb,QACA,WACA,OACA;AACA,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,aAAS,gCAAoB,OAAO,OAAO,YAAY;AAE7D,QAAI,OAAO,SAAS,MAAM;AACxB,YAAM,YAAY,cAAc,QAAQ,SAAS,EAAE;AAAA,QACjD,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC,EAAG,IAAI,CAAC;AAAA,MAC9C;AACA,YAAM,MAAM,MAAM,oBAAoB,SAAS;AAC/C,UAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,YAAM,SAAS,IAAI,KAAK,KAAK,CAAC;AAC9B,YAAM,UAAwB,CAAC;AAE/B,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,gBAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,GAAG,IAAI,EAAE;AAAA,MACnF;AAEA,aAAO;AAAA,QACL,OAAO,IAAI;AAAA,QACX,KAAK,IAAI,OAAO;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,WAAO,KAAK,KAAK,CAAC,QAAQ,kBAAkB,OAAO,IAAI,MAAM,KAAuB,CAAC,KAAK;AAAA,EAC5F;AAEA,WAAS,mBACP,OACA,WACA,cACA,eAA4B,oBAAI,IAAI,GACpC;AACA,UAAM,UAAU,MAAM,OAAO;AAE7B,eAAW,OAAO,cAAc;AAC9B,UAAI,aAAa,IAAI,IAAI,KAAK,EAAG;AAEjC,UACE,WACA,UAAU,QAAQ,IAAI,MAAM,UAC5B,UAAU,QAAQ,IAAI,MAAM,QAC5B,IAAI,KAAK,QAAQ,IAAI,MAAM,UAC3B,IAAI,KAAK,QAAQ,IAAI,MAAM,YAC3B,wBAAY,UAAU,QAAQ,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,CAAC,GAC3D;AACA,eAAO,CAAC,QAAQ,IAAI;AAAA,MACtB;AAEA,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,YAAI,CAAC,MAAM,OAAQ;AACnB,YAAI,UAAU,MAAM,IAAI,MAAM,UAAa,UAAU,MAAM,IAAI,MAAM,KAAM;AAC3E,YAAI,IAAI,KAAK,MAAM,IAAI,MAAM,UAAa,IAAI,KAAK,MAAM,IAAI,MAAM,KAAM;AACzE,gBAAI,wBAAY,UAAU,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG;AAC5D,iBAAO,CAAC,MAAM,IAAI;AAAA,QACpB;AAAA,MACF;AAEA,iBAAW,cAAc,MAAM,YAAY,QAAQ;AACjD,YACE,CAAC,WAAW,OAAO;AAAA,UACjB,CAAC,cACC,UAAU,SAAS,MAAM,UACzB,UAAU,SAAS,MAAM,QACzB,IAAI,KAAK,SAAS,MAAM,UACxB,IAAI,KAAK,SAAS,MAAM;AAAA,QAC5B,GACA;AACA;AAAA,QACF;AAEA,YACE,WAAW,OAAO;AAAA,UAAM,CAAC,kBACvB,wBAAY,UAAU,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC;AAAA,QACvD,GACA;AACA,iBAAO,CAAC,GAAG,WAAW,MAAM;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,cACb,QACA,WACA,MACA,eACA;AACA,UAAM,aAAa,cAAc,QAAQ,SAAS;AAClD,UAAM,YAAY,WAAW,IAAI,KAAK,KAAK;AAE3C,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,IAAI,WAAW,KAAK,MAAM;AAC5C,UAAI,iBAAiB,kBAAkB,KAAK,OAAO;AACjD,cAAM,YAAY,OAAO,WAAW,IAAI,aAAa,CAAC;AAAA,MACxD;AACA;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,KAAK,MAAM;AAC/B,QAAI,iBAAiB,kBAAkB,KAAK,OAAO;AACjD,YAAM,WAAW,IAAI,aAAa,EAAE,OAAO;AAAA,IAC7C;AAAA,EACF;AAEA,iBAAe,eAAe,QAAiB,WAA+B,OAAe;AAC3F,UAAM,YAAY,cAAc,QAAQ,SAAS,EAAE,IAAI,KAAK;AAE5D,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,OAAO,SAAS;AAClC;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAAA,EACzB;AAEA,iBAAe,WAIb,QACA,WACA,KACA,QACuD;AACvD,UAAM,kBAAkB,OAAO,OAAO,SAAS;AAC/C,UAAM,SAAuB,CAAC;AAE9B,QAAI,CAAC,QAAQ;AACX,iBAAW,aAAa,OAAO,KAAK,gBAAgB,MAAM,GAAG;AAC3D,eAAO,SAAS,IAAI,IAAI,SAAS;AAAA,MACnC;AAEA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,QAAQ,UAAU,OAAW;AAE3C,UAAI,OAAO,gBAAgB,UAAU,UAAU,MAAM;AACnD,eAAO,GAAG,IAAI,IAAI,GAAG;AACrB;AAAA,MACF;AAEA,UAAI,OAAO,gBAAgB,WAAW;AACpC,eAAO,GAAG,IAAI,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,gBAIb,QACA,WACA,cACA,KACA,OACA;AACA,UAAM,WAAW,OAAO,OAAO,SAAS,EAAE,UAAU,YAAY;AAChE,UAAM,eAAe,UAAU,OAAO,CAAC,IAAI;AAE3C,QAAI,SAAS,SAAS,aAAa;AACjC,YAAM,eAAe,IAAI,SAAS,UAAU;AAC5C,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,IAAI,YAAY;AAAA,MAClD;AACA,YAAM,SAAS,WAAWA,aAAY,YAAY,EAAE,CAAC;AACrD,aAAO,SACH;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf,IACA;AAAA,IACN;AAEA,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE;AAAA,MAC9D;AACA,YAAM,SAAS,WAAWA,aAAY,YAAY,EAAE,CAAC;AACrD,aAAO,SACH;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf,IACA;AAAA,IACN;AAEA,QAAI,SAAS,SAAS,WAAW;AAC/B,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE;AAAA,MAC9D;AACA,YAAMC,eAAc,WAAWD,aAAY,YAAY;AACvD,aAAO,QAAQ;AAAA,QACbC,aAAY;AAAA,UAAI,CAAC,SACf,WAAW,QAAQ,SAAS,QAA8B,KAAK,MAAM,aAAa,MAAM;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,SAAS,QAAQ,SAAS,OAA6B,GAAG;AAAA,MACnF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE;AAAA,IACxD;AACA,UAAM,YAAY,YAAY,IAAI,CAAC,SAAS,KAAK,KAAK,SAAS,EAAE,CAAC;AAClE,UAAM,cAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,MACjF,CAAC,SAAS,UAAU,KAAK,CAAC,iBAAa,wBAAY,UAAU,KAAK,KAAK,EAAE,CAAC;AAAA,IAC5E;AACA,UAAM,cAAc,WAAW,YAAY,YAAY;AAEvD,WAAO,QAAQ;AAAA,MACb,YAAY;AAAA,QAAI,CAAC,SACf,WAAW,QAAQ,SAAS,QAA8B,KAAK,MAAM,aAAa,MAAM;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,WAAS,qBAAqB,OAAsB,WAAmB,OAAgB;AACrF,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,QAAI,CAAC,SAAS,UAAU,UAAa,UAAU,MAAM;AACnD,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,EAC7E;AAEA,WAAS,oBACP,OACA,WACA,OACA,QACA;AACA,QAAI,KAAC,mCAAuB,MAAM,GAAG;AACnC,iBAAO,wBAAY,OAAO,qBAAqB,OAAO,WAAW,MAAM,CAAC;AAAA,IAC1E;AAEA,UAAM,aAAa;AAAA,MACjB,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,MACL,GAAI,OAAO,OAAO,SACd;AAAA,QACE,KAAK,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC,GAAG;AAAA,UAAI,CAAC,UACnD,qBAAqB,OAAO,WAAW,KAAK;AAAA,QAC9C;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC;AAAA,MAC7E,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,MACL,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,IACP;AAEA,WAAO,eAAe,OAAO,UAAU;AAAA,EACzC;AAEA,WAAS,kBACP,OACA,QACA,OACS;AACT,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,MAAM,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,MAAM,CAAC,GAAG;AACvF,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,kBAAkB,OAAO,QAAQ,MAAM,CAAC,GAAG;AACpF,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,OAAO,kBAAkB,OAAO,QAAQ,MAAM,GAAG,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,MAAO;AACpD,UAAI,CAAC,oBAAoB,OAAO,KAAK,OAAO,GAAG,GAAG,MAAM,EAAG,QAAO;AAAA,IACpE;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBACP,OACA,MACA,OAKI,CAAC,GACL;AACA,UAAM,WAAW,KAAK,OAAO,CAAC,QAAQ,kBAAkB,OAAO,IAAI,MAAM,KAAK,KAAK,CAAC;AACpF,UAAM,SAAS,SAAS,UAAU,KAAK,OAAO;AAC9C,WAAO,SAAS,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,EAC9C;AAEA,iBAAe,SAAkB,KAA6B;AAC5D,QAAI,MAAM,eAAe,CAAC,sBAAsB,OAAO,EAAE,GAAG;AAC1D,aAAO,IAAI;AAAA,IACb;AAEA,WAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,YAAM,WAAW,8BAA8B,QAAQ;AAAA,QACrD;AAAA,MACF,CAAC;AACD,aAAO,IAAI,KAAK;AAAA,QACd,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI;AAEJ,WAAS;AAAA,IACP,YAAQ,+BAAmB;AAAA,MACzB,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,IAAI,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,MACtB;AAAA,MACA,cAAc;AAAA,QACZ,oBAAoB;AAAA,QACpB,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,sBAAsB,sBAAsB,OAAO,EAAE;AAAA,QACrD,0BAA0B;AAAA,QAC1B,0BAA0B;AAAA,QAC1B,cAAc;AAAA,QACd,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,eAAe;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,iBAAiB;AAAA,UACf,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,MAAM,SAAS,QAAQ,WAAW,MAAM;AACtC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI;AAC3E,aAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IAC5F;AAAA,IACA,MAAM,UAAU,QAAQ,WAAW,MAAM;AACvC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI,EAAE,CAAC;AAC7E,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM;AAAA,IAC5D;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,MAAM,cAAc,QAAQ,WAAW,KAAK,KAAgC;AACxF,UAAI,CAAC,OAAO,CAAC,kBAAkB,OAAO,IAAI,MAAM,KAAK,KAAuB,GAAG;AAC7E,eAAO;AAAA,MACT;AAEA,aAAO,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM;AAAA,IAC5D;AAAA,IACA,MAAM,MAAM,QAAQ,WAAW,MAAM;AACnC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,aAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI,EAAE;AAAA,IACzE;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,OAAO,QAAQ,WAAW,IAAI;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,eAAe,MAAM,SAAS,QAAQ,SAAS;AACrD,YAAM,QAAQ,eAAe,OAAO,KAAK,IAAwC;AACjF,YAAM,WAAW,mBAAmB,OAAO,MAAM,SAAS,YAAY;AAEtE,UAAI,UAAU;AACZ,cAAM,yBAAyB,QAAQ;AAAA,MACzC;AAEA,YAAM,cAAc,QAAQ,WAAW,KAAK;AAC5C,aAAO,WAAW,QAAQ,WAAW,MAAM,SAAS,KAAK,MAAM;AAAA,IACjE;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,WAAW,QAAQ,WAAW,IAAI;AAAA,QACpD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,eAAe,MAAM,SAAS,QAAQ,SAAS;AACrD,YAAM,UAAiF,CAAC;AAExF,iBAAW,SAAS,KAAK,MAAM;AAC7B,cAAM,QAAQ,eAAe,OAAO,KAAyC;AAC7E,cAAM,WAAW,mBAAmB,OAAO,MAAM,SAAS;AAAA,UACxD,GAAG;AAAA,UACH,GAAG,QAAQ,IAAI,CAAC,SAAS;AAAA,YACvB,OAAO,IAAI;AAAA,YACX,KAAK,cAAc,QAAQ,SAAS,EAAE,IAAI,IAAI,KAAK;AAAA,YACnD,MAAM,IAAI;AAAA,YACV,QAAQ,IAAI;AAAA,UACd,EAAE;AAAA,QACJ,CAAC;AAED,YAAI,UAAU;AACZ,gBAAM,yBAAyB,QAAQ;AAAA,QACzC;AAEA,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAEA,iBAAW,OAAO,SAAS;AACzB,cAAM,cAAc,QAAQ,WAAW,GAAG;AAAA,MAC5C;AAEA,aAAO,QAAQ;AAAA,QACb,QAAQ,IAAI,CAAC,QAAQ,WAAW,QAAQ,WAAW,IAAI,SAAS,KAAK,MAAM,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,OAAO,QAAQ,WAAW,IAAI;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,UAAU,gBAAgB,OAAO,MAAM;AAAA,QAC3C,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,MACR,CAAC,EAAE,CAAC;AACJ,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,OAAO,gBAAgB,OAAO,SAAS,KAAK,IAAwC;AAC1F,YAAM,WAAW,mBAAmB,OAAO,KAAK,SAAS,MAAM,oBAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvF,UAAI,UAAU;AACZ,cAAM,yBAAyB,QAAQ;AAAA,MACzC;AAEA,YAAM,cAAc,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC1D,aAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,KAAK,MAAM;AAAA,IAChE;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,WAAW,QAAQ,WAAW,IAAI;AAAA,QACpD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,UAAU,gBAAgB,OAAO,MAAM;AAAA,QAC3C,OAAO,KAAK;AAAA,MACd,CAAC;AACD,UAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,YAAM,WAAW,QAAQ;AAAA,QAAI,CAAC,QAC5B,gBAAgB,OAAO,KAAK,KAAK,IAAwC;AAAA,MAC3E;AACA,YAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AACvD,YAAM,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;AAC9D,YAAM,UAAuB,CAAC;AAE9B,iBAAW,QAAQ,UAAU;AAC3B,cAAM,WAAW,mBAAmB,OAAO,KAAK,SAAS,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,YAAI,UAAU;AACZ,gBAAM,yBAAyB,QAAQ;AAAA,QACzC;AAEA,gBAAQ,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,KAAK,cAAc,QAAQ,SAAS,EAAE,IAAI,KAAK,KAAK;AAAA,UACpD,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AAEA,eAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,cAAM,cAAc,QAAQ,WAAW,SAAS,KAAK,GAAI,QAAQ,KAAK,EAAG,KAAK;AAAA,MAChF;AAEA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,OAAO,QAAQ,WAAW,IAAI;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,aAAS,gCAAoB,OAAO,KAAK,OAAkC,QAAQ;AACzF;AAAA,QACE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,cAAc,QAAQ,WAAW,KAAK,KAAgC;AAC5F,UAAI,WAAW,kBAAkB,OAAO,QAAQ,MAAM,KAAK,KAAuB,GAAG;AACnF,cAAMC,QAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,cAAM,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AACA,cAAMC,YAAW,mBAAmB,OAAO,KAAK,SAASD,OAAM,oBAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvF,YAAIC,WAAU;AACZ,gBAAM,yBAAyBA,SAAQ;AAAA,QACzC;AAEA,cAAM,cAAc,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC1D,eAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,KAAK,MAAM;AAAA,MAChE;AAEA,YAAM,UAAU;AAAA,QACd;AAAA,YACA;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,WAAW,mBAAmB,OAAO,QAAQ,SAAS,IAAI;AAChE,UAAI,UAAU;AACZ,cAAM,yBAAyB,QAAQ;AAAA,MACzC;AAEA,YAAM,cAAc,QAAQ,WAAW,OAAO;AAC9C,aAAO,WAAW,QAAQ,WAAW,QAAQ,SAAS,KAAK,MAAM;AAAA,IACnE;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,OAAO,QAAQ,WAAW,IAAI;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG;AAAA,QACpE,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,MACR,CAAC,EAAE,CAAC;AACJ,UAAI,CAAC,IAAK,QAAO;AAEjB,YAAM,eAAe,QAAQ,WAAW,IAAI,KAAK;AACjD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,UAAI,CAAC,MAAM,eAAe,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,gBAAM,WAAW,8BAA8B,QAAQ;AAAA,YACrD;AAAA,UACF,CAAC;AACD,iBAAO,SAAS,WAAW,QAAQ,WAAW,IAAI;AAAA,QACpD,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG;AAAA,QACrE,OAAO,KAAK;AAAA,MACd,CAAC;AAED,iBAAW,OAAO,MAAM;AACtB,cAAM,eAAe,QAAQ,WAAW,IAAI,KAAK;AAAA,MACnD;AAEA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,YAAY,QAAQ,KAAK;AAC7B,2BAAqB,MAAM;AAE3B,UAAI,MAAM,eAAe,CAAC,sBAAsB,OAAO,EAAE,GAAG;AAC1D,eAAO,IAAI,MAAM;AAAA,MACnB;AAEA,aAAO,OAAO,GAAG,eAAgB,OAAO,gBAAgB;AACtD,cAAM,WAAW,8BAA8B,QAAQ;AAAA,UACrD;AAAA,QACF,CAAC;AACD,eAAO,IAAI,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,QACoD;AACpD,SAAO,8BAA8B,MAAM;AAC7C;","names":["targetRows","matchedRows","rows","conflict"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
|
|
2
|
+
|
|
3
|
+
type FirestoreRow = Record<string, unknown>;
|
|
4
|
+
type FirestoreDocumentSnapshotLike = {
|
|
5
|
+
id: string;
|
|
6
|
+
exists: boolean;
|
|
7
|
+
data(): FirestoreRow | undefined;
|
|
8
|
+
ref?: FirestoreDocumentReferenceLike;
|
|
9
|
+
};
|
|
10
|
+
type FirestoreQuerySnapshotLike = {
|
|
11
|
+
docs: FirestoreDocumentSnapshotLike[];
|
|
12
|
+
};
|
|
13
|
+
type FirestoreQueryLike = {
|
|
14
|
+
get(): Promise<FirestoreQuerySnapshotLike>;
|
|
15
|
+
};
|
|
16
|
+
type FirestoreDocumentReferenceLike = {
|
|
17
|
+
id: string;
|
|
18
|
+
get(): Promise<FirestoreDocumentSnapshotLike>;
|
|
19
|
+
set(data: FirestoreRow, options?: {
|
|
20
|
+
merge?: boolean;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
update(data: Partial<FirestoreRow>): Promise<unknown>;
|
|
23
|
+
delete(): Promise<unknown>;
|
|
24
|
+
};
|
|
25
|
+
type FirestoreCollectionLike = FirestoreQueryLike & {
|
|
26
|
+
doc(id?: string): FirestoreDocumentReferenceLike;
|
|
27
|
+
id?: string;
|
|
28
|
+
};
|
|
29
|
+
type FirestoreTransactionLike = {
|
|
30
|
+
get(target: FirestoreCollectionLike | FirestoreQueryLike | FirestoreDocumentReferenceLike): Promise<FirestoreQuerySnapshotLike | FirestoreDocumentSnapshotLike>;
|
|
31
|
+
set(reference: FirestoreDocumentReferenceLike, data: FirestoreRow, options?: {
|
|
32
|
+
merge?: boolean;
|
|
33
|
+
}): unknown;
|
|
34
|
+
update(reference: FirestoreDocumentReferenceLike, data: Partial<FirestoreRow>): unknown;
|
|
35
|
+
delete(reference: FirestoreDocumentReferenceLike): unknown;
|
|
36
|
+
};
|
|
37
|
+
type FirestoreDbLike = {
|
|
38
|
+
collection(name: string): FirestoreCollectionLike;
|
|
39
|
+
runTransaction?<TResult>(updateFunction: (transaction: FirestoreTransactionLike) => Promise<TResult>): Promise<TResult>;
|
|
40
|
+
getAll?(...references: unknown[]): Promise<unknown[]>;
|
|
41
|
+
batch?(): unknown;
|
|
42
|
+
};
|
|
43
|
+
type FirestoreCollectionMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, FirestoreCollectionLike>>;
|
|
44
|
+
type FirestoreFieldTransform = {
|
|
45
|
+
encode?: (value: unknown) => unknown;
|
|
46
|
+
decode?: (value: unknown) => unknown;
|
|
47
|
+
};
|
|
48
|
+
type FirestoreDriverConfig<TSchema extends SchemaDefinition<any>> = {
|
|
49
|
+
db: FirestoreDbLike;
|
|
50
|
+
collections?: FirestoreCollectionMap<TSchema>;
|
|
51
|
+
transforms?: Partial<Record<string, Partial<Record<string, FirestoreFieldTransform>>>>;
|
|
52
|
+
};
|
|
53
|
+
type FirestoreDriverClient<TSchema extends SchemaDefinition<any>> = {
|
|
54
|
+
db: FirestoreDbLike;
|
|
55
|
+
collections?: FirestoreCollectionMap<TSchema>;
|
|
56
|
+
};
|
|
57
|
+
type FirestoreDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"firestore", FirestoreDriverClient<TSchema>>;
|
|
58
|
+
declare function createFirestoreDriver<TSchema extends SchemaDefinition<any>>(config: FirestoreDriverConfig<TSchema>): OrmDriver<TSchema, FirestoreDriverHandle<TSchema>>;
|
|
59
|
+
|
|
60
|
+
export { type FirestoreCollectionLike, type FirestoreCollectionMap, type FirestoreDbLike, type FirestoreDocumentReferenceLike, type FirestoreDocumentSnapshotLike, type FirestoreDriverClient, type FirestoreDriverConfig, type FirestoreDriverHandle, type FirestoreFieldTransform, type FirestoreQueryLike, type FirestoreQuerySnapshotLike, type FirestoreTransactionLike, createFirestoreDriver };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
|
|
2
|
+
|
|
3
|
+
type FirestoreRow = Record<string, unknown>;
|
|
4
|
+
type FirestoreDocumentSnapshotLike = {
|
|
5
|
+
id: string;
|
|
6
|
+
exists: boolean;
|
|
7
|
+
data(): FirestoreRow | undefined;
|
|
8
|
+
ref?: FirestoreDocumentReferenceLike;
|
|
9
|
+
};
|
|
10
|
+
type FirestoreQuerySnapshotLike = {
|
|
11
|
+
docs: FirestoreDocumentSnapshotLike[];
|
|
12
|
+
};
|
|
13
|
+
type FirestoreQueryLike = {
|
|
14
|
+
get(): Promise<FirestoreQuerySnapshotLike>;
|
|
15
|
+
};
|
|
16
|
+
type FirestoreDocumentReferenceLike = {
|
|
17
|
+
id: string;
|
|
18
|
+
get(): Promise<FirestoreDocumentSnapshotLike>;
|
|
19
|
+
set(data: FirestoreRow, options?: {
|
|
20
|
+
merge?: boolean;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
update(data: Partial<FirestoreRow>): Promise<unknown>;
|
|
23
|
+
delete(): Promise<unknown>;
|
|
24
|
+
};
|
|
25
|
+
type FirestoreCollectionLike = FirestoreQueryLike & {
|
|
26
|
+
doc(id?: string): FirestoreDocumentReferenceLike;
|
|
27
|
+
id?: string;
|
|
28
|
+
};
|
|
29
|
+
type FirestoreTransactionLike = {
|
|
30
|
+
get(target: FirestoreCollectionLike | FirestoreQueryLike | FirestoreDocumentReferenceLike): Promise<FirestoreQuerySnapshotLike | FirestoreDocumentSnapshotLike>;
|
|
31
|
+
set(reference: FirestoreDocumentReferenceLike, data: FirestoreRow, options?: {
|
|
32
|
+
merge?: boolean;
|
|
33
|
+
}): unknown;
|
|
34
|
+
update(reference: FirestoreDocumentReferenceLike, data: Partial<FirestoreRow>): unknown;
|
|
35
|
+
delete(reference: FirestoreDocumentReferenceLike): unknown;
|
|
36
|
+
};
|
|
37
|
+
type FirestoreDbLike = {
|
|
38
|
+
collection(name: string): FirestoreCollectionLike;
|
|
39
|
+
runTransaction?<TResult>(updateFunction: (transaction: FirestoreTransactionLike) => Promise<TResult>): Promise<TResult>;
|
|
40
|
+
getAll?(...references: unknown[]): Promise<unknown[]>;
|
|
41
|
+
batch?(): unknown;
|
|
42
|
+
};
|
|
43
|
+
type FirestoreCollectionMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, FirestoreCollectionLike>>;
|
|
44
|
+
type FirestoreFieldTransform = {
|
|
45
|
+
encode?: (value: unknown) => unknown;
|
|
46
|
+
decode?: (value: unknown) => unknown;
|
|
47
|
+
};
|
|
48
|
+
type FirestoreDriverConfig<TSchema extends SchemaDefinition<any>> = {
|
|
49
|
+
db: FirestoreDbLike;
|
|
50
|
+
collections?: FirestoreCollectionMap<TSchema>;
|
|
51
|
+
transforms?: Partial<Record<string, Partial<Record<string, FirestoreFieldTransform>>>>;
|
|
52
|
+
};
|
|
53
|
+
type FirestoreDriverClient<TSchema extends SchemaDefinition<any>> = {
|
|
54
|
+
db: FirestoreDbLike;
|
|
55
|
+
collections?: FirestoreCollectionMap<TSchema>;
|
|
56
|
+
};
|
|
57
|
+
type FirestoreDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"firestore", FirestoreDriverClient<TSchema>>;
|
|
58
|
+
declare function createFirestoreDriver<TSchema extends SchemaDefinition<any>>(config: FirestoreDriverConfig<TSchema>): OrmDriver<TSchema, FirestoreDriverHandle<TSchema>>;
|
|
59
|
+
|
|
60
|
+
export { type FirestoreCollectionLike, type FirestoreCollectionMap, type FirestoreDbLike, type FirestoreDocumentReferenceLike, type FirestoreDocumentSnapshotLike, type FirestoreDriverClient, type FirestoreDriverConfig, type FirestoreDriverHandle, type FirestoreFieldTransform, type FirestoreQueryLike, type FirestoreQuerySnapshotLike, type FirestoreTransactionLike, createFirestoreDriver };
|