From 8ce87e7be66d906eb60397fdfd704a9c01946fae Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Fri, 5 Sep 2025 12:12:20 +0200 Subject: [PATCH 1/2] Sync rules: Export stream SQL functions --- .changeset/sixty-knives-thank.md | 5 +++ packages/sync-rules/src/index.ts | 1 + packages/sync-rules/src/request_functions.ts | 32 +++++++++++--------- packages/sync-rules/src/sql_functions.ts | 2 +- packages/sync-rules/src/streams/functions.ts | 4 +-- 5 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 .changeset/sixty-knives-thank.md diff --git a/.changeset/sixty-knives-thank.md b/.changeset/sixty-knives-thank.md new file mode 100644 index 000000000..9284fd4b0 --- /dev/null +++ b/.changeset/sixty-knives-thank.md @@ -0,0 +1,5 @@ +--- +'@powersync/service-sync-rules': patch +--- + +Export SQL functions for sync streams. diff --git a/packages/sync-rules/src/index.ts b/packages/sync-rules/src/index.ts index f3cf5af05..d3555f0f0 100644 --- a/packages/sync-rules/src/index.ts +++ b/packages/sync-rules/src/index.ts @@ -19,6 +19,7 @@ export * from './SqlParameterQuery.js'; export * from './SqlSyncRules.js'; export * from './StaticSchema.js'; export { SyncStream } from './streams/stream.js'; +export { STREAM_FUNCTIONS } from './streams/functions.js'; export { syncStreamFromSql } from './streams/from_sql.js'; export * from './TablePattern.js'; export * from './types.js'; diff --git a/packages/sync-rules/src/request_functions.ts b/packages/sync-rules/src/request_functions.ts index e9f23cb47..e6d257cfa 100644 --- a/packages/sync-rules/src/request_functions.ts +++ b/packages/sync-rules/src/request_functions.ts @@ -107,25 +107,27 @@ export const request_jwt: SqlParameterFunction = { usesUnauthenticatedRequestParameters: false }; -export const request_user_id: SqlParameterFunction = { - debugName: 'request.user_id', - parameterCount: 0, - call(parameters: ParameterValueSet) { - return parameters.userId; - }, - getReturnType() { - return ExpressionType.TEXT; - }, - detail: 'Authenticated user id', - documentation: "The id of the authenticated user.\nSame as `request.jwt() ->> 'sub'`.", - usesAuthenticatedRequestParameters: true, - usesUnauthenticatedRequestParameters: false -}; +export function generateUserIdFunction(debugName: string): SqlParameterFunction { + return { + debugName, + parameterCount: 0, + call(parameters: ParameterValueSet) { + return parameters.userId; + }, + getReturnType() { + return ExpressionType.TEXT; + }, + detail: 'Authenticated user id', + documentation: "The id of the authenticated user.\nSame as `request.jwt() ->> 'sub'`.", + usesAuthenticatedRequestParameters: true, + usesUnauthenticatedRequestParameters: false + }; +} const REQUEST_FUNCTIONS_NAMED = { ...globalRequestParameterFunctions('request'), jwt: request_jwt, - user_id: request_user_id + user_id: generateUserIdFunction('request.user_id') }; export const REQUEST_FUNCTIONS: Record = REQUEST_FUNCTIONS_NAMED; diff --git a/packages/sync-rules/src/sql_functions.ts b/packages/sync-rules/src/sql_functions.ts index afebbf646..60692edb1 100644 --- a/packages/sync-rules/src/sql_functions.ts +++ b/packages/sync-rules/src/sql_functions.ts @@ -514,7 +514,7 @@ export function generateSqlFunctions(compatibility: CompatibilityContext) { SqlFunction['call'] >; - const namedRecord: Record = named; + const namedRecord: Record = named; return { named: namedRecord, diff --git a/packages/sync-rules/src/streams/functions.ts b/packages/sync-rules/src/streams/functions.ts index cd6c2bb2e..ccdb62e66 100644 --- a/packages/sync-rules/src/streams/functions.ts +++ b/packages/sync-rules/src/streams/functions.ts @@ -1,7 +1,7 @@ import { + generateUserIdFunction, globalRequestParameterFunctions, parameterFunctions, - request_user_id, SqlParameterFunction } from '../request_functions.js'; import { ParameterValueSet } from '../types.js'; @@ -27,7 +27,7 @@ export const STREAM_FUNCTIONS: Record Date: Fri, 5 Sep 2025 14:12:25 +0200 Subject: [PATCH 2/2] Also patch description --- packages/sync-rules/src/request_functions.ts | 6 +++--- packages/sync-rules/src/streams/functions.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sync-rules/src/request_functions.ts b/packages/sync-rules/src/request_functions.ts index e6d257cfa..c77ff9a67 100644 --- a/packages/sync-rules/src/request_functions.ts +++ b/packages/sync-rules/src/request_functions.ts @@ -107,7 +107,7 @@ export const request_jwt: SqlParameterFunction = { usesUnauthenticatedRequestParameters: false }; -export function generateUserIdFunction(debugName: string): SqlParameterFunction { +export function generateUserIdFunction(debugName: string, sameAsDesc: string): SqlParameterFunction { return { debugName, parameterCount: 0, @@ -118,7 +118,7 @@ export function generateUserIdFunction(debugName: string): SqlParameterFunction return ExpressionType.TEXT; }, detail: 'Authenticated user id', - documentation: "The id of the authenticated user.\nSame as `request.jwt() ->> 'sub'`.", + documentation: `The id of the authenticated user.\nSame as \`${sameAsDesc} ->> 'sub'\`.`, usesAuthenticatedRequestParameters: true, usesUnauthenticatedRequestParameters: false }; @@ -127,7 +127,7 @@ export function generateUserIdFunction(debugName: string): SqlParameterFunction const REQUEST_FUNCTIONS_NAMED = { ...globalRequestParameterFunctions('request'), jwt: request_jwt, - user_id: generateUserIdFunction('request.user_id') + user_id: generateUserIdFunction('request.user_id', 'request.jwt()') }; export const REQUEST_FUNCTIONS: Record = REQUEST_FUNCTIONS_NAMED; diff --git a/packages/sync-rules/src/streams/functions.ts b/packages/sync-rules/src/streams/functions.ts index ccdb62e66..cc81dc1de 100644 --- a/packages/sync-rules/src/streams/functions.ts +++ b/packages/sync-rules/src/streams/functions.ts @@ -27,7 +27,7 @@ export const STREAM_FUNCTIONS: Record