@farming-labs/orm-redis 0.0.43
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 +1093 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +1076 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n createDriverHandle,\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n requireUniqueLookup,\n validateUniqueLookupUpdateData,\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 ModelName,\n type OrmDriver,\n type OrmDriverHandle,\n type RelationName,\n type SchemaDefinition,\n type SchemaManifest,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\n\ntype RedisRow = Record<string, unknown>;\ntype RedisWhere = Where<Record<string, unknown>>;\ntype RedisSort = Partial<Record<string, \"asc\" | \"desc\">>;\n\nconst ormKindKey = \"__orm_kind\";\nconst ormTargetKey = \"__orm_target\";\nconst ormDocIdKey = \"__orm_docId\";\nconst ormRecordKind = \"record\";\nconst ormUniqueKind = \"unique\";\nconst defaultBase = \"orm\";\n\nexport type RedisClientLike = {\n get?(key: string): Promise<unknown> | unknown;\n set?(key: string, value: string, ...rest: unknown[]): Promise<unknown> | unknown;\n del?(...keys: string[]): Promise<unknown> | unknown;\n unlink?(...keys: string[]): Promise<unknown> | unknown;\n keys?(pattern: string): Promise<unknown> | unknown;\n scan?(cursor: number | string, options?: Record<string, unknown>): Promise<unknown> | unknown;\n scanIterator?(options?: Record<string, unknown>): AsyncIterable<unknown>;\n setNX?(key: string, value: string): Promise<unknown> | unknown;\n setnx?(key: string, value: string): Promise<unknown> | unknown;\n sendCommand?(command: readonly string[]): Promise<unknown> | unknown;\n request?(...args: unknown[]): Promise<unknown> | unknown;\n connect?(): Promise<unknown>;\n quit?(): Promise<unknown>;\n disconnect?(): Promise<unknown>;\n};\n\nexport type RedisFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type RedisModelPrefixMap<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, string>\n>;\n\nexport type RedisDriverConfig<TSchema extends SchemaDefinition<any>> = {\n client: RedisClientLike;\n base?: string;\n prefixes?: RedisModelPrefixMap<TSchema>;\n transforms?: Partial<Record<string, Partial<Record<string, RedisFieldTransform>>>>;\n};\n\nexport type RedisDriverClient<TSchema extends SchemaDefinition<any>> = {\n client: RedisClientLike;\n base?: string;\n prefixes?: RedisModelPrefixMap<TSchema>;\n};\n\nexport type RedisDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"redis\",\n RedisDriverClient<TSchema>\n>;\n\ntype LoadedRow = {\n docId: string;\n key: string;\n data: RedisRow;\n stored: RedisRow;\n};\n\ntype UniqueLock = {\n key: string;\n target: string;\n fields: string[];\n};\n\ntype RedisRecordItem = {\n __orm_kind: \"record\";\n __orm_docId: string;\n data: RedisRow;\n};\n\ntype RedisUniqueItem = {\n __orm_kind: \"unique\";\n __orm_target: string;\n};\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction generateUuid() {\n const randomUuid = globalThis.crypto?.randomUUID;\n if (typeof randomUuid === \"function\") {\n return randomUuid.call(globalThis.crypto);\n }\n\n throw new Error(\"The current runtime does not provide crypto.randomUUID().\");\n}\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 isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction hasFunction<TName extends string>(\n value: unknown,\n name: TName,\n): value is Record<TName, (...args: any[]) => unknown> {\n return isRecord(value) && typeof value[name] === \"function\";\n}\n\nfunction joinRedisKey(...parts: Array<string | undefined | null>) {\n return parts.filter((part) => part && part.length > 0).join(\":\");\n}\n\nfunction isRedisRecordItem(value: unknown): value is RedisRecordItem {\n return (\n isRecord(value) &&\n value[ormKindKey] === ormRecordKind &&\n typeof value[ormDocIdKey] === \"string\" &&\n isRecord(value.data)\n );\n}\n\nfunction isRedisUniqueItem(value: unknown): value is RedisUniqueItem {\n return (\n isRecord(value) &&\n value[ormKindKey] === ormUniqueKind &&\n typeof value[ormTargetKey] === \"string\"\n );\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 applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return generateUuid();\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 sortRows(rows: LoadedRow[], orderBy?: RedisSort) {\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 redisConstraintError(target?: string | string[]) {\n const fields = Array.isArray(target) ? target.join(\", \") : (target ?? \"unique fields\");\n const error = new Error(`Redis unique constraint violation on ${fields}.`);\n Object.assign(error, {\n name: \"RedisUniqueConstraintError\",\n code: \"REDIS_UNIQUE_CONSTRAINT\",\n target,\n });\n return error;\n}\n\nfunction normalizeNxResult(result: unknown) {\n if (typeof result === \"boolean\") return result;\n if (typeof result === \"number\") return result === 1;\n if (typeof result === \"string\") {\n const normalized = result.trim().toUpperCase();\n return normalized === \"OK\" || normalized === \"1\" || normalized === \"TRUE\";\n }\n return false;\n}\n\nasync function callRedisCommand<T = unknown>(\n client: RedisClientLike,\n names: readonly string[],\n ...args: unknown[]\n) {\n const record = client as Record<string, (...args: unknown[]) => unknown>;\n for (const name of names) {\n if (hasFunction(client, name)) {\n return (await record[name](...args)) as T;\n }\n }\n\n throw new Error(`The Redis runtime client is missing required command support: ${names[0]}.`);\n}\n\nfunction normalizeStoredString(value: unknown) {\n if (value === undefined || value === null) return null;\n if (typeof value === \"string\") return value;\n if (value instanceof Uint8Array) {\n return new TextDecoder().decode(value);\n }\n return JSON.stringify(value);\n}\n\nfunction parseStoredJson<T>(raw: unknown) {\n if (raw === undefined || raw === null) return null;\n if (typeof raw === \"string\") {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n if (isRecord(raw)) {\n return raw as T;\n }\n return null;\n}\n\nfunction normalizeKeyList(value: unknown) {\n if (Array.isArray(value)) {\n if (value.length >= 2 && Array.isArray(value[1])) {\n return value[1].map((entry) => String(entry));\n }\n\n return value.map((entry) => String(entry));\n }\n\n if (isRecord(value) && Array.isArray(value.keys)) {\n return value.keys.map((entry) => String(entry));\n }\n\n return [] as string[];\n}\n\nfunction escapePatternCharacter(character: string) {\n return /[\\\\^$+?.()|[\\]{}]/.test(character) ? `\\\\${character}` : character;\n}\n\nfunction matchesRedisPattern(key: string, pattern: string) {\n const source = Array.from(pattern)\n .map((character) => {\n if (character === \"*\") return \".*\";\n if (character === \"?\") return \".\";\n return escapePatternCharacter(character);\n })\n .join(\"\");\n\n return new RegExp(`^${source}$`).test(key);\n}\n\nfunction extractScanCursor(value: unknown) {\n if (Array.isArray(value) && value.length >= 2) {\n return String(value[0] ?? \"0\");\n }\n\n if (isRecord(value) && \"cursor\" in value) {\n return String(value.cursor ?? \"0\");\n }\n\n return \"0\";\n}\n\nasync function getString(client: RedisClientLike, key: string) {\n const value = await callRedisCommand(client, [\"get\"], key);\n return normalizeStoredString(value);\n}\n\nasync function setString(client: RedisClientLike, key: string, value: string) {\n await callRedisCommand(client, [\"set\"], key, value);\n}\n\nasync function setStringNx(client: RedisClientLike, key: string, value: string) {\n if (hasFunction(client, \"setNX\")) {\n return normalizeNxResult(await client.setNX(key, value));\n }\n\n if (hasFunction(client, \"setnx\")) {\n return normalizeNxResult(await client.setnx(key, value));\n }\n\n if (hasFunction(client, \"set\")) {\n const attempts: Array<readonly unknown[]> = [\n [key, value, { NX: true }],\n [key, value, { nx: true }],\n [key, value, \"NX\"],\n ];\n\n for (const args of attempts) {\n try {\n const result = await client.set(...args);\n if (result === null || result === undefined) {\n return false;\n }\n return normalizeNxResult(result);\n } catch {\n // Try the next argument shape.\n }\n }\n }\n\n if (hasFunction(client, \"sendCommand\")) {\n return normalizeNxResult(await client.sendCommand([\"SET\", key, value, \"NX\"]));\n }\n\n // Last resort for thin Redis client wrappers that expose only basic get/set methods.\n // This path is not atomic, so we avoid it unless the client offers no NX-capable command.\n if ((await getString(client, key)) !== null) {\n return false;\n }\n\n await setString(client, key, value);\n return true;\n}\n\nasync function deleteKey(client: RedisClientLike, key: string) {\n if (hasFunction(client, \"unlink\")) {\n await client.unlink(key);\n return;\n }\n\n await callRedisCommand(client, [\"del\"], key);\n}\n\nasync function listKeys(client: RedisClientLike, pattern: string) {\n if (hasFunction(client, \"keys\")) {\n return normalizeKeyList(await client.keys(pattern));\n }\n\n if (hasFunction(client, \"scanIterator\")) {\n const keys: string[] = [];\n for await (const item of client.scanIterator({ MATCH: pattern, COUNT: 100 })) {\n keys.push(String(item));\n }\n return keys;\n }\n\n if (hasFunction(client, \"scan\")) {\n let cursor = \"0\";\n const keys: string[] = [];\n const scanAttempts: Array<Record<string, unknown>> = hasFunction(client, \"request\")\n ? [\n { match: pattern, count: 100 },\n { MATCH: pattern, COUNT: 100 },\n ]\n : [\n { MATCH: pattern, COUNT: 100 },\n { match: pattern, count: 100 },\n ];\n\n do {\n let result: unknown;\n\n for (const options of scanAttempts) {\n try {\n result = await client.scan(cursor, options);\n break;\n } catch {\n // Try the next option shape.\n }\n }\n\n if (result === undefined) {\n throw new Error(\"The Redis runtime client scan() command could not be called.\");\n }\n\n keys.push(...normalizeKeyList(result).filter((key) => matchesRedisPattern(key, pattern)));\n cursor = extractScanCursor(result);\n } while (cursor !== \"0\");\n\n return keys;\n }\n\n throw new Error(\"The Redis runtime client must provide keys(), scanIterator(), or scan().\");\n}\n\nfunction createRedisDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: RedisDriverConfig<TSchema>,\n): OrmDriver<TSchema, RedisDriverHandle<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 Redis runtime does not support schema-qualified tables for model \"${model.name}\". Use flat table 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 Redis 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 getModelBase(schema: TSchema, modelName: ModelName<TSchema>) {\n const manifest = getSupportedManifest(schema);\n return (\n config.prefixes?.[modelName] ??\n joinRedisKey(config.base ?? defaultBase, manifest.models[modelName].table)\n );\n }\n\n function recordBase(schema: TSchema, modelName: ModelName<TSchema>) {\n return joinRedisKey(getModelBase(schema, modelName), \"record\");\n }\n\n function recordKey(schema: TSchema, modelName: ModelName<TSchema>, docId: string) {\n return joinRedisKey(recordBase(schema, modelName), encodeURIComponent(docId));\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.toISOString();\n return new Date(value as string | number).toISOString();\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 return value instanceof Date ? value : 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: RedisRow = {};\n const decoded: RedisRow = {};\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: generateUuid(),\n stored,\n decoded,\n };\n }\n\n let idValue = decoded[idField.name];\n\n if (idValue === undefined || idValue === null) {\n if (idField.idType === \"integer\") {\n throw new Error(\n `The Redis runtime requires an explicit numeric id for model \"${model.name}\" when using manual integer ids.`,\n );\n }\n\n idValue = generateUuid();\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 if (field.name === \"id\" && !equalValues(current.data.id, value)) {\n throw new Error(\n `The Redis runtime does not support updating the id field for model \"${model.name}\".`,\n );\n }\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 return {\n docId: current.docId,\n stored,\n decoded,\n };\n }\n\n async function loadRowByKey(model: ManifestModel, key: string) {\n const item = parseStoredJson<RedisRecordItem>(await getString(config.client, key));\n if (!isRedisRecordItem(item)) {\n return null;\n }\n\n const decoded: RedisRow = {};\n for (const field of Object.values(model.fields)) {\n decoded[field.name] = decodeValue(\n model.name,\n field,\n item.data[field.column],\n item.__orm_docId,\n );\n }\n\n return {\n docId: item.__orm_docId,\n key,\n data: decoded,\n stored: item.data,\n } satisfies LoadedRow;\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 keys = await listKeys(config.client, `${recordBase(schema, modelName)}:*`);\n const rows = await Promise.all(keys.map((key) => loadRowByKey(model, key)));\n return rows.filter((row): row is LoadedRow => !!row);\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(model: ManifestModel, record: RedisRow, where?: RedisWhere) {\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?: RedisWhere;\n orderBy?: RedisSort;\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 function serializeUniqueValue(model: ManifestModel, fieldName: string, value: unknown) {\n const field = model.fields[fieldName];\n const normalized = decodeValue(model.name, field, encodeValue(model.name, field, value));\n\n if (normalized instanceof Date) {\n return normalized.toISOString();\n }\n\n if (typeof normalized === \"bigint\") {\n return normalized.toString();\n }\n\n return JSON.stringify(normalized);\n }\n\n function uniqueLockKey(schema: TSchema, model: ManifestModel, fields: string[], row: RedisRow) {\n const values = fields.map((fieldName) => row[fieldName]);\n if (values.some((value) => value === undefined || value === null)) {\n return null;\n }\n\n return joinRedisKey(\n getModelBase(schema, model.name as ModelName<TSchema>),\n \"unique\",\n fields.join(\"+\"),\n ...fields.map((fieldName) =>\n encodeURIComponent(serializeUniqueValue(model, fieldName, row[fieldName])),\n ),\n );\n }\n\n function uniqueLocksForRow(schema: TSchema, model: ManifestModel, row: RedisRow, docId: string) {\n const target = recordKey(schema, model.name as ModelName<TSchema>, docId);\n const locks: UniqueLock[] = [];\n\n for (const field of Object.values(model.fields)) {\n if (!field.unique) continue;\n const key = uniqueLockKey(schema, model, [field.name], row);\n if (!key) continue;\n locks.push({\n key,\n target,\n fields: [field.name],\n });\n }\n\n for (const constraint of model.constraints.unique) {\n const key = uniqueLockKey(schema, model, [...constraint.fields], row);\n if (!key) continue;\n locks.push({\n key,\n target,\n fields: [...constraint.fields],\n });\n }\n\n return locks;\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 return loadRowByKey(\n model,\n recordKey(schema, modelName, String(lookup.values[lookup.fields[0]!.name])),\n );\n }\n\n const normalizedLookupRow = Object.fromEntries(\n lookup.fields.map((field) => [\n field.name,\n decodeValue(model.name, field, encodeValue(model.name, field, lookup.values[field.name])),\n ]),\n );\n const key = uniqueLockKey(\n schema,\n model,\n lookup.fields.map((field) => field.name),\n normalizedLookupRow,\n );\n if (!key) {\n return null;\n }\n\n const lock = parseStoredJson<RedisUniqueItem>(await getString(config.client, key));\n if (!isRedisUniqueItem(lock)) {\n return null;\n }\n\n return loadRowByKey(model, lock.__orm_target);\n }\n\n function findUniqueConflict(\n model: ManifestModel,\n candidate: RedisRow,\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 function serializeItem(value: RedisRecordItem | RedisUniqueItem) {\n return JSON.stringify(value);\n }\n\n function buildRecordItem(row: { docId: string; stored: RedisRow }): RedisRecordItem {\n return {\n __orm_kind: ormRecordKind,\n __orm_docId: row.docId,\n data: row.stored,\n };\n }\n\n async function putRecordSequential(\n schema: TSchema,\n modelName: ModelName<TSchema>,\n row: { docId: string; stored: RedisRow },\n conditionallyCreate: boolean,\n ) {\n const key = recordKey(schema, modelName, row.docId);\n const payload = serializeItem(buildRecordItem(row));\n\n if (conditionallyCreate) {\n if (!(await setStringNx(config.client, key, payload))) {\n throw redisConstraintError([\"id\"]);\n }\n return;\n }\n\n await setString(config.client, key, payload);\n }\n\n async function putUniqueSequential(lock: UniqueLock) {\n const existing = parseStoredJson<RedisUniqueItem>(await getString(config.client, lock.key));\n if (isRedisUniqueItem(existing)) {\n if (existing.__orm_target !== lock.target) {\n throw redisConstraintError(lock.fields);\n }\n return;\n }\n\n const written = await setStringNx(\n config.client,\n lock.key,\n serializeItem({\n __orm_kind: ormUniqueKind,\n __orm_target: lock.target,\n } satisfies RedisUniqueItem),\n );\n\n if (written) {\n return;\n }\n\n const current = parseStoredJson<RedisUniqueItem>(await getString(config.client, lock.key));\n if (isRedisUniqueItem(current) && current.__orm_target === lock.target) {\n return;\n }\n\n throw redisConstraintError(lock.fields);\n }\n\n async function deleteSequential(key: string) {\n await deleteKey(config.client, key);\n }\n\n async function acquireUniqueLocksSequential(locks: UniqueLock[]) {\n const acquired: UniqueLock[] = [];\n\n try {\n for (const lock of locks) {\n await putUniqueSequential(lock);\n acquired.push(lock);\n }\n } catch (error) {\n await releaseUniqueLocksSequential(acquired);\n throw error;\n }\n\n return acquired;\n }\n\n async function releaseUniqueLocksSequential(locks: UniqueLock[]) {\n for (const lock of [...locks].reverse()) {\n try {\n await deleteSequential(lock.key);\n } catch {\n // Best-effort cleanup only.\n }\n }\n }\n\n async function createRecordWithLocks(\n schema: TSchema,\n modelName: ModelName<TSchema>,\n row: { docId: string; stored: RedisRow; decoded: RedisRow },\n model: ManifestModel,\n ) {\n const locks = uniqueLocksForRow(schema, model, row.decoded, row.docId);\n const acquired = await acquireUniqueLocksSequential(locks);\n\n try {\n await putRecordSequential(schema, modelName, row, true);\n } catch (error) {\n await releaseUniqueLocksSequential(acquired);\n throw error;\n }\n }\n\n async function updateRecordWithLocks(\n schema: TSchema,\n modelName: ModelName<TSchema>,\n model: ManifestModel,\n current: LoadedRow,\n next: { docId: string; stored: RedisRow; decoded: RedisRow },\n ) {\n const currentLocks = new Map(\n uniqueLocksForRow(schema, model, current.data, current.docId).map((lock) => [lock.key, lock]),\n );\n const nextLocks = new Map(\n uniqueLocksForRow(schema, model, next.decoded, next.docId).map((lock) => [lock.key, lock]),\n );\n const addedLocks = [...nextLocks.values()].filter((lock) => !currentLocks.has(lock.key));\n const removedLocks = [...currentLocks.values()].filter((lock) => !nextLocks.has(lock.key));\n const acquired = await acquireUniqueLocksSequential(addedLocks);\n\n try {\n await putRecordSequential(schema, modelName, next, false);\n } catch (error) {\n await releaseUniqueLocksSequential(acquired);\n throw error;\n }\n\n for (const lock of removedLocks) {\n await deleteSequential(lock.key);\n }\n }\n\n async function deleteRecordWithLocks(\n schema: TSchema,\n modelName: ModelName<TSchema>,\n model: ManifestModel,\n current: LoadedRow,\n ) {\n await deleteSequential(recordKey(schema, modelName, current.docId));\n const locks = uniqueLocksForRow(schema, model, current.data, current.docId);\n for (const lock of locks) {\n await deleteSequential(lock.key);\n }\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: RedisRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[modelName];\n const output: RedisRow = {};\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) 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: RedisRow,\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 = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n )[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 = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n )[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 = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n 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 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 = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n );\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 relationTargetManifest(schema: TSchema, modelName: string) {\n return getSupportedManifest(schema).models[modelName as ModelName<TSchema>];\n }\n\n let driver!: OrmDriver<TSchema, RedisDriverHandle<TSchema>>;\n\n driver = {\n handle: createDriverHandle({\n kind: \"redis\",\n client: {\n client: config.client,\n base: config.base,\n prefixes: config.prefixes,\n },\n capabilities: {\n supportsNumericIds: true,\n numericIds: \"manual\",\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: false,\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: \"emulated\",\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 RedisWhere)) {\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 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 redisConstraintError(conflict);\n }\n\n await createRecordWithLocks(schema, modelName, built, model);\n return projectRow(schema, modelName, built.decoded, args.select);\n },\n async createMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const existingRows = await loadRows(schema, modelName);\n const created: Array<{ docId: string; stored: RedisRow; decoded: RedisRow }> = [];\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 key: recordKey(schema, modelName, row.docId),\n data: row.decoded,\n stored: row.stored,\n })),\n ]);\n\n if (conflict) {\n throw redisConstraintError(conflict);\n }\n\n created.push(built);\n }\n\n for (const row of created) {\n await createRecordWithLocks(schema, modelName, row, model);\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 const model = getSupportedManifest(schema).models[modelName];\n const rows = await loadRows(schema, modelName);\n const current = applyModelQuery(model, rows, {\n where: args.where as RedisWhere,\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 redisConstraintError(conflict);\n }\n\n await updateRecordWithLocks(schema, modelName, model, current, next);\n return projectRow(schema, modelName, next.decoded, args.select);\n },\n async updateMany(schema, modelName, args) {\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 RedisWhere,\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 redisConstraintError(conflict);\n }\n\n pending.push({\n docId: next.docId,\n key: recordKey(schema, modelName, 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 updateRecordWithLocks(schema, modelName, model, matched[index]!, nextRows[index]!);\n }\n\n return nextRows.length;\n },\n async upsert(schema, modelName, args) {\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 RedisWhere)) {\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 redisConstraintError(conflict);\n }\n\n await updateRecordWithLocks(schema, modelName, model, current, next);\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 redisConstraintError(conflict);\n }\n\n await createRecordWithLocks(schema, modelName, created, model);\n return projectRow(schema, modelName, created.decoded, args.select);\n },\n async delete(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as RedisWhere,\n take: 1,\n })[0];\n if (!row) return 0;\n\n await deleteRecordWithLocks(schema, modelName, model, row);\n return 1;\n },\n async deleteMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as RedisWhere,\n });\n\n for (const row of rows) {\n await deleteRecordWithLocks(schema, modelName, model, row);\n }\n\n return rows.length;\n },\n async transaction(schema, run) {\n getSupportedManifest(schema);\n return run(driver);\n },\n };\n\n return driver;\n}\n\nexport function createRedisDriver<TSchema extends SchemaDefinition<any>>(\n config: RedisDriverConfig<TSchema>,\n): OrmDriver<TSchema, RedisDriverHandle<TSchema>> {\n return createRedisDriverInternal(config);\n}\n"],"mappings":"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","names":["targetRows","matchedRows","rows","conflict"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
|
|
2
|
+
|
|
3
|
+
type RedisClientLike = {
|
|
4
|
+
get?(key: string): Promise<unknown> | unknown;
|
|
5
|
+
set?(key: string, value: string, ...rest: unknown[]): Promise<unknown> | unknown;
|
|
6
|
+
del?(...keys: string[]): Promise<unknown> | unknown;
|
|
7
|
+
unlink?(...keys: string[]): Promise<unknown> | unknown;
|
|
8
|
+
keys?(pattern: string): Promise<unknown> | unknown;
|
|
9
|
+
scan?(cursor: number | string, options?: Record<string, unknown>): Promise<unknown> | unknown;
|
|
10
|
+
scanIterator?(options?: Record<string, unknown>): AsyncIterable<unknown>;
|
|
11
|
+
setNX?(key: string, value: string): Promise<unknown> | unknown;
|
|
12
|
+
setnx?(key: string, value: string): Promise<unknown> | unknown;
|
|
13
|
+
sendCommand?(command: readonly string[]): Promise<unknown> | unknown;
|
|
14
|
+
request?(...args: unknown[]): Promise<unknown> | unknown;
|
|
15
|
+
connect?(): Promise<unknown>;
|
|
16
|
+
quit?(): Promise<unknown>;
|
|
17
|
+
disconnect?(): Promise<unknown>;
|
|
18
|
+
};
|
|
19
|
+
type RedisFieldTransform = {
|
|
20
|
+
encode?: (value: unknown) => unknown;
|
|
21
|
+
decode?: (value: unknown) => unknown;
|
|
22
|
+
};
|
|
23
|
+
type RedisModelPrefixMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, string>>;
|
|
24
|
+
type RedisDriverConfig<TSchema extends SchemaDefinition<any>> = {
|
|
25
|
+
client: RedisClientLike;
|
|
26
|
+
base?: string;
|
|
27
|
+
prefixes?: RedisModelPrefixMap<TSchema>;
|
|
28
|
+
transforms?: Partial<Record<string, Partial<Record<string, RedisFieldTransform>>>>;
|
|
29
|
+
};
|
|
30
|
+
type RedisDriverClient<TSchema extends SchemaDefinition<any>> = {
|
|
31
|
+
client: RedisClientLike;
|
|
32
|
+
base?: string;
|
|
33
|
+
prefixes?: RedisModelPrefixMap<TSchema>;
|
|
34
|
+
};
|
|
35
|
+
type RedisDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"redis", RedisDriverClient<TSchema>>;
|
|
36
|
+
declare function createRedisDriver<TSchema extends SchemaDefinition<any>>(config: RedisDriverConfig<TSchema>): OrmDriver<TSchema, RedisDriverHandle<TSchema>>;
|
|
37
|
+
|
|
38
|
+
export { type RedisClientLike, type RedisDriverClient, type RedisDriverConfig, type RedisDriverHandle, type RedisFieldTransform, type RedisModelPrefixMap, createRedisDriver };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
|
|
2
|
+
|
|
3
|
+
type RedisClientLike = {
|
|
4
|
+
get?(key: string): Promise<unknown> | unknown;
|
|
5
|
+
set?(key: string, value: string, ...rest: unknown[]): Promise<unknown> | unknown;
|
|
6
|
+
del?(...keys: string[]): Promise<unknown> | unknown;
|
|
7
|
+
unlink?(...keys: string[]): Promise<unknown> | unknown;
|
|
8
|
+
keys?(pattern: string): Promise<unknown> | unknown;
|
|
9
|
+
scan?(cursor: number | string, options?: Record<string, unknown>): Promise<unknown> | unknown;
|
|
10
|
+
scanIterator?(options?: Record<string, unknown>): AsyncIterable<unknown>;
|
|
11
|
+
setNX?(key: string, value: string): Promise<unknown> | unknown;
|
|
12
|
+
setnx?(key: string, value: string): Promise<unknown> | unknown;
|
|
13
|
+
sendCommand?(command: readonly string[]): Promise<unknown> | unknown;
|
|
14
|
+
request?(...args: unknown[]): Promise<unknown> | unknown;
|
|
15
|
+
connect?(): Promise<unknown>;
|
|
16
|
+
quit?(): Promise<unknown>;
|
|
17
|
+
disconnect?(): Promise<unknown>;
|
|
18
|
+
};
|
|
19
|
+
type RedisFieldTransform = {
|
|
20
|
+
encode?: (value: unknown) => unknown;
|
|
21
|
+
decode?: (value: unknown) => unknown;
|
|
22
|
+
};
|
|
23
|
+
type RedisModelPrefixMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, string>>;
|
|
24
|
+
type RedisDriverConfig<TSchema extends SchemaDefinition<any>> = {
|
|
25
|
+
client: RedisClientLike;
|
|
26
|
+
base?: string;
|
|
27
|
+
prefixes?: RedisModelPrefixMap<TSchema>;
|
|
28
|
+
transforms?: Partial<Record<string, Partial<Record<string, RedisFieldTransform>>>>;
|
|
29
|
+
};
|
|
30
|
+
type RedisDriverClient<TSchema extends SchemaDefinition<any>> = {
|
|
31
|
+
client: RedisClientLike;
|
|
32
|
+
base?: string;
|
|
33
|
+
prefixes?: RedisModelPrefixMap<TSchema>;
|
|
34
|
+
};
|
|
35
|
+
type RedisDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"redis", RedisDriverClient<TSchema>>;
|
|
36
|
+
declare function createRedisDriver<TSchema extends SchemaDefinition<any>>(config: RedisDriverConfig<TSchema>): OrmDriver<TSchema, RedisDriverHandle<TSchema>>;
|
|
37
|
+
|
|
38
|
+
export { type RedisClientLike, type RedisDriverClient, type RedisDriverConfig, type RedisDriverHandle, type RedisFieldTransform, type RedisModelPrefixMap, createRedisDriver };
|