Skip to content

Commit

Permalink
Pass conerter to replication transform
Browse files Browse the repository at this point in the history
  • Loading branch information
msfstef committed Apr 9, 2024
1 parent 6a0b78d commit 95f3314
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 12 deletions.
5 changes: 3 additions & 2 deletions clients/typescript/src/client/model/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,11 @@ export class ElectricClient<
): ElectricClient<DB> {
const tables = dbDescription.extendedTables
const shapeManager = new ShapeManager(satellite)
const converter = dialect === 'SQLite' ? sqliteConverter : postgresConverter
const replicationTransformManager = new ReplicationTransformManager(
satellite
satellite,
converter
)
const converter = dialect === 'SQLite' ? sqliteConverter : postgresConverter
const inputTransformer = new InputTransformer(converter)

const createTable = (tableName: string) => {
Expand Down
9 changes: 3 additions & 6 deletions clients/typescript/src/client/model/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,7 @@ import { NarrowInclude } from '../input/inputNarrowing'
import { IShapeManager } from './shapes'
import { ShapeSubscription } from '../../satellite'
import { Rel, Shape } from '../../satellite/shapes/types'
import {
IReplicationTransformManager,
transformTableRecord,
} from './transforms'
import { IReplicationTransformManager } from './transforms'
import { InputTransformer } from '../conversions/input'
import { Dialect } from '../../migrators/query-builder/builder'

Expand Down Expand Up @@ -1625,7 +1622,7 @@ export class Table<
this._qualifiedTableName,
{
transformInbound: (record) =>
transformTableRecord(
this._replicationTransformManager.transformTableRecord(
record,
i.transformInbound,
this._fields,
Expand All @@ -1634,7 +1631,7 @@ export class Table<
),

transformOutbound: (record) =>
transformTableRecord(
this._replicationTransformManager.transformTableRecord(
record,
i.transformOutbound,
this._fields,
Expand Down
35 changes: 32 additions & 3 deletions clients/typescript/src/client/model/transforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
ReplicatedRowTransformer,
Record as DataRecord,
} from '../../util'
import { Converter } from '../conversions/converter'
import { Transformation, transformFields } from '../conversions/input'
import {
validate,
Expand All @@ -18,12 +19,20 @@ export interface IReplicationTransformManager {
transform: ReplicatedRowTransformer<DataRecord>
): void
clearTableTransform(tableName: QualifiedTablename): void

transformTableRecord<T extends Record<string, unknown>>(
record: DataRecord,
transformRow: (row: T) => T,
fields: Fields,
schema: z.ZodTypeAny,
immutableFields: string[]
): DataRecord
}

export class ReplicationTransformManager
implements IReplicationTransformManager
{
constructor(private satellite: Satellite) {}
constructor(private satellite: Satellite, private converter: Converter) {}

setTableTransform(
tableName: QualifiedTablename,
Expand All @@ -35,6 +44,23 @@ export class ReplicationTransformManager
clearTableTransform(tableName: QualifiedTablename): void {
this.satellite.clearReplicationTransform(tableName)
}

transformTableRecord<T extends Record<string, unknown>>(
record: DataRecord,
transformRow: (row: T) => T,
fields: Fields,
schema: z.ZodTypeAny,
immutableFields: string[]
): DataRecord {
return transformTableRecord(
record,
transformRow,
fields,
schema,
this.converter,
immutableFields
)
}
}

/**
Expand All @@ -53,13 +79,15 @@ export function transformTableRecord<T extends Record<string, unknown>>(
transformRow: (row: T) => T,
fields: Fields,
schema: z.ZodTypeAny,
converter: Converter,
immutableFields: string[]
): DataRecord {
// parse raw record according to specified fields
const parsedRow = transformFields(
record,
fields,
Transformation.Sqlite2Js
converter,
Transformation.Decode
) as T

// apply specified transformation
Expand All @@ -70,7 +98,8 @@ export function transformTableRecord<T extends Record<string, unknown>>(
const transformedRecord = transformFields(
validatedTransformedParsedRow,
fields,
Transformation.Js2Sqlite
converter,
Transformation.Encode
) as DataRecord

// check if any of the immutable fields were modified
Expand Down
12 changes: 11 additions & 1 deletion clients/typescript/test/client/model/transforms.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { schema, Post } from '../generated'
import { transformTableRecord } from '../../../src/client/model/transforms'
import { InvalidRecordTransformationError } from '../../../src/client/validation/errors/invalidRecordTransformationError'
import { Record } from '../../../src/util'
import { sqliteConverter } from '../../../src/client/conversions/sqlite'

const tableName = 'Post'
const fields = schema.getFields(tableName)
Expand All @@ -24,7 +25,14 @@ const post1 = {

test('transformTableRecord should validate the input', (t) => {
const liftedTransform = (r: Record) =>
transformTableRecord(r, (row: Post) => row, fields, modelSchema, [])
transformTableRecord(
r,
(row: Post) => row,
fields,
modelSchema,
sqliteConverter,
[]
)

// should not throw for properly typed input
t.notThrows(() => liftedTransform(post1))
Expand Down Expand Up @@ -52,6 +60,7 @@ test('transformTableRecord should validate the output', (t) => {
}),
fields,
modelSchema,
sqliteConverter,
[]
)
// should throw for improperly typed input
Expand All @@ -68,6 +77,7 @@ test('transformTableRecord should validate output does not modify immutable fiel
}),
fields,
modelSchema,
sqliteConverter,
['title']
)
t.throws(() => liftedTransform(post1), {
Expand Down

0 comments on commit 95f3314

Please sign in to comment.