From fe5c8908d11643fa221f153e3ff7129ae0252374 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Wed, 26 Nov 2025 12:53:34 +0100 Subject: [PATCH] separate sqlUtils.ts --- typescript-client/build.jsr.sh | 1 + typescript-client/build.sh | 1 + typescript-client/client.d.ts | 11 ------- typescript-client/client.ts | 42 ++---------------------- typescript-client/jsr.json | 2 +- typescript-client/publish.sh | 2 ++ typescript-client/sqlUtils.d.ts | 9 ++++++ typescript-client/sqlUtils.ts | 57 +++++++++++++++++++++++++++++++++ 8 files changed, 73 insertions(+), 52 deletions(-) create mode 100644 typescript-client/sqlUtils.d.ts create mode 100644 typescript-client/sqlUtils.ts diff --git a/typescript-client/build.jsr.sh b/typescript-client/build.jsr.sh index b82a9950af..205bb01297 100755 --- a/typescript-client/build.jsr.sh +++ b/typescript-client/build.jsr.sh @@ -11,6 +11,7 @@ sed -i 's/get \[Symbol\.toStringTag\]() {/get \[Symbol\.toStringTag\]() : string cp "${script_dirpath}/client.ts" "${script_dirpath}/src/" cp "${script_dirpath}/s3Types.ts" "${script_dirpath}/src/" +cp "${script_dirpath}/sqlUtils.ts" "${script_dirpath}/src/" echo "" >> "${script_dirpath}/src/index.ts" echo 'export type { S3Object, DenoS3LightClientSettings } from "./s3Types";' >> "${script_dirpath}/src/index.ts" echo "" >> "${script_dirpath}/src/index.ts" diff --git a/typescript-client/build.sh b/typescript-client/build.sh index fa08114466..35a4d2f8ee 100755 --- a/typescript-client/build.sh +++ b/typescript-client/build.sh @@ -36,6 +36,7 @@ fi cp "${script_dirpath}/client.ts" "${script_dirpath}/src/" cp "${script_dirpath}/s3Types.ts" "${script_dirpath}/src/" +cp "${script_dirpath}/sqlUtils.ts" "${script_dirpath}/src/" echo "" >> "${script_dirpath}/src/index.ts" echo 'export type { S3Object, DenoS3LightClientSettings } from "./s3Types";' >> "${script_dirpath}/src/index.ts" echo "" >> "${script_dirpath}/src/index.ts" diff --git a/typescript-client/client.d.ts b/typescript-client/client.d.ts index 6fa09ac320..41238ff787 100644 --- a/typescript-client/client.d.ts +++ b/typescript-client/client.d.ts @@ -158,14 +158,3 @@ export declare function uint8ArrayToBase64(arrayBuffer: Uint8Array): string; * @returns email address */ export declare function usernameToEmail(username: string): Promise; - -export type DataTableStatement = { - query(): Promise; -}; - -export type DataTableSqlTemplateFunction = ( - strings: TemplateStringsArray, - ...values: any[] -) => DataTableStatement; - -export declare function datatable(name: string): DataTableSqlTemplateFunction; \ No newline at end of file diff --git a/typescript-client/client.ts b/typescript-client/client.ts index bf50c8eb61..70e58671b9 100644 --- a/typescript-client/client.ts +++ b/typescript-client/client.ts @@ -17,6 +17,8 @@ import { type S3Object, } from "./s3Types"; +export { datatable } from "./sqlUtils"; + export { AdminService, AuditService, @@ -1224,46 +1226,6 @@ export async function requestInteractiveTeamsApproval({ }); } -export type DataTableStatement = { - query(): Promise; -}; - -export type DataTableSqlTemplateFunction = ( - strings: TemplateStringsArray, - ...values: any[] -) => DataTableStatement; - -export function datatable(name: string = "main"): DataTableSqlTemplateFunction { - return (strings, ...values) => { - let queryStr = - values.map((_, i) => `-- $${i + 1} arg${i + 1}`).join("\n") + "\n"; - for (let i = 0; i < strings.length; i++) { - queryStr += strings[i]; - if (i !== strings.length - 1) queryStr += `$${i + 1}`; - } - const args = { - ...Object.fromEntries(values.map((v, i) => [`arg${i + 1}`, v])), - database: `datatable://${name}`, - }; - - return { - queryStr, - args, - query: async () => { - let result = await JobService.runScriptPreviewInline({ - workspace: getWorkspace(), - requestBody: { - args, - content: queryStr, - language: "postgresql", - }, - }); - return result; - }, - }; - }; -} - async function getMockedApi(): Promise { if (mockedApi) { return mockedApi; diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 780fd79cd1..ea73dfeca0 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -3,7 +3,7 @@ "version": "1.582.2", "exports": "./src/index.ts", "publish": { - "exclude": ["!src", "./s3Types.ts", "./client.ts"] + "exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts"] }, "license": "Apache-2.0" } diff --git a/typescript-client/publish.sh b/typescript-client/publish.sh index 99f88ab29a..ba5c09c82f 100755 --- a/typescript-client/publish.sh +++ b/typescript-client/publish.sh @@ -9,8 +9,10 @@ rm -rf "${script_dirpath}/dist" ${script_dirpath}/build.sh rm "${script_dirpath}/client.ts" rm "${script_dirpath}/s3Types.ts" +rm "${script_dirpath}/sqlUtils.ts" npm install tsc cp "${script_dirpath}/src/client.ts" ${script_dirpath} cp "${script_dirpath}/src/s3Types.ts" ${script_dirpath} +cp "${script_dirpath}/src/sqlUtils.ts" ${script_dirpath} npm publish ${args} diff --git a/typescript-client/sqlUtils.d.ts b/typescript-client/sqlUtils.d.ts new file mode 100644 index 0000000000..caf22aaef0 --- /dev/null +++ b/typescript-client/sqlUtils.d.ts @@ -0,0 +1,9 @@ +export type SqlStatement = { + query(): Promise; +}; + +export interface SqlTemplateFunction { + (strings: TemplateStringsArray, ...values: any[]): SqlStatement; +} + +export declare function datatable(name: string): SqlTemplateFunction; diff --git a/typescript-client/sqlUtils.ts b/typescript-client/sqlUtils.ts new file mode 100644 index 0000000000..708331bbf7 --- /dev/null +++ b/typescript-client/sqlUtils.ts @@ -0,0 +1,57 @@ +import { getWorkspace, JobService } from "./client"; + +export type SqlStatement = { + queryStr: string; + args: Record; + query(): Promise; +}; + +export interface SqlTemplateFunction { + (strings: TemplateStringsArray, ...values: any[]): SqlStatement; +} + +/** + * @example + * let sql = wmill.datatable() + * let name = 'Robin' + * let age = 21 + * await sql` + * SELECT * FROM friends + * WHERE name = ${name} + * LIMIT ${age}::int + * `.query() + */ +export function datatable(name: string = "main"): SqlTemplateFunction { + let sql: SqlTemplateFunction = ( + strings: TemplateStringsArray, + ...values: any[] + ) => { + let queryStr = + values.map((_, i) => `-- $${i + 1} arg${i + 1}`).join("\n") + "\n"; + for (let i = 0; i < strings.length; i++) { + queryStr += strings[i]; + if (i !== strings.length - 1) queryStr += `$${i + 1}`; + } + const args = { + ...Object.fromEntries(values.map((v, i) => [`arg${i + 1}`, v])), + database: `datatable://${name}`, + }; + + return { + queryStr, + args, + query: async () => { + let result = await JobService.runScriptPreviewInline({ + workspace: getWorkspace(), + requestBody: { + args, + content: queryStr, + language: "postgresql", + }, + }); + return result; + }, + } satisfies SqlStatement; + }; + return sql; +}