From e089109b50bd014c7a4f0fd7f60c53e8be63fb95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ko=C5=82odziejczak?= <31549762+mrl5@users.noreply.github.com> Date: Sun, 4 Dec 2022 19:56:51 +0100 Subject: [PATCH] feat(frontend): introduce mysql as a script language (#982) * fix(deno-client): export mysql from mod.ts + improve robustness * feat(frontend): introduce mysql as a script language --- .gitignore | 1 + deno-client/mod.ts | 1 + deno-client/mysql.ts | 5 ++++- .../src/lib/components/ScriptBuilder.svelte | 13 +++++++++++ .../common/languageIcons/LanguageIcon.svelte | 8 ++++--- .../flows/content/FlowInputs.svelte | 7 ++++++ frontend/src/lib/script_helpers.ts | 22 ++++++++++++++++++- 7 files changed, 52 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b3e6edad4a..482f2643b5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ nohup.out local/ frontend/src/routes/test.svelte CaddyfileRemoteMalo +*.swp diff --git a/deno-client/mod.ts b/deno-client/mod.ts index 175eae591f..6181779279 100644 --- a/deno-client/mod.ts +++ b/deno-client/mod.ts @@ -8,6 +8,7 @@ export { } from './windmill-api/index.ts' export { pgSql, pgClient } from './pg.ts' +export { mySql, mysqlClient } from './mysql.ts' export type Sql = string export type Email = string diff --git a/deno-client/mysql.ts b/deno-client/mysql.ts index b27ac99dd3..ae00092f8a 100644 --- a/deno-client/mysql.ts +++ b/deno-client/mysql.ts @@ -66,6 +66,9 @@ function getQueryAdapter(template: TemplateStringsArray, args: unknown[]) { return [text, args]; } -function getRowsAdapter(rows: object[]) { +function getRowsAdapter(rows: object[] | object) { + if (!Array.isArray(rows)) { + return rows; + } return rows.map((r) => Object.values(r)) } diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 0821e7c739..a855981665 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -224,6 +224,19 @@ > PostgreSQL +

Advanced

diff --git a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte index 0515fdf212..3880cc092f 100644 --- a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte +++ b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte @@ -1,19 +1,21 @@ diff --git a/frontend/src/lib/components/flows/content/FlowInputs.svelte b/frontend/src/lib/components/flows/content/FlowInputs.svelte index 50c0935ae8..84a07a51b2 100644 --- a/frontend/src/lib/components/flows/content/FlowInputs.svelte +++ b/frontend/src/lib/components/flows/content/FlowInputs.svelte @@ -118,6 +118,13 @@ on:click={() => dispatch('new', { language: RawScript.language.DENO, kind, subkind: 'pgsql' })} /> + + + dispatch('new', { language: RawScript.language.DENO, kind, subkind: 'mysql' })} + /> {/if} {/if}
diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index 41d74b7466..3984260288 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -148,6 +148,23 @@ export async function main( return query.rows; }` +export const MYSQL_INIT_CODE = `import { + mySql + type Resource, +} from "https://deno.land/x/windmill@v${__pkg__.version}/mod.ts"; + +// MySQL parameterized statement. No SQL injection is possible. +export async function main( + db: Resource<"mysql">, + key: number, + value: string, +) { + const query = await mySql( + db + )\`INSERT INTO demo VALUES (\${key}, \${value})\`; + return query.rows; +}`; + export const BASH_INIT_CODE = ` # arguments of the form X="$I" are parsed as parameters X of type string msg="$1" @@ -235,7 +252,7 @@ export function isInitialCode(content: string): boolean { return false } -export function initialCode(language: 'deno' | 'python3' | 'go' | 'bash', kind: Script.kind, subkind: 'pgsql' | 'flow' | 'script' | undefined): string { +export function initialCode(language: 'deno' | 'python3' | 'go' | 'bash', kind: Script.kind, subkind: 'pgsql' | 'mysql' | 'flow' | 'script' | undefined): string { if (language === 'deno') { if (kind === 'trigger') { return DENO_INIT_CODE_TRIGGER @@ -245,6 +262,9 @@ export function initialCode(language: 'deno' | 'python3' | 'go' | 'bash', kind: } else if (subkind === 'pgsql') { return POSTGRES_INIT_CODE + } + else if (subkind === 'mysql') { + return MYSQL_INIT_CODE } else { return DENO_INIT_CODE }