From 46c24935ac90bac5fc0cf2b42bab55cd4ab06205 Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 9 Dec 2024 13:30:49 +0800 Subject: [PATCH 1/4] toPowerSyncTable support mode --- packages/drizzle-driver/src/utils/schema.ts | 6 ++++++ packages/drizzle-driver/tests/sqlite/schema.test.ts | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/drizzle-driver/src/utils/schema.ts b/packages/drizzle-driver/src/utils/schema.ts index eadc744b8..74e361095 100644 --- a/packages/drizzle-driver/src/utils/schema.ts +++ b/packages/drizzle-driver/src/utils/schema.ts @@ -13,6 +13,9 @@ import { SQLiteInteger, SQLiteReal, SQLiteText, + SQLiteTextJson, + SQLiteTimestamp, + SQLiteBoolean, type SQLiteTableWithColumns, type TableConfig } from 'drizzle-orm/sqlite-core'; @@ -39,9 +42,12 @@ export function toPowerSyncTable>( let mappedType: BaseColumnType; switch (drizzleColumn.columnType) { case SQLiteText.name: + case SQLiteTextJson.name: mappedType = column.text; break; case SQLiteInteger.name: + case SQLiteTimestamp.name: + case SQLiteBoolean.name: mappedType = column.integer; break; case SQLiteReal.name: diff --git a/packages/drizzle-driver/tests/sqlite/schema.test.ts b/packages/drizzle-driver/tests/sqlite/schema.test.ts index 069d97884..ef099b55d 100644 --- a/packages/drizzle-driver/tests/sqlite/schema.test.ts +++ b/packages/drizzle-driver/tests/sqlite/schema.test.ts @@ -8,17 +8,25 @@ describe('toPowerSyncTable', () => { const lists = sqliteTable('lists', { id: text('id').primaryKey(), name: text('name').notNull(), + verified: integer('verified', {mode: 'boolean'}), owner_id: text('owner_id'), counter: integer('counter'), - completion: real('completion') + completion: real('completion'), + info: text('info', {mode: 'json'}), + created_at: integer('created_at', {mode: 'timestamp'}), + updated_at: integer('updated_at', {mode: 'timestamp'}), }); const convertedList = toPowerSyncTable(lists); const expectedLists = new Table({ name: column.text, + verified: column.integer, owner_id: column.text, counter: column.integer, - completion: column.real + completion: column.real, + info: column.text, + created_at: column.integer, + updated_at: column.integer, }); expect(convertedList).toEqual(expectedLists); From 42a22daa3cfa0e4bbd8cacf6727e1dbec0775e19 Mon Sep 17 00:00:00 2001 From: Bryan Date: Mon, 9 Dec 2024 15:03:49 +0800 Subject: [PATCH 2/4] use [entityKind] instead of name --- packages/drizzle-driver/src/utils/schema.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/drizzle-driver/src/utils/schema.ts b/packages/drizzle-driver/src/utils/schema.ts index 74e361095..bed331fe8 100644 --- a/packages/drizzle-driver/src/utils/schema.ts +++ b/packages/drizzle-driver/src/utils/schema.ts @@ -7,7 +7,7 @@ import { type BaseColumnType, type TableV2Options } from '@powersync/common'; -import { InferSelectModel, isTable, Relations } from 'drizzle-orm'; +import { entityKind, InferSelectModel, isTable, Relations } from 'drizzle-orm'; import { getTableConfig, SQLiteInteger, @@ -41,16 +41,16 @@ export function toPowerSyncTable>( let mappedType: BaseColumnType; switch (drizzleColumn.columnType) { - case SQLiteText.name: - case SQLiteTextJson.name: + case SQLiteText[entityKind]: + case SQLiteTextJson[entityKind]: mappedType = column.text; break; - case SQLiteInteger.name: - case SQLiteTimestamp.name: - case SQLiteBoolean.name: + case SQLiteInteger[entityKind]: + case SQLiteTimestamp[entityKind]: + case SQLiteBoolean[entityKind]: mappedType = column.integer; break; - case SQLiteReal.name: + case SQLiteReal[entityKind]: mappedType = column.real; break; default: From 6fd8d74a151793fd75c1a651fe131a200b0f5580 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Dec 2024 11:33:45 +0200 Subject: [PATCH 3/4] Formatting. --- packages/drizzle-driver/tests/sqlite/schema.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/drizzle-driver/tests/sqlite/schema.test.ts b/packages/drizzle-driver/tests/sqlite/schema.test.ts index ef099b55d..1086dc768 100644 --- a/packages/drizzle-driver/tests/sqlite/schema.test.ts +++ b/packages/drizzle-driver/tests/sqlite/schema.test.ts @@ -8,13 +8,13 @@ describe('toPowerSyncTable', () => { const lists = sqliteTable('lists', { id: text('id').primaryKey(), name: text('name').notNull(), - verified: integer('verified', {mode: 'boolean'}), + verified: integer('verified', { mode: 'boolean' }), owner_id: text('owner_id'), counter: integer('counter'), completion: real('completion'), - info: text('info', {mode: 'json'}), - created_at: integer('created_at', {mode: 'timestamp'}), - updated_at: integer('updated_at', {mode: 'timestamp'}), + info: text('info', { mode: 'json' }), + created_at: integer('created_at', { mode: 'timestamp' }), + updated_at: integer('updated_at', { mode: 'timestamp' }) }); const convertedList = toPowerSyncTable(lists); @@ -26,7 +26,7 @@ describe('toPowerSyncTable', () => { completion: column.real, info: column.text, created_at: column.integer, - updated_at: column.integer, + updated_at: column.integer }); expect(convertedList).toEqual(expectedLists); From af48fbe02e2f4a703ad8c364d5dd94df544dca32 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Dec 2024 11:56:55 +0200 Subject: [PATCH 4/4] Minor reordering of columns in test for readability. --- .changeset/flat-toes-judge.md | 5 +++++ packages/drizzle-driver/tests/sqlite/schema.test.ts | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/flat-toes-judge.md diff --git a/.changeset/flat-toes-judge.md b/.changeset/flat-toes-judge.md new file mode 100644 index 000000000..43f46299d --- /dev/null +++ b/.changeset/flat-toes-judge.md @@ -0,0 +1,5 @@ +--- +'@powersync/drizzle-driver': minor +--- + +Added support for column "mode" option. This allows the ORM to expose values as complex types such as JSON and Timestamp, but store them as primitives such as text and integer. diff --git a/packages/drizzle-driver/tests/sqlite/schema.test.ts b/packages/drizzle-driver/tests/sqlite/schema.test.ts index 1086dc768..008a9730f 100644 --- a/packages/drizzle-driver/tests/sqlite/schema.test.ts +++ b/packages/drizzle-driver/tests/sqlite/schema.test.ts @@ -8,23 +8,23 @@ describe('toPowerSyncTable', () => { const lists = sqliteTable('lists', { id: text('id').primaryKey(), name: text('name').notNull(), - verified: integer('verified', { mode: 'boolean' }), + info: text('info', { mode: 'json' }), owner_id: text('owner_id'), counter: integer('counter'), completion: real('completion'), - info: text('info', { mode: 'json' }), + verified: integer('verified', { mode: 'boolean' }), created_at: integer('created_at', { mode: 'timestamp' }), - updated_at: integer('updated_at', { mode: 'timestamp' }) + updated_at: integer('updated_at', { mode: 'timestamp_ms' }) }); const convertedList = toPowerSyncTable(lists); const expectedLists = new Table({ name: column.text, - verified: column.integer, + info: column.text, owner_id: column.text, counter: column.integer, completion: column.real, - info: column.text, + verified: column.integer, created_at: column.integer, updated_at: column.integer });