From 947782f4da2031931336671fbf97b6158ec91754 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Thu, 27 Mar 2025 15:20:29 +0700 Subject: [PATCH 01/11] Add durable object instruction using browsable durable object package --- .../local/new-base/durable-object/page.tsx | 60 +++++++++++++ src/app/(outerbase)/new-resource-button.tsx | 85 +++++-------------- src/app/(outerbase)/new-resource-list.tsx | 53 +++--------- 3 files changed, 95 insertions(+), 103 deletions(-) create mode 100644 src/app/(outerbase)/local/new-base/durable-object/page.tsx diff --git a/src/app/(outerbase)/local/new-base/durable-object/page.tsx b/src/app/(outerbase)/local/new-base/durable-object/page.tsx new file mode 100644 index 00000000..bdd5f746 --- /dev/null +++ b/src/app/(outerbase)/local/new-base/durable-object/page.tsx @@ -0,0 +1,60 @@ +"use client"; +import { Button } from "@/components/orbit/button"; +import { ArrowLeft } from "@phosphor-icons/react"; + +export default function DurableObjectInstructPage() { + const highlightClassName = + "bg-green-200 px-2 py-0.5 font-bold dark:bg-green-800 dark:text-white"; + + return ( +
+
+ +
+ +
+

Browsable Durable Object

+ +

+ Since Durable Objects aren't accessible outside of a Worker, + Outerbase Studio can't connect to them directly. However, we + offer a decorator you can attach to your Worker to expose the Studio + interface. +

+ +

Please follow the code instructions below:

+ +
+          
{`import { Browsable, studio } from "@outerbase/browsable-durable-object";`}
+
+
{`@Browsable()`}
+
{`export class MyDurableObject extends DurableObject {}`}
+
+
{`export default {`}
+
{` async fetch(request, env, ctx): Promise {`}
+
{` const url = new URL(request.url);`}
+
{` if (url.pathname === '/__studio') {`}
+
{` return await studio(request, env.MY_DURABLE_OBJECT, {`}
+
{` basicAuth: { username: 'admin', password: 'password' }`}
+
{` });`}
+
{` }`}
+
{` // your other code ...`}
+
{`} satisfies ExportedHandler;`}
+
+
+
+ ); +} diff --git a/src/app/(outerbase)/new-resource-button.tsx b/src/app/(outerbase)/new-resource-button.tsx index 9fa55887..c49e4e9f 100644 --- a/src/app/(outerbase)/new-resource-button.tsx +++ b/src/app/(outerbase)/new-resource-button.tsx @@ -20,11 +20,10 @@ function CreateResourceItem({
- + {data.name} {data.comingSoon && ( @@ -41,11 +40,10 @@ function CreateResourceItem({ href={data.href} className={cn( "hover:bg-secondary flex w-full cursor-pointer items-center justify-start rounded p-2 text-base", - { "bg-secondary": selected }, - data.colorClassName + { "bg-secondary": selected } )} > - + {data.name} ); @@ -57,7 +55,7 @@ export interface NewResourceType { href: string; comingSoon?: boolean; colorClassName?: string; - thirdParty?: boolean; + cloudflare?: boolean; } interface NewResourceProps { onCreateBoard?: () => void; @@ -77,6 +75,8 @@ export default function NewResourceType({ const [search, setSearch] = useState(""); const [open, setOpen] = useState(false); + const cloudflare = resourceTypeList.filter((resource) => resource.cloudflare); + const allResourceType = ( <>
@@ -90,72 +90,33 @@ export default function NewResourceType({
Multiple source dashboard
- - {/* */}

Bring your existing databases

-
-
- {resourceTypeList - .filter((resource) => !resource.thirdParty) - .filter((_, idx) => idx % 2 === 0) - .map((resource) => ( - - ))} -
- -
- {resourceTypeList - .filter((resource) => !resource.thirdParty) - .filter((_, idx) => idx % 2 === 1) - .map((resource) => ( - - ))} -
+
+ {resourceTypeList + .filter((resource) => !resource.cloudflare) + .map((resource) => ( + + ))}
-

- Third party integrations -

- -
-
- {resourceTypeList - .filter((resource) => !!resource.thirdParty) - .filter((_, idx) => idx % 2 === 0) - .map((resource) => ( - - ))} -
+ {cloudflare.length > 0 && ( + <> +
+ CLOUDFLARE +
-
- {resourceTypeList - .filter((resource) => !!resource.thirdParty) - .filter((_, idx) => idx % 2 === 1) - .map((resource) => ( +
+ {cloudflare.map((resource) => ( ))} -
-
- - {/*

Or use connection string

-
- } - placeholder="postgres://testing" - /> -
*/} +
+ + )} ); diff --git a/src/app/(outerbase)/new-resource-list.tsx b/src/app/(outerbase)/new-resource-list.tsx index 34fb151b..86709980 100644 --- a/src/app/(outerbase)/new-resource-list.tsx +++ b/src/app/(outerbase)/new-resource-list.tsx @@ -5,11 +5,8 @@ import { } from "@/components/icons/outerbase-icon"; import { CloudflareIcon, - DigitalOceanIcon, - NeonIcon, RQLiteIcon, StarbaseIcon, - SupabaseIcon, TursoIcon, ValTownIcon, } from "@/components/resource-card/icon"; @@ -20,35 +17,25 @@ export function getCreateResourceTypeList( ): NewResourceType[] { return [ { - name: "Supabase", - icon: SupabaseIcon, - href: workspaceId ? "" : "", - comingSoon: true, - thirdParty: true, - }, - { - name: "Cloudflare", + name: "Cloudflare D1", icon: CloudflareIcon, - href: workspaceId ? "" : "", - thirdParty: true, - comingSoon: true, + href: workspaceId ? "" : "/local/new-base/cloudflare-d1", + colorClassName: "text-orange-500", + cloudflare: true, }, { - name: "Cloudflare (Manual)", + name: "Durable Object", icon: CloudflareIcon, - href: workspaceId ? "" : "/local/new-base/cloudflare-d1", + href: workspaceId ? "" : "/local/new-base/durable-object", + colorClassName: "text-orange-500", + cloudflare: true, }, { name: "Worker Analytics Engine", icon: CloudflareIcon, + colorClassName: "text-orange-500", href: workspaceId ? "" : "/local/new-base/cloudflare-wae", - }, - { - name: "Neon", - icon: NeonIcon, - href: workspaceId ? "" : "", - comingSoon: true, - thirdParty: true, + cloudflare: true, }, { name: "StarbaseDB", @@ -58,26 +45,10 @@ export function getCreateResourceTypeList( : "/local/new-base/starbase", }, { - name: "Turso/LibSQL (Manual)", + name: "Turso/LibSQL", icon: TursoIcon, href: workspaceId ? "" : "/local/new-base/turso", }, - { - name: "Turso", - icon: TursoIcon, - thirdParty: true, - comingSoon: true, - href: workspaceId - ? `/w/${workspaceId}/new-base/turso` - : "/local/new-base/turso", - }, - { - name: "DigitalOcean", - icon: DigitalOceanIcon, - comingSoon: true, - href: workspaceId ? "" : "", - thirdParty: true, - }, { name: "Postgres", icon: PostgreIcon, @@ -107,5 +78,5 @@ export function getCreateResourceTypeList( icon: RQLiteIcon, href: workspaceId ? "" : "/local/new-base/rqlite", }, - ].filter((resource) => resource.href || resource.comingSoon); + ].filter((resource) => resource.href); } From 2218ff76862e15664981938a560c9b53891c9bfe Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Fri, 28 Mar 2025 00:07:33 +0700 Subject: [PATCH 02/11] remove vercel analytics --- package-lock.json | 39 --------------------------------------- package.json | 1 - 2 files changed, 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index 311959b8..de486ac2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,6 @@ "@uiw/codemirror-extensions-langs": "^4.21.24", "@uiw/codemirror-themes": "^4.21.21", "@uiw/react-codemirror": "^4.21.21", - "@vercel/analytics": "^1.3.1", "@xyflow/react": "^12.3.6", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", @@ -16291,44 +16290,6 @@ "win32" ] }, - "node_modules/@vercel/analytics": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz", - "integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==", - "license": "MPL-2.0", - "peerDependencies": { - "@remix-run/react": "^2", - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@remix-run/react": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-router": { - "optional": true - } - } - }, "node_modules/@xyflow/react": { "version": "12.4.4", "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.4.4.tgz", diff --git a/package.json b/package.json index c15cce1d..114266a8 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,6 @@ "@uiw/codemirror-extensions-langs": "^4.21.24", "@uiw/codemirror-themes": "^4.21.21", "@uiw/react-codemirror": "^4.21.21", - "@vercel/analytics": "^1.3.1", "@xyflow/react": "^12.3.6", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", From 6b6fa5b11d10931bc78982da9fa004c0d1c5fc4c Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Fri, 28 Mar 2025 00:16:32 +0700 Subject: [PATCH 03/11] clean up unused code --- drizzle/0000_solid_scream.sql | 27 - drizzle/0001_crazy_eternals.sql | 1 - drizzle/0002_aspiring_shotgun.sql | 57 -- drizzle/0003_dashing_marauders.sql | 2 - drizzle/0004_misty_the_professor.sql | 1 - drizzle/0005_fine_turbo.sql | 12 - drizzle/0006_whole_tomorrow_man.sql | 2 - drizzle/0008_supreme_whistler.sql | 8 - drizzle/0009_peaceful_caretaker.sql | 11 - drizzle/0010_mature_sumo.sql | 27 - drizzle/0011_brief_nick_fury.sql | 1 - drizzle/0012_wealthy_betty_ross.sql | 2 - drizzle/meta/0000_snapshot.json | 179 ----- drizzle/meta/0001_snapshot.json | 186 ----- drizzle/meta/0002_snapshot.json | 609 --------------- drizzle/meta/0003_snapshot.json | 637 --------------- drizzle/meta/0004_snapshot.json | 644 ---------------- drizzle/meta/0005_snapshot.json | 719 ----------------- drizzle/meta/0006_snapshot.json | 733 ------------------ drizzle/meta/0008_snapshot.json | 784 ------------------- drizzle/meta/0009_snapshot.json | 864 --------------------- drizzle/meta/0010_snapshot.json | 1057 ------------------------- drizzle/meta/0011_snapshot.json | 1064 -------------------------- drizzle/meta/0012_snapshot.json | 943 ----------------------- drizzle/meta/_journal.json | 90 --- src/lib/api-error.ts | 17 - src/lib/api-response-types.ts | 40 - src/lib/encryption-edge.ts | 69 -- src/lib/encryption.test.ts | 8 - src/lib/hash-edge.ts | 29 - src/lib/internal-pubsub.ts | 30 - src/lib/utils.ts | 73 -- src/lib/with-error-handler.ts | 42 - 33 files changed, 8968 deletions(-) delete mode 100644 drizzle/0000_solid_scream.sql delete mode 100644 drizzle/0001_crazy_eternals.sql delete mode 100644 drizzle/0002_aspiring_shotgun.sql delete mode 100644 drizzle/0003_dashing_marauders.sql delete mode 100644 drizzle/0004_misty_the_professor.sql delete mode 100644 drizzle/0005_fine_turbo.sql delete mode 100644 drizzle/0006_whole_tomorrow_man.sql delete mode 100644 drizzle/0008_supreme_whistler.sql delete mode 100644 drizzle/0009_peaceful_caretaker.sql delete mode 100644 drizzle/0010_mature_sumo.sql delete mode 100644 drizzle/0011_brief_nick_fury.sql delete mode 100644 drizzle/0012_wealthy_betty_ross.sql delete mode 100644 drizzle/meta/0000_snapshot.json delete mode 100644 drizzle/meta/0001_snapshot.json delete mode 100644 drizzle/meta/0002_snapshot.json delete mode 100644 drizzle/meta/0003_snapshot.json delete mode 100644 drizzle/meta/0004_snapshot.json delete mode 100644 drizzle/meta/0005_snapshot.json delete mode 100644 drizzle/meta/0006_snapshot.json delete mode 100644 drizzle/meta/0008_snapshot.json delete mode 100644 drizzle/meta/0009_snapshot.json delete mode 100644 drizzle/meta/0010_snapshot.json delete mode 100644 drizzle/meta/0011_snapshot.json delete mode 100644 drizzle/meta/0012_snapshot.json delete mode 100644 drizzle/meta/_journal.json delete mode 100644 src/lib/api-error.ts delete mode 100644 src/lib/api-response-types.ts delete mode 100644 src/lib/encryption-edge.ts delete mode 100644 src/lib/encryption.test.ts delete mode 100644 src/lib/hash-edge.ts delete mode 100644 src/lib/internal-pubsub.ts delete mode 100644 src/lib/with-error-handler.ts diff --git a/drizzle/0000_solid_scream.sql b/drizzle/0000_solid_scream.sql deleted file mode 100644 index 39e81139..00000000 --- a/drizzle/0000_solid_scream.sql +++ /dev/null @@ -1,27 +0,0 @@ -CREATE TABLE `user` ( - `id` text PRIMARY KEY NOT NULL, - `name` text, - `picture` text, - `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL -); ---> statement-breakpoint -CREATE TABLE `user_auth` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text, - `provider` text, - `provider_id` text, - `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL -); ---> statement-breakpoint -CREATE TABLE `user_session` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text NOT NULL, - `auth_id` text, - `user_agent` text, - `expires_at` blob NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE UNIQUE INDEX `user_auth_provider_provider_id_unique` ON `user_auth` (`provider`,`provider_id`);--> statement-breakpoint -CREATE INDEX `user_session_expire_idx` ON `user_session` (`expires_at`);--> statement-breakpoint -CREATE INDEX `user_session_auth_id_idx` ON `user_session` (`auth_id`); \ No newline at end of file diff --git a/drizzle/0001_crazy_eternals.sql b/drizzle/0001_crazy_eternals.sql deleted file mode 100644 index 6127014f..00000000 --- a/drizzle/0001_crazy_eternals.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE user ADD `email` text; \ No newline at end of file diff --git a/drizzle/0002_aspiring_shotgun.sql b/drizzle/0002_aspiring_shotgun.sql deleted file mode 100644 index a492a5b0..00000000 --- a/drizzle/0002_aspiring_shotgun.sql +++ /dev/null @@ -1,57 +0,0 @@ -CREATE TABLE `database` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text NOT NULL, - `name` text, - `description` text, - `color` text DEFAULT 'gray', - `driver` text DEFAULT 'turso', - `host` text, - `token` text, - `created_at` integer, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `database_role` ( - `id` text PRIMARY KEY NOT NULL, - `database_id` text NOT NULL, - `name` text, - `can_execute_query` integer DEFAULT 0, - `created_by` text, - `created_at` integer, - `updated_by` text, - `updated_at` integer, - FOREIGN KEY (`database_id`) REFERENCES `database`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`created_by`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`updated_by`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `database_role_permission` ( - `id` text PRIMARY KEY NOT NULL, - `role_id` text NOT NULL, - `role` text, - `access` text, - `table_name` text, - `column_name` text, - `created_by` text, - `created_at` integer, - `updated_by` text, - `updated_at` integer, - FOREIGN KEY (`role_id`) REFERENCES `database_role`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`created_by`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`updated_by`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `database_user_role` ( - `user_id` text, - `database_id` text, - `role_id` text, - `created_at` integer, - PRIMARY KEY(`database_id`, `user_id`), - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`database_id`) REFERENCES `database`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`role_id`) REFERENCES `database_role`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE INDEX `database_user_idx` ON `database` (`user_id`);--> statement-breakpoint -CREATE INDEX `database_role_idx` ON `database_role` (`database_id`);--> statement-breakpoint -CREATE INDEX `role_permission_table_idx` ON `database_role_permission` (`role_id`,`table_name`); \ No newline at end of file diff --git a/drizzle/0003_dashing_marauders.sql b/drizzle/0003_dashing_marauders.sql deleted file mode 100644 index c0ac2c48..00000000 --- a/drizzle/0003_dashing_marauders.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE database_role ADD `is_owner` integer DEFAULT 0;--> statement-breakpoint -ALTER TABLE database_user_role ADD `created_by` text REFERENCES user(id); diff --git a/drizzle/0004_misty_the_professor.sql b/drizzle/0004_misty_the_professor.sql deleted file mode 100644 index 7a0c04ef..00000000 --- a/drizzle/0004_misty_the_professor.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE database ADD `deleted_at` integer; \ No newline at end of file diff --git a/drizzle/0005_fine_turbo.sql b/drizzle/0005_fine_turbo.sql deleted file mode 100644 index 9e771c75..00000000 --- a/drizzle/0005_fine_turbo.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE `user_file` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text, - `hashed` text, - `path` text, - `filename` text, - `size_in_byte` integer, - `created_at` integer -); ---> statement-breakpoint -ALTER TABLE user ADD `storage_usage` integer DEFAULT 0;--> statement-breakpoint -CREATE INDEX `user_file_index` ON `user_file` (`user_id`,`created_at`); \ No newline at end of file diff --git a/drizzle/0006_whole_tomorrow_man.sql b/drizzle/0006_whole_tomorrow_man.sql deleted file mode 100644 index dca7041b..00000000 --- a/drizzle/0006_whole_tomorrow_man.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE database ADD `username` text;--> statement-breakpoint -ALTER TABLE database ADD `password` text; \ No newline at end of file diff --git a/drizzle/0008_supreme_whistler.sql b/drizzle/0008_supreme_whistler.sql deleted file mode 100644 index d850d331..00000000 --- a/drizzle/0008_supreme_whistler.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE `temp_session` ( - `id` text PRIMARY KEY NOT NULL, - `driver` text, - `name` text, - `credential` text, - `exired_at` integer, - `created_at` integer -); diff --git a/drizzle/0009_peaceful_caretaker.sql b/drizzle/0009_peaceful_caretaker.sql deleted file mode 100644 index b73c2959..00000000 --- a/drizzle/0009_peaceful_caretaker.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE `dataset` ( - `id` text PRIMARY KEY NOT NULL, - `user_id` text, - `name` text, - `source` text, - `summary` text, - `description` text, - `used` integer DEFAULT 0, - `created_at` integer, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); diff --git a/drizzle/0010_mature_sumo.sql b/drizzle/0010_mature_sumo.sql deleted file mode 100644 index e8f4577f..00000000 --- a/drizzle/0010_mature_sumo.sql +++ /dev/null @@ -1,27 +0,0 @@ -CREATE TABLE `doc` ( - `id` text PRIMARY KEY NOT NULL, - `namespace_id` text, - `user_id` text, - `name` text, - `type` text, - `content` text, - `last_used_at` integer, - `updated_at` integer, - `created_at` integer, - FOREIGN KEY (`namespace_id`) REFERENCES `doc_namespace`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `doc_namespace` ( - `id` text PRIMARY KEY NOT NULL, - `database_id` text, - `user_id` text, - `name` text, - `updated_at` integer, - `created_at` integer, - FOREIGN KEY (`database_id`) REFERENCES `database`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE INDEX `doc_namespace_idx` ON `doc` (`namespace_id`);--> statement-breakpoint -CREATE INDEX `doc_namespace_database_idx` ON `doc_namespace` (`database_id`); \ No newline at end of file diff --git a/drizzle/0011_brief_nick_fury.sql b/drizzle/0011_brief_nick_fury.sql deleted file mode 100644 index e4315935..00000000 --- a/drizzle/0011_brief_nick_fury.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE database ADD `database_name` text; \ No newline at end of file diff --git a/drizzle/0012_wealthy_betty_ross.sql b/drizzle/0012_wealthy_betty_ross.sql deleted file mode 100644 index ea7cd9e9..00000000 --- a/drizzle/0012_wealthy_betty_ross.sql +++ /dev/null @@ -1,2 +0,0 @@ -DROP TABLE `database_role_permission`;--> statement-breakpoint -ALTER TABLE database_role ADD `permissions` text; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json deleted file mode 100644 index 54d5ecba..00000000 --- a/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "842060cb-8a3f-4721-aeb8-909365440ca3", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json deleted file mode 100644 index f220ab07..00000000 --- a/drizzle/meta/0001_snapshot.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "1752cbef-1ce6-4863-bcef-5ffad31ac535", - "prevId": "842060cb-8a3f-4721-aeb8-909365440ca3", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json deleted file mode 100644 index f0ae05dc..00000000 --- a/drizzle/meta/0002_snapshot.json +++ /dev/null @@ -1,609 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "cf834c86-c51e-49d6-bf35-4c649ddef18c", - "prevId": "1752cbef-1ce6-4863-bcef-5ffad31ac535", - "tables": { - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json deleted file mode 100644 index 4adc4189..00000000 --- a/drizzle/meta/0003_snapshot.json +++ /dev/null @@ -1,637 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "94f4b68a-4b33-4572-b51e-ab70c5da8f05", - "prevId": "cf834c86-c51e-49d6-bf35-4c649ddef18c", - "tables": { - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json deleted file mode 100644 index dcd27a9a..00000000 --- a/drizzle/meta/0004_snapshot.json +++ /dev/null @@ -1,644 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "da88f65b-8df2-40d8-b7c8-33ffb65a7d2c", - "prevId": "94f4b68a-4b33-4572-b51e-ab70c5da8f05", - "tables": { - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json deleted file mode 100644 index 763e6f5d..00000000 --- a/drizzle/meta/0005_snapshot.json +++ /dev/null @@ -1,719 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "d1ecb245-422d-4b5e-8dbc-a78735dd43dd", - "prevId": "da88f65b-8df2-40d8-b7c8-33ffb65a7d2c", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0006_snapshot.json b/drizzle/meta/0006_snapshot.json deleted file mode 100644 index 70a4db5c..00000000 --- a/drizzle/meta/0006_snapshot.json +++ /dev/null @@ -1,733 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "09d8a307-e0f5-49eb-9c02-36b0c5fed689", - "prevId": "d1ecb245-422d-4b5e-8dbc-a78735dd43dd", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0008_snapshot.json b/drizzle/meta/0008_snapshot.json deleted file mode 100644 index 8bbd87fe..00000000 --- a/drizzle/meta/0008_snapshot.json +++ /dev/null @@ -1,784 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "f8de4a11-8edf-4154-abcf-89b84db4ab55", - "prevId": "09d8a307-e0f5-49eb-9c02-36b0c5fed689", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "temp_session": { - "name": "temp_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "credential": { - "name": "credential", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "exired_at": { - "name": "exired_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0009_snapshot.json b/drizzle/meta/0009_snapshot.json deleted file mode 100644 index 7e5547af..00000000 --- a/drizzle/meta/0009_snapshot.json +++ /dev/null @@ -1,864 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "286d1379-384e-4492-8b44-8ecaf4810fa8", - "prevId": "f8de4a11-8edf-4154-abcf-89b84db4ab55", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "dataset": { - "name": "dataset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "source": { - "name": "source", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "summary": { - "name": "summary", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "used": { - "name": "used", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "dataset_user_id_user_id_fk": { - "name": "dataset_user_id_user_id_fk", - "tableFrom": "dataset", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "temp_session": { - "name": "temp_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "credential": { - "name": "credential", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "exired_at": { - "name": "exired_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0010_snapshot.json b/drizzle/meta/0010_snapshot.json deleted file mode 100644 index 59e40a18..00000000 --- a/drizzle/meta/0010_snapshot.json +++ /dev/null @@ -1,1057 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "85ccba53-a7fa-480a-b0e9-2716a61dbc74", - "prevId": "286d1379-384e-4492-8b44-8ecaf4810fa8", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "dataset": { - "name": "dataset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "source": { - "name": "source", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "summary": { - "name": "summary", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "used": { - "name": "used", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "dataset_user_id_user_id_fk": { - "name": "dataset_user_id_user_id_fk", - "tableFrom": "dataset", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "temp_session": { - "name": "temp_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "credential": { - "name": "credential", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "exired_at": { - "name": "exired_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc": { - "name": "doc", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "namespace_id": { - "name": "namespace_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "last_used_at": { - "name": "last_used_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_idx": { - "name": "doc_namespace_idx", - "columns": [ - "namespace_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_id_doc_namespace_id_fk": { - "name": "doc_namespace_id_doc_namespace_id_fk", - "tableFrom": "doc", - "tableTo": "doc_namespace", - "columnsFrom": [ - "namespace_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_user_id_user_id_fk": { - "name": "doc_user_id_user_id_fk", - "tableFrom": "doc", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc_namespace": { - "name": "doc_namespace", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_database_idx": { - "name": "doc_namespace_database_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_database_id_database_id_fk": { - "name": "doc_namespace_database_id_database_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_namespace_user_id_user_id_fk": { - "name": "doc_namespace_user_id_user_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0011_snapshot.json b/drizzle/meta/0011_snapshot.json deleted file mode 100644 index 88d0c8fd..00000000 --- a/drizzle/meta/0011_snapshot.json +++ /dev/null @@ -1,1064 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "270b8ac4-367a-427c-a238-a5fbb58ed6d8", - "prevId": "85ccba53-a7fa-480a-b0e9-2716a61dbc74", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_name": { - "name": "database_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role_permission": { - "name": "database_role_permission", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access": { - "name": "access", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "table_name": { - "name": "table_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "column_name": { - "name": "column_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "role_permission_table_idx": { - "name": "role_permission_table_idx", - "columns": [ - "role_id", - "table_name" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_permission_role_id_database_role_id_fk": { - "name": "database_role_permission_role_id_database_role_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_created_by_user_id_fk": { - "name": "database_role_permission_created_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_permission_updated_by_user_id_fk": { - "name": "database_role_permission_updated_by_user_id_fk", - "tableFrom": "database_role_permission", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "dataset": { - "name": "dataset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "source": { - "name": "source", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "summary": { - "name": "summary", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "used": { - "name": "used", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "dataset_user_id_user_id_fk": { - "name": "dataset_user_id_user_id_fk", - "tableFrom": "dataset", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "temp_session": { - "name": "temp_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "credential": { - "name": "credential", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "exired_at": { - "name": "exired_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc": { - "name": "doc", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "namespace_id": { - "name": "namespace_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "last_used_at": { - "name": "last_used_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_idx": { - "name": "doc_namespace_idx", - "columns": [ - "namespace_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_id_doc_namespace_id_fk": { - "name": "doc_namespace_id_doc_namespace_id_fk", - "tableFrom": "doc", - "tableTo": "doc_namespace", - "columnsFrom": [ - "namespace_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_user_id_user_id_fk": { - "name": "doc_user_id_user_id_fk", - "tableFrom": "doc", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc_namespace": { - "name": "doc_namespace", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_database_idx": { - "name": "doc_namespace_database_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_database_id_database_id_fk": { - "name": "doc_namespace_database_id_database_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_namespace_user_id_user_id_fk": { - "name": "doc_namespace_user_id_user_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/drizzle/meta/0012_snapshot.json b/drizzle/meta/0012_snapshot.json deleted file mode 100644 index 697e1dc6..00000000 --- a/drizzle/meta/0012_snapshot.json +++ /dev/null @@ -1,943 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "b9fa9ef2-249a-4656-9e95-6c4344e22371", - "prevId": "270b8ac4-367a-427c-a238-a5fbb58ed6d8", - "tables": { - "user": { - "name": "user", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "picture": { - "name": "picture", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "storage_usage": { - "name": "storage_usage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_file": { - "name": "user_file", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "hashed": { - "name": "hashed", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "path": { - "name": "path", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "filename": { - "name": "filename", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "size_in_byte": { - "name": "size_in_byte", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_file_index": { - "name": "user_file_index", - "columns": [ - "user_id", - "created_at" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_auth": { - "name": "user_auth", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - } - }, - "indexes": { - "user_auth_provider_provider_id_unique": { - "name": "user_auth_provider_provider_id_unique", - "columns": [ - "provider", - "provider_id" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user_session": { - "name": "user_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "auth_id": { - "name": "auth_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "blob", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "user_session_expire_idx": { - "name": "user_session_expire_idx", - "columns": [ - "expires_at" - ], - "isUnique": false - }, - "user_session_auth_id_idx": { - "name": "user_session_auth_id_idx", - "columns": [ - "auth_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "user_session_user_id_user_id_fk": { - "name": "user_session_user_id_user_id_fk", - "tableFrom": "user_session", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database": { - "name": "database", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'gray'" - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'turso'" - }, - "host": { - "name": "host", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_name": { - "name": "database_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_user_idx": { - "name": "database_user_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_user_id_user_id_fk": { - "name": "database_user_id_user_id_fk", - "tableFrom": "database", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_role": { - "name": "database_role", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_execute_query": { - "name": "can_execute_query", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "is_owner": { - "name": "is_owner", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "permissions": { - "name": "permissions", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_by": { - "name": "updated_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "database_role_idx": { - "name": "database_role_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "database_role_database_id_database_id_fk": { - "name": "database_role_database_id_database_id_fk", - "tableFrom": "database_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_created_by_user_id_fk": { - "name": "database_role_created_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_role_updated_by_user_id_fk": { - "name": "database_role_updated_by_user_id_fk", - "tableFrom": "database_role", - "tableTo": "user", - "columnsFrom": [ - "updated_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "database_user_role": { - "name": "database_user_role", - "columns": { - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_by": { - "name": "created_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "database_user_role_user_id_user_id_fk": { - "name": "database_user_role_user_id_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_database_id_database_id_fk": { - "name": "database_user_role_database_id_database_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_role_id_database_role_id_fk": { - "name": "database_user_role_role_id_database_role_id_fk", - "tableFrom": "database_user_role", - "tableTo": "database_role", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "database_user_role_created_by_user_id_fk": { - "name": "database_user_role_created_by_user_id_fk", - "tableFrom": "database_user_role", - "tableTo": "user", - "columnsFrom": [ - "created_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "database_user_role_database_id_user_id_pk": { - "columns": [ - "database_id", - "user_id" - ], - "name": "database_user_role_database_id_user_id_pk" - } - }, - "uniqueConstraints": {} - }, - "dataset": { - "name": "dataset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "source": { - "name": "source", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "summary": { - "name": "summary", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "used": { - "name": "used", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "dataset_user_id_user_id_fk": { - "name": "dataset_user_id_user_id_fk", - "tableFrom": "dataset", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "temp_session": { - "name": "temp_session", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "driver": { - "name": "driver", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "credential": { - "name": "credential", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "exired_at": { - "name": "exired_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc": { - "name": "doc", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "namespace_id": { - "name": "namespace_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "last_used_at": { - "name": "last_used_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_idx": { - "name": "doc_namespace_idx", - "columns": [ - "namespace_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_id_doc_namespace_id_fk": { - "name": "doc_namespace_id_doc_namespace_id_fk", - "tableFrom": "doc", - "tableTo": "doc_namespace", - "columnsFrom": [ - "namespace_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_user_id_user_id_fk": { - "name": "doc_user_id_user_id_fk", - "tableFrom": "doc", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "doc_namespace": { - "name": "doc_namespace", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "database_id": { - "name": "database_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "doc_namespace_database_idx": { - "name": "doc_namespace_database_idx", - "columns": [ - "database_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "doc_namespace_database_id_database_id_fk": { - "name": "doc_namespace_database_id_database_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "database", - "columnsFrom": [ - "database_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "doc_namespace_user_id_user_id_fk": { - "name": "doc_namespace_user_id_user_id_fk", - "tableFrom": "doc_namespace", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } - } \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json deleted file mode 100644 index 05a3737d..00000000 --- a/drizzle/meta/_journal.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1710049140295, - "tag": "0000_solid_scream", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1710401496821, - "tag": "0001_crazy_eternals", - "breakpoints": true - }, - { - "idx": 2, - "version": "5", - "when": 1710657831363, - "tag": "0002_aspiring_shotgun", - "breakpoints": true - }, - { - "idx": 3, - "version": "5", - "when": 1710679360281, - "tag": "0003_dashing_marauders", - "breakpoints": true - }, - { - "idx": 4, - "version": "5", - "when": 1710766406033, - "tag": "0004_misty_the_professor", - "breakpoints": true - }, - { - "idx": 5, - "version": "5", - "when": 1710906389797, - "tag": "0005_fine_turbo", - "breakpoints": true - }, - { - "idx": 6, - "version": "5", - "when": 1711462162993, - "tag": "0006_whole_tomorrow_man", - "breakpoints": true - }, - { - "idx": 8, - "version": "5", - "when": 1719458125825, - "tag": "0008_supreme_whistler", - "breakpoints": true - }, - { - "idx": 9, - "version": "5", - "when": 1719811287506, - "tag": "0009_peaceful_caretaker", - "breakpoints": true - }, - { - "idx": 10, - "version": "5", - "when": 1720357960659, - "tag": "0010_mature_sumo", - "breakpoints": true - }, - { - "idx": 11, - "version": "5", - "when": 1721439112769, - "tag": "0011_brief_nick_fury", - "breakpoints": true - }, - { - "idx": 12, - "version": "5", - "when": 1723099258318, - "tag": "0012_wealthy_betty_ross", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/src/lib/api-error.ts b/src/lib/api-error.ts deleted file mode 100644 index cb38aa3b..00000000 --- a/src/lib/api-error.ts +++ /dev/null @@ -1,17 +0,0 @@ -interface ApiErrorConstructor { - message: string; - status: number; - detailedMessage?: string; -} - -export class ApiError extends Error { - detailedMessage?: string; - status: number; - - constructor({ message, status, detailedMessage }: ApiErrorConstructor) { - super(message); - this.name = "ApiError"; - this.status = status; - this.detailedMessage = detailedMessage; - } -} diff --git a/src/lib/api-response-types.ts b/src/lib/api-response-types.ts deleted file mode 100644 index 26083628..00000000 --- a/src/lib/api-response-types.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { SavedConnectionItem } from "@/app/(theme)/connect/saved-connection-storage"; -import { - DatabaseResultSet, - DatabaseSchemaItem, - DatabaseTableSchema, - DatabaseTriggerSchema, -} from "@/drivers/base-driver"; - -export interface ApiOpsBatchResponse { - error?: string; - data: DatabaseResultSet[]; -} - -export interface ApiOpsQueryResponse { - error?: string; - data: DatabaseResultSet; -} - -export interface ApiDatabasesResponse { - databases: SavedConnectionItem[]; -} - -export interface ApiDatabasesResponse { - databases: SavedConnectionItem[]; -} - -export interface ApiSchemaListResponse { - data: DatabaseSchemaItem[]; - error?: string; -} - -export interface ApiSchemaResponse { - data: DatabaseTableSchema; - error?: string; -} - -export interface ApiTriggerResponse { - data: DatabaseTriggerSchema; - error?: string; -} diff --git a/src/lib/encryption-edge.ts b/src/lib/encryption-edge.ts deleted file mode 100644 index b3147134..00000000 --- a/src/lib/encryption-edge.ts +++ /dev/null @@ -1,69 +0,0 @@ -const RANDOM_IV_LENGTH = 12; -const AUTH_TAG_SIZE = 16; - -function base64ToArrayBuffer(base64: string) { - const binaryString = atob(base64); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - return bytes; -} - -function arrayBufferToBase64(buffer: Uint8Array) { - let binary = ""; - const bytes = new Uint8Array(buffer); - const len = bytes.byteLength; - for (let i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - return btoa(binary); -} - -export async function encrypt(keyInBase64: string | undefined, text: string) { - if (!keyInBase64) throw new Error("Encryption key is not provided"); - - const iv = crypto.getRandomValues(new Uint8Array(RANDOM_IV_LENGTH)); - const encoded = new TextEncoder().encode(text); - const keyBuffer = base64ToArrayBuffer(keyInBase64); - - const key = await crypto.subtle.importKey( - "raw", - keyBuffer, - { name: "AES-GCM" }, - false, - ["encrypt"] - ); - - const c = await crypto.subtle.encrypt( - { name: "AES-GCM", iv, tagLength: AUTH_TAG_SIZE * 8 }, - key, - encoded - ); - - return arrayBufferToBase64(new Uint8Array([...iv, ...new Uint8Array(c)])); -} - -export async function decrypt(keyInBase64: string | undefined, base64: string) { - if (!keyInBase64) throw new Error("Encryption key is not provided"); - - const key = await crypto.subtle.importKey( - "raw", - base64ToArrayBuffer(keyInBase64), - { name: "AES-GCM" }, - false, - ["decrypt"] - ); - - const e = base64ToArrayBuffer(base64); - const iv = e.slice(0, RANDOM_IV_LENGTH); - const content = e.slice(RANDOM_IV_LENGTH); - - const c = await crypto.subtle.decrypt( - { name: "AES-GCM", iv, tagLength: AUTH_TAG_SIZE * 8 }, - key, - content - ); - - return new TextDecoder().decode(c); -} diff --git a/src/lib/encryption.test.ts b/src/lib/encryption.test.ts deleted file mode 100644 index ef4eec88..00000000 --- a/src/lib/encryption.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import crypto from "crypto"; -import { decrypt, encrypt } from "./encryption"; - -test("Encrypt and decrypt should reverse each other", () => { - const key = crypto.randomBytes(32); - const text = "Hello World"; - expect(decrypt(key, encrypt(key, text))).toBe(text); -}); diff --git a/src/lib/hash-edge.ts b/src/lib/hash-edge.ts deleted file mode 100644 index 1960f398..00000000 --- a/src/lib/hash-edge.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { scoped } from "./utils"; - -/** - * Generate a SHA-1 hash of a string or BufferSource using the Web Crypto API - * @param input - string or BufferSource to hash - * @returns Promise that resolves to the hashed string - */ -export const hash = async (input: string | BufferSource) => { - // Convert the input string to a Uint8Array - - const data = scoped(() => { - if (typeof input === "string") { - return new TextEncoder().encode(input); - } - return input; - }); - - const subtle = crypto.subtle; - - const hashBuffer = await subtle.digest("SHA-1", data); - - // Convert the hashBuffer to a hexadecimal string - const hashArray = Array.from(new Uint8Array(hashBuffer)); - const hashHex = hashArray - .map((b) => b.toString(16).padStart(2, "0")) - .join(""); - - return hashHex; -}; diff --git a/src/lib/internal-pubsub.ts b/src/lib/internal-pubsub.ts deleted file mode 100644 index ec50eb65..00000000 --- a/src/lib/internal-pubsub.ts +++ /dev/null @@ -1,30 +0,0 @@ -export default class InternalPubSub { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - protected listeners: Record void>> = {}; - - addListener(channel: string, callback: (obj: T) => void) { - const c = this.listeners[channel]; - if (c) { - c.push(callback); - } else { - this.listeners[channel] = [callback]; - } - } - - removeListener(channel: string, callback: (obj: T) => void) { - const c = this.listeners[channel]; - if (c) { - c.filter((c) => c !== callback); - if (c.length) { - delete this.listeners[channel]; - } - } - } - - send(channel: string, obj: T) { - const listeners = this.listeners[channel]; - if (listeners) { - listeners.forEach((callback) => callback(obj)); - } - } -} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index e66db744..b151139b 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,84 +4,11 @@ import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } - -/** - * Funny workaround to make a scoped feature - */ -export function scoped(fn: () => T): T { - return fn(); -} - -/** - * Join everything together into a string - * - * @example - * const result = concat("henlo", "-", "world") - * // "henlo-world" - */ -export function concat(...inputs: string[]) { - return inputs.join(""); -} - export interface ApiErrorResponse { message: string; detailedMessage?: string; } -/** - * Safely fetch data with a slightly typed response - * - * @example - * - * const { data, error } = await safeFetch(url) - * if (error) { - * console.log(error.message, error.detailedMessage) - * } else { - * console.log(data) // type User - * } - */ -export async function safeFetch( - url: string | URL, - init?: RequestInit -): Promise< - | { - data: Success; - error: null; - response: Response; - } - | { - data: null; - error: ApiErrorResponse; - response: Response; - } -> { - let response: Response = new Response(); - try { - response = await fetch(url, init); - if (!response.ok) { - const json = await response.json(); - return { data: null, error: json?.error || json, response }; - } else { - const data = await response.json(); - return { data, error: null, response }; - } - } catch (e) { - if (e instanceof Error) { - return { - response, - data: null, - error: { message: "Something went wrong", detailedMessage: e.message }, - }; - } - - return { - response, - data: null, - error: { message: "Unknown Error", detailedMessage: JSON.stringify(e) }, - }; - } -} - export function strippedWorkspaceName(value: string) { return value .replace( diff --git a/src/lib/with-error-handler.ts b/src/lib/with-error-handler.ts deleted file mode 100644 index b4eed82e..00000000 --- a/src/lib/with-error-handler.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { ApiError } from "./api-error"; -import { HttpStatus } from "@/constants/http-status"; - -type WithErrorHandler = (props: { - req: NextRequest; - params: T; -}) => Promise; - -export default function withErrorHandler( - handler: WithErrorHandler -) { - return async function (req: NextRequest, params: ParamsType) { - try { - return await handler({ req, params }); - } catch (e) { - // TODO: can extract this to a separate function - if (e instanceof ApiError) { - return new Response( - JSON.stringify({ - message: e.message, - detailedMessage: e.detailedMessage, - }), - { status: e.status } - ); - } - - return new Response( - JSON.stringify({ - message: "Something went wrong", - detailedMessage: e instanceof Error ? e.message : "Unknown Error", - }), - { - status: HttpStatus.INTERNAL_SERVER_ERROR, - headers: { - "Content-Type": "application/json", - }, - } - ); - } - }; -} From bc7e670edbb2fa24c79c79c3e5147356986e7118 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Fri, 28 Mar 2025 08:19:33 +0700 Subject: [PATCH 04/11] protecting undefined chart in some cases --- src/drivers/board-storage/local.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/drivers/board-storage/local.ts b/src/drivers/board-storage/local.ts index 4570f1dd..a64e9001 100644 --- a/src/drivers/board-storage/local.ts +++ b/src/drivers/board-storage/local.ts @@ -16,7 +16,15 @@ export default class LocalBoardStorage implements IBoardStorageDriver { id, }; - this.board.charts.push(data); + // Handle potentially undefined charts property + // This is a temporary fix until we can address the type inconsistency + // where charts is sometimes an array and sometimes undefined + if (Array.isArray(this.board.charts)) { + this.board.charts.push(data); + } else { + this.board.charts = [data]; + } + this.board.updated_at = now; localDb.board.put({ id: this.board.id, content: this.board }); From 61f4349ef4a41f919980f6c3dc360a3a0db188ae Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Fri, 28 Mar 2025 21:18:03 +0700 Subject: [PATCH 05/11] Rewrite the sqlite create script parser. Originally, we relied on CodeMirror's Lezer to build the AST and parsed from it. Now, we use our own tokenization approach. It produces a flat structure, and we build the parser on top of that. This gives us more flexibility for future extensions and reduces our dependency on external libraries. --- src/drivers/sqlite-base-driver.ts | 2 + .../sqlite/sql-parse-constraint.test.ts | 121 +++++ src/drivers/sqlite/sql-parse-table.test.ts | 511 +++++++----------- src/drivers/sqlite/sql-parse-table.ts | 309 ++++++----- src/drivers/sqlite/sql-parse-trigger.test.ts | 11 +- src/drivers/sqlite/sql-parse-trigger.ts | 79 +-- src/drivers/sqlite/sql-parse-view.test.ts | 89 +++ src/drivers/sqlite/sql-parse-view.ts | 36 +- 8 files changed, 647 insertions(+), 511 deletions(-) create mode 100644 src/drivers/sqlite/sql-parse-constraint.test.ts create mode 100644 src/drivers/sqlite/sql-parse-view.test.ts diff --git a/src/drivers/sqlite-base-driver.ts b/src/drivers/sqlite-base-driver.ts index 388b8efd..23e95ea5 100644 --- a/src/drivers/sqlite-base-driver.ts +++ b/src/drivers/sqlite-base-driver.ts @@ -325,6 +325,8 @@ export class SqliteLikeBaseDriver extends CommonSQLImplement { const schema = await this.tableSchema(schemaName, tableName); let injectRowIdColumn = false; + console.log(schema); + // If there is no primary key, we will fallback to rowid. // But we need to make sure there is no rowid column if ( diff --git a/src/drivers/sqlite/sql-parse-constraint.test.ts b/src/drivers/sqlite/sql-parse-constraint.test.ts new file mode 100644 index 00000000..bfac16cd --- /dev/null +++ b/src/drivers/sqlite/sql-parse-constraint.test.ts @@ -0,0 +1,121 @@ +import type { DatabaseTableColumnConstraint } from "@/drivers/base-driver"; +import { tokenizeSql } from "@outerbase/sdk-transform"; +import { CursorV2, parseColumnConstraint } from "./sql-parse-table"; + +// Parse column constraint +function pcc(sql: string) { + return parseColumnConstraint( + "main", + new CursorV2(tokenizeSql(sql, "sqlite")) + ); +} + +describe("parse column constraint", () => { + test("constraint this_is_primary_key primary key autoincrement", () => { + expect( + pcc("constraint this_is_primary_key primary key autoincrement") + ).toEqual({ + name: "this_is_primary_key", + primaryKey: true, + autoIncrement: true, + } as DatabaseTableColumnConstraint); + }); + test("primary key with multiple columns", () => { + expect(pcc("primary key(first_name, last_name)")).toEqual({ + primaryKey: true, + autoIncrement: false, + primaryColumns: ["first_name", "last_name"], + } as DatabaseTableColumnConstraint); + }); + + test("primary key with conflict clause and not null", () => { + expect(pcc("primary key on conflict rollback not null")).toEqual({ + primaryKey: true, + autoIncrement: false, + primaryKeyConflict: "ROLLBACK", + notNull: true, + } as DatabaseTableColumnConstraint); + }); + + test("not null before primary key with conflict clause", () => { + expect(pcc("not null primary key on conflict rollback")).toEqual({ + primaryKey: true, + autoIncrement: false, + primaryKeyConflict: "ROLLBACK", + notNull: true, + } as DatabaseTableColumnConstraint); + }); + + test("unique with conflict clause", () => { + expect(pcc("unique on conflict rollback")).toEqual({ + unique: true, + uniqueConflict: "ROLLBACK", + } as DatabaseTableColumnConstraint); + }); + + test("default with string value", () => { + expect(pcc(`default 'Visal'`)).toEqual({ + defaultValue: "Visal", + } as DatabaseTableColumnConstraint); + }); + + test("default with negative number", () => { + expect(pcc(`default -5`)).toEqual({ + defaultValue: -5, + } as DatabaseTableColumnConstraint); + }); + + test("default with positive decimal", () => { + expect(pcc(`default +5.5`)).toEqual({ + defaultValue: 5.5, + } as DatabaseTableColumnConstraint); + }); + + test("default with decimal", () => { + expect(pcc(`default 5.5`)).toEqual({ + defaultValue: 5.5, + } as DatabaseTableColumnConstraint); + }); + + test("default with function", () => { + expect(pcc(`default current_timestamp`)).toEqual({ + defaultExpression: "current_timestamp", + } as DatabaseTableColumnConstraint); + }); + + test("default with expression", () => { + expect(pcc(`default (round(julianday('now')))`)).toEqual({ + defaultExpression: `round(julianday('now'))`, + } as DatabaseTableColumnConstraint); + }); + + test("foreign key with references", () => { + expect( + pcc(`foreign key ("user_id") references "users" on delete cascade ("id")`) + ).toEqual({ + foreignKey: { + foreignSchemaName: "main", + columns: ["user_id"], + foreignTableName: "users", + foreignColumns: ["id"], + }, + } as DatabaseTableColumnConstraint); + }); + + test("references shorthand", () => { + expect(pcc(`references "users" on delete cascade ("id")`)).toEqual({ + foreignKey: { + foreignSchemaName: "main", + foreignTableName: "users", + foreignColumns: ["id"], + }, + } as DatabaseTableColumnConstraint); + }); + + test("generated column", () => { + expect(pcc(`generated always as (price * qty) virtual`)).toEqual({ + generatedExpression: "price * qty", + generatedType: "VIRTUAL", + } as DatabaseTableColumnConstraint); + }); +}); diff --git a/src/drivers/sqlite/sql-parse-table.test.ts b/src/drivers/sqlite/sql-parse-table.test.ts index 11e680af..c193905c 100644 --- a/src/drivers/sqlite/sql-parse-table.test.ts +++ b/src/drivers/sqlite/sql-parse-table.test.ts @@ -1,107 +1,15 @@ -import type { - DatabaseTableColumnConstraint, - DatabaseTableSchema, -} from "@/drivers/base-driver"; -import { - buildSyntaxCursor, - parseColumnConstraint, - parseCreateTableScript, -} from "./sql-parse-table"; +import type { DatabaseTableSchema } from "@/drivers/base-driver"; +import { parseCreateTableScript } from "./sql-parse-table"; // Parse column constraint -function pcc(sql: string) { - return parseColumnConstraint("main", buildSyntaxCursor(sql)); -} function p(sql: string) { return parseCreateTableScript("main", sql); } -it("parse column constraint", () => { - expect( - pcc("constraint this_is_primary_key primary key autoincrement") - ).toEqual({ - name: "this_is_primary_key", - primaryKey: true, - autoIncrement: true, - } as DatabaseTableColumnConstraint); - - expect(pcc("primary key(first_name, last_name)")).toEqual({ - primaryKey: true, - autoIncrement: false, - primaryColumns: ["first_name", "last_name"], - } as DatabaseTableColumnConstraint); - - expect(pcc("primary key on conflict rollback not null")).toEqual({ - primaryKey: true, - autoIncrement: false, - primaryKeyConflict: "ROLLBACK", - notNull: true, - } as DatabaseTableColumnConstraint); - - expect(pcc("not null primary key on conflict rollback")).toEqual({ - primaryKey: true, - autoIncrement: false, - primaryKeyConflict: "ROLLBACK", - notNull: true, - } as DatabaseTableColumnConstraint); - - expect(pcc("unique on conflict rollback")).toEqual({ - unique: true, - uniqueConflict: "ROLLBACK", - } as DatabaseTableColumnConstraint); - - expect(pcc(`default 'Visal'`)).toEqual({ - defaultValue: "Visal", - } as DatabaseTableColumnConstraint); - - expect(pcc(`default -5`)).toEqual({ - defaultValue: -5, - } as DatabaseTableColumnConstraint); - - expect(pcc(`default +5.5`)).toEqual({ - defaultValue: 5.5, - } as DatabaseTableColumnConstraint); - - expect(pcc(`default 5.5`)).toEqual({ - defaultValue: 5.5, - } as DatabaseTableColumnConstraint); - - expect(pcc(`default current_timestamp`)).toEqual({ - defaultExpression: "current_timestamp", - } as DatabaseTableColumnConstraint); - - expect(pcc(`default (round(julianday('now'))`)).toEqual({ - defaultExpression: `(round(julianday('now'))`, - } as DatabaseTableColumnConstraint); - - expect( - pcc(`foreign key ("user_id") references "users" on delete cascade ("id")`) - ).toEqual({ - foreignKey: { - foreignSchemaName: "main", - columns: ["user_id"], - foreignTableName: "users", - foreignColumns: ["id"], - }, - } as DatabaseTableColumnConstraint); - - expect(pcc(`references "users" on delete cascade ("id")`)).toEqual({ - foreignKey: { - foreignSchemaName: "main", - foreignTableName: "users", - foreignColumns: ["id"], - }, - } as DatabaseTableColumnConstraint); - - expect(pcc(`generated always as (price * qty) virtual`)).toEqual({ - generatedExpression: "(price * qty)", - generatedType: "VIRTUAL", - } as DatabaseTableColumnConstraint); -}); - -it("parse create table", () => { - const sql = `create table "invoice_detail"( +describe("parse create table", () => { + test("parse simple create table", () => { + const sql = `create table "invoice_detail"( id integer primary key autoincrement, product_id integer references product(id), price real not null, @@ -110,62 +18,62 @@ it("parse create table", () => { total real generated always as (price * qty) virtual );`; - expect(p(sql)).toEqual({ - tableName: "invoice_detail", - pk: ["id"], - autoIncrement: true, - constraints: [], - schemaName: "main", - columns: [ - { - name: "id", - type: "integer", - pk: true, - constraint: { - primaryKey: true, - autoIncrement: true, + expect(p(sql)).toEqual({ + tableName: "invoice_detail", + pk: ["id"], + autoIncrement: true, + constraints: [], + schemaName: "main", + columns: [ + { + name: "id", + type: "integer", + pk: true, + constraint: { + primaryKey: true, + autoIncrement: true, + }, }, - }, - { - name: "product_id", - type: "integer", - constraint: { - foreignKey: { - foreignSchemaName: "main", - foreignTableName: "product", - foreignColumns: ["id"], + { + name: "product_id", + type: "integer", + constraint: { + foreignKey: { + foreignSchemaName: "main", + foreignTableName: "product", + foreignColumns: ["id"], + }, }, }, - }, - { - name: "price", - type: "real", - constraint: { - notNull: true, + { + name: "price", + type: "real", + constraint: { + notNull: true, + }, }, - }, - { - name: "qty", - type: "real", - }, - { - name: "note", - type: "varchar(255)", - }, - { - name: "total", - type: "real", - constraint: { - generatedExpression: "(price * qty)", - generatedType: "VIRTUAL", + { + name: "qty", + type: "real", }, - }, - ], - } as DatabaseTableSchema); -}); + { + name: "note", + type: "varchar(255)", + }, + { + name: "total", + type: "real", + constraint: { + generatedExpression: "price * qty", + generatedType: "VIRTUAL", + }, + }, + ], + } as DatabaseTableSchema); + }); -it("parse create table with table constraints", () => { - const sql = `create table "users"( + it("parse create table with table constraints", () => { + const sql = `create table "users"( first_name varchar, last_name varchar, category_id integer, @@ -173,117 +81,117 @@ it("parse create table with table constraints", () => { foreign key(category_id) references category(id) );`; - expect(p(sql)).toEqual({ - tableName: "users", - schemaName: "main", - pk: ["first_name", "last_name"], - autoIncrement: false, - constraints: [ - { - primaryKey: true, - autoIncrement: false, - primaryColumns: ["first_name", "last_name"], - }, - { - foreignKey: { - foreignSchemaName: "main", - columns: ["category_id"], - foreignColumns: ["id"], - foreignTableName: "category", + expect(p(sql)).toEqual({ + tableName: "users", + schemaName: "main", + pk: ["first_name", "last_name"], + autoIncrement: false, + constraints: [ + { + primaryKey: true, + autoIncrement: false, + primaryColumns: ["first_name", "last_name"], }, - }, - ], - columns: [ - { - name: "first_name", - type: "varchar", - pk: true, - }, - { - name: "last_name", - type: "varchar", - pk: true, - }, - { - name: "category_id", - type: "integer", - }, - ], - } as DatabaseTableSchema); -}); + { + foreignKey: { + foreignSchemaName: "main", + columns: ["category_id"], + foreignColumns: ["id"], + foreignTableName: "category", + }, + }, + ], + columns: [ + { + name: "first_name", + type: "varchar", + pk: true, + }, + { + name: "last_name", + type: "varchar", + pk: true, + }, + { + name: "category_id", + type: "integer", + }, + ], + } as DatabaseTableSchema); + }); -it("parse fts5 virtual table", () => { - const sql = `create virtual table name_fts using fts5(name, tokenize='trigram');`; - expect(p(sql)).toEqual({ - tableName: "name_fts", - schemaName: "main", - autoIncrement: false, - pk: [], - columns: [], - constraints: [], - fts5: {}, - } as DatabaseTableSchema); -}); + it("parse fts5 virtual table", () => { + const sql = `create virtual table name_fts using fts5(name, tokenize='trigram');`; + expect(p(sql)).toEqual({ + tableName: "name_fts", + schemaName: "main", + autoIncrement: false, + pk: [], + columns: [], + constraints: [], + fts5: {}, + } as DatabaseTableSchema); + }); -it("parse fts5 virtual table with external content", () => { - const sql = `create virtual table name_fts using fts5(name, tokenize='trigram', content='student', content_rowid='id');`; - expect(p(sql)).toEqual({ - tableName: "name_fts", - schemaName: "main", - autoIncrement: false, - pk: [], - columns: [], - constraints: [], - fts5: { - content: "'student'", - contentRowId: "'id'", - }, - } as DatabaseTableSchema); -}); + it("parse fts5 virtual table with external content", () => { + const sql = `create virtual table name_fts using fts5(name, tokenize='trigram', content='student', content_rowid='id');`; + expect(p(sql)).toEqual({ + tableName: "name_fts", + schemaName: "main", + autoIncrement: false, + pk: [], + columns: [], + constraints: [], + fts5: { + content: "'student'", + contentRowId: "'id'", + }, + } as DatabaseTableSchema); + }); -it("parse without row id", () => { - const sql = `create table students(name text) without rowid;`; - expect(p(sql)).toEqual({ - tableName: "students", - schemaName: "main", - autoIncrement: false, - pk: [], - columns: [{ name: "name", type: "text" }], - constraints: [], - withoutRowId: true, - } as DatabaseTableSchema); -}); + it("parse without row id", () => { + const sql = `create table students(name text) without rowid;`; + expect(p(sql)).toEqual({ + tableName: "students", + schemaName: "main", + autoIncrement: false, + pk: [], + columns: [{ name: "name", type: "text" }], + constraints: [], + withoutRowId: true, + } as DatabaseTableSchema); + }); -it("parse strict table", () => { - const sql = `create table students(name text) strict;`; - expect(p(sql)).toEqual({ - tableName: "students", - schemaName: "main", - autoIncrement: false, - pk: [], - columns: [{ name: "name", type: "text" }], - constraints: [], - strict: true, - } as DatabaseTableSchema); -}); + it("parse strict table", () => { + const sql = `create table students(name text) strict;`; + expect(p(sql)).toEqual({ + tableName: "students", + schemaName: "main", + autoIncrement: false, + pk: [], + columns: [{ name: "name", type: "text" }], + constraints: [], + strict: true, + } as DatabaseTableSchema); + }); -it("parse strict and without row id table", () => { - const sql = `create table students(name text) strict, without rowid;`; - expect(p(sql)).toEqual({ - tableName: "students", - schemaName: "main", - autoIncrement: false, - pk: [], - columns: [{ name: "name", type: "text" }], - constraints: [], - strict: true, - withoutRowId: true, - } as DatabaseTableSchema); -}); + it("parse strict and without row id table", () => { + const sql = `create table students(name text) strict, without rowid;`; + expect(p(sql)).toEqual({ + tableName: "students", + schemaName: "main", + autoIncrement: false, + pk: [], + columns: [{ name: "name", type: "text" }], + constraints: [], + strict: true, + withoutRowId: true, + } as DatabaseTableSchema); + }); -// Regression test for https://github.com/outerbase/studio/issues/403 -it("parse table with foreign key and default", () => { - const sql = `CREATE TABLE "suggestions"( + // Regression test for https://github.com/outerbase/studio/issues/403 + it("parse table with foreign key and default", () => { + const sql = `CREATE TABLE "suggestions"( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "entry" INTEGER NOT NULL REFERENCES "entries"("id"), "user" INTEGER NOT NULL REFERENCES "users"("id"), @@ -291,60 +199,61 @@ it("parse table with foreign key and default", () => { "updatedAt" INTEGER NOT NULL DEFAULT (UNIXEPOCH()) )`; - expect(p(sql)).toEqual({ - tableName: "suggestions", - schemaName: "main", - autoIncrement: true, - pk: ["id"], - columns: [ - { - name: "id", - type: "INTEGER", - pk: true, - constraint: { notNull: true, primaryKey: true, autoIncrement: true }, - }, - { - name: "entry", - type: "INTEGER", - constraint: { - notNull: true, - foreignKey: { - foreignSchemaName: "main", - foreignTableName: "entries", - foreignColumns: ["id"], + expect(p(sql)).toEqual({ + tableName: "suggestions", + schemaName: "main", + autoIncrement: true, + pk: ["id"], + columns: [ + { + name: "id", + type: "INTEGER", + pk: true, + constraint: { notNull: true, primaryKey: true, autoIncrement: true }, + }, + { + name: "entry", + type: "INTEGER", + constraint: { + notNull: true, + foreignKey: { + foreignSchemaName: "main", + foreignTableName: "entries", + foreignColumns: ["id"], + }, }, }, - }, - { - name: "user", - type: "INTEGER", - constraint: { - notNull: true, - foreignKey: { - foreignSchemaName: "main", - foreignTableName: "users", - foreignColumns: ["id"], + { + name: "user", + type: "INTEGER", + constraint: { + notNull: true, + foreignKey: { + foreignSchemaName: "main", + foreignTableName: "users", + foreignColumns: ["id"], + }, }, }, - }, - { - name: "scoreBy", - type: "INTEGER", - constraint: { - foreignKey: { - foreignSchemaName: "main", - foreignTableName: "users", - foreignColumns: ["id"], + { + name: "scoreBy", + type: "INTEGER", + constraint: { + foreignKey: { + foreignSchemaName: "main", + foreignTableName: "users", + foreignColumns: ["id"], + }, + defaultExpression: "NULL", }, - defaultExpression: "NULL", }, - }, - { - name: "updatedAt", - type: "INTEGER", - constraint: { notNull: true, defaultExpression: "(UNIXEPOCH())" }, - }, - ], - constraints: [], - } as DatabaseTableSchema); + { + name: "updatedAt", + type: "INTEGER", + constraint: { notNull: true, defaultExpression: "UNIXEPOCH()" }, + }, + ], + constraints: [], + } as DatabaseTableSchema); + }); }); diff --git a/src/drivers/sqlite/sql-parse-table.ts b/src/drivers/sqlite/sql-parse-table.ts index a312e553..dea4335d 100644 --- a/src/drivers/sqlite/sql-parse-table.ts +++ b/src/drivers/sqlite/sql-parse-table.ts @@ -6,125 +6,154 @@ import type { DatabaseTableSchema, SqlOrder, } from "@/drivers/base-driver"; -import { sqliteDialect } from "@/drivers/sqlite/sqlite-dialect"; -import type { SyntaxNode, TreeCursor } from "@lezer/common"; +import { Token, tokenizeSql } from "@outerbase/sdk-transform"; import { unescapeIdentity } from "./sql-helper"; -export class Cursor { - protected ptr: SyntaxNode | null; - protected sql = ""; +// This class represents a new cursor implementation for SQL parsing that operates on an array of strings +// rather than an Abstract Syntax Tree (AST). This approach is designed to reduce dependency on +// code-mirror's AST which may be subject to change, providing more stability for our parsing logic. +export class CursorV2 { + private ptr: number = 0; - constructor(ptr: TreeCursor, sql: string) { - this.ptr = ptr.node; - this.sql = sql; - } + constructor(private tokens: Token[]) { + // Trim whitespace tokens from the beginning and end + while (this.tokens.length > 0 && this.tokens[0].type === "WHITESPACE") { + this.tokens.shift(); + } - expectKeyword(keyword: string) { - const errorMessage = `Expect ${keyword} keywords, but not found`; + while ( + this.tokens.length > 0 && + this.tokens[this.tokens.length - 1].type === "WHITESPACE" + ) { + this.tokens.pop(); + } - if (!this.ptr) throw new Error(errorMessage); - if (!this.matchKeyword(keyword)) throw new Error(errorMessage); + this.tokens = tokens; + } - this.ptr = this.ptr.nextSibling; + getPointer() { + return this.ptr; } - expectKeywordOptional(keyword: string) { - if (this.ptr) { - if (this.matchKeyword(keyword)) { - this.next(); - } - } + toStringRange(start: number, end: number) { + return this.tokens + .slice(start, end) + .map((t) => t.value) + .join(""); } - expectKeywordsOptional(keywords: string[]) { - if (keywords.length === 0) return; - if (this.matchKeyword(keywords[0] ?? "")) { - this.next(); - for (const k of keywords.slice(1)) { - this.expectKeyword(k); - } - } + read(): string { + if (this.end()) return ""; + return this.tokens[this.ptr].value; } - consumeIdentifier() { - if (this.ptr) { - const id = unescapeIdentity(this.read()); - this.next(); - return id; + consumeBlock(): string { + if (this.match("(")) { + return this.consumeParen().toString(); + } else { + return this.consume(); } - return ""; } - readKeyword(): string { - if (this.ptr && this.ptr.type.name === "Keyword") { - const keyword = this.read(); - this.next(); - return keyword; + currentType() { + return this.tokens[this.ptr].type; + } + + consumeParen(): CursorV2 { + if (this.read() !== "(") throw new Error("Expecting ("); + + const start = this.ptr + 1; + let counter = 1; + + // Find the matching closing paren + while (counter > 0) { + if (!this.next()) throw new Error("Expecting closing paren"); + if (this.read() === "(") counter++; + if (this.read() === ")") counter--; } - return ""; + + const newCursor = new CursorV2(this.tokens.slice(start, this.ptr)); + this.next(); + + return newCursor; } - next() { - this.ptr = this.ptr?.nextSibling ?? null; + consume() { + const value = this.read(); + this.next(); + return value; } - matchKeyword(keyword: string) { - if (this.ptr && this.ptr.type.name !== "Keyword") return false; - return this.read().toUpperCase() === keyword.toUpperCase(); + consumeIdentifier() { + const value = unescapeIdentity(this.read()); + this.next(); + return value; } - matchKeywords(keywords: string[]) { - if (this.ptr && this.ptr.type.name !== "Keyword") return false; - const currentValue = this.read().toUpperCase(); - return keywords.some((keyword) => keyword.toUpperCase() === currentValue); + expectToken(value: string) { + if (!this.match(value)) throw new Error(`Expecting ${value}`); + this.next(); } - match(keyword: string) { - if (!this.ptr) return false; - return this.read().toUpperCase() === keyword.toUpperCase(); + expectTokenOptional(value: string) { + if (this.match(value)) this.next(); } - read(): string { - if (this.ptr?.node) { - return this.sql.substring(this.ptr.node.from, this.ptr.node.to); + expectTokensOptional(values: string[]) { + if (values.length === 0) return; + if (this.read() === values[0]) { + this.next(); + for (const v of values.slice(1)) { + this.expectToken(v); + } } - return ""; } - node(): SyntaxNode | undefined { - return this.ptr?.node; + expectTokens(values: string[]) { + for (const v of values) { + this.expectToken(v); + } } - type(): string | undefined { - return this.ptr?.type.name; + /** + * Next will skip to valid non-whitespace token + * @returns true if there is a next token, false otherwise + */ + next() { + for (this.ptr = this.ptr + 1; this.ptr < this.tokens.length; this.ptr++) { + if (this.currentType() !== "WHITESPACE") { + return true; + } + } + + return false; } - enterParens(): Cursor | null { - if (this.ptr?.firstChild) { - if (this.ptr.firstChild.name !== "(") return null; - if (!this.ptr.firstChild.nextSibling) return null; - return new Cursor(this.ptr.firstChild.nextSibling.cursor(), this.sql); - } + match(value: string) { + if (this.end()) return false; + return this.read().toLowerCase() === value.toLowerCase(); + } - return null; + matchTokens(values: string[]) { + return values.some((v) => this.read().toLowerCase() === v.toLowerCase()); } end() { - return this.ptr === null; + return this.ptr >= this.tokens.length; } -} -export function buildSyntaxCursor(sql: string): Cursor { - const r = sqliteDialect.language.parser.parse(sql).cursor(); - r.firstChild(); - r.firstChild(); + toString() { + return this.tokens.map((t) => t.value).join(""); + } - return new Cursor(r, sql); + toStringWithParen() { + return "(" + this.toString() + ")"; + } } function parseColumnDef( schemaName: string, - cursor: Cursor + cursor: CursorV2 ): DatabaseTableColumn | null { const columnName = cursor.consumeIdentifier(); if (!columnName) return null; @@ -134,9 +163,8 @@ function parseColumnDef( // Handle case such as VARCHAR(255) where we need to read // something inside the parens - if (cursor.type() === "Parens") { - dataType += cursor.read(); - cursor.next(); + if (cursor.match("(")) { + dataType += cursor.consumeParen().toStringWithParen(); } const constraint = parseColumnConstraint(schemaName, cursor); @@ -150,12 +178,12 @@ function parseColumnDef( } function parseConstraintConflict( - cursor: Cursor + cursor: CursorV2 ): DatabaseColumnConflict | undefined { - if (!cursor.matchKeyword("ON")) return; + if (!cursor.match("ON")) return; cursor.next(); - if (!cursor.matchKeyword("CONFLICT")) return; + if (!cursor.match("CONFLICT")) return; cursor.next(); if (!cursor.end()) { @@ -167,7 +195,7 @@ function parseConstraintConflict( return; } -export function parseColumnList(columnPtr: Cursor) { +export function parseColumnList(columnPtr: CursorV2) { const columns: string[] = []; while (!columnPtr.end()) { @@ -182,44 +210,41 @@ export function parseColumnList(columnPtr: Cursor) { export function parseColumnConstraint( schemaName: string, - cursor: Cursor + cursor: CursorV2 ): DatabaseTableColumnConstraint | undefined { - if (cursor.matchKeyword("CONSTRAINT")) { + if (cursor.match("CONSTRAINT")) { cursor.next(); - const constraintName = cursor.consumeIdentifier(); + const constraintName = cursor.consume(); return { ...parseColumnConstraint(schemaName, cursor), name: constraintName, }; - } else if (cursor.matchKeyword("PRIMARY")) { + } else if (cursor.match("PRIMARY")) { let primaryKeyOrder: SqlOrder | undefined; let primaryColumns: string[] | undefined; let autoIncrement = false; cursor.next(); - if (!cursor.matchKeyword("KEY")) - throw new Error("PRIMARY must follow by KEY"); + if (!cursor.match("KEY")) throw new Error("PRIMARY must follow by KEY"); cursor.next(); - const parens = cursor.enterParens(); - if (parens) { - primaryColumns = parseColumnList(parens); - cursor.next(); + if (cursor.match("(")) { + primaryColumns = parseColumnList(cursor.consumeParen()); } - if (cursor.matchKeyword("ASC")) { + if (cursor.match("ASC")) { primaryKeyOrder = "ASC"; cursor.next(); - } else if (cursor.matchKeyword("DESC")) { + } else if (cursor.match("DESC")) { primaryKeyOrder = "DESC"; cursor.next(); } const conflict = parseConstraintConflict(cursor); - if (cursor.matchKeyword("AUTOINCREMENT")) { + if (cursor.match("AUTOINCREMENT")) { autoIncrement = true; cursor.next(); } @@ -232,7 +257,7 @@ export function parseColumnConstraint( primaryKeyConflict: conflict, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("NOT")) { + } else if (cursor.match("NOT")) { cursor.next(); if (!cursor.match("NULL")) throw new Error("NOT should follow by NULL"); cursor.next(); @@ -243,15 +268,13 @@ export function parseColumnConstraint( notNullConflict: conflict, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("UNIQUE")) { + } else if (cursor.match("UNIQUE")) { let uniqueColumns: string[] | undefined; cursor.next(); - const parens = cursor.enterParens(); - if (parens) { - uniqueColumns = parseColumnList(parens); - cursor.next(); + if (cursor.read() === "(") { + uniqueColumns = parseColumnList(cursor.consumeParen()); } const conflict = parseConstraintConflict(cursor); @@ -262,16 +285,16 @@ export function parseColumnConstraint( uniqueColumns, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("DEFAULT")) { + } else if (cursor.match("DEFAULT")) { let defaultValue: unknown; let defaultExpression: string | undefined; cursor.next(); - if (cursor.type() === "String") { + if (cursor.currentType() === "STRING") { defaultValue = cursor.read().slice(1, -1); cursor.next(); - } else if (cursor.type() === "Operator") { + } else if (cursor.currentType() === "OPERATOR") { if (cursor.match("+")) { cursor.next(); defaultValue = Number(cursor.read()); @@ -281,12 +304,11 @@ export function parseColumnConstraint( defaultValue = -Number(cursor.read()); cursor.next(); } - } else if (cursor.type() === "Number") { + } else if (cursor.currentType() === "NUMBER") { defaultValue = Number(cursor.read()); cursor.next(); - } else if (cursor.type() === "Parens") { - defaultExpression = cursor.read(); - cursor.next(); + } else if (cursor.match("(")) { + defaultExpression = cursor.consumeParen().toString(); } else if ( cursor.match("current_timestamp") || cursor.match("current_time") || @@ -304,7 +326,7 @@ export function parseColumnConstraint( defaultExpression, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("CHECK")) { + } else if (cursor.match("CHECK")) { cursor.next(); const expr = cursor.read(); @@ -314,7 +336,7 @@ export function parseColumnConstraint( checkExpression: expr, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("COLLATE")) { + } else if (cursor.match("COLLATE")) { cursor.next(); const collationName = cursor.read(); @@ -324,18 +346,15 @@ export function parseColumnConstraint( collate: collationName, ...parseColumnConstraint(schemaName, cursor), }; - } else if (cursor.matchKeyword("FOREIGN")) { + } else if (cursor.match("FOREIGN")) { cursor.next(); if (!cursor.match("KEY")) throw new Error("FOREIGN should follow by KEY"); cursor.next(); - const parens = cursor.enterParens(); - - if (!parens) throw new Error("FOREIGN KEY should follow by column list"); - + const parens = cursor.consumeParen(); const columns = parseColumnList(parens); - cursor.next(); + const refConstraint = parseColumnConstraint(schemaName, cursor); return { @@ -346,7 +365,7 @@ export function parseColumnConstraint( columns, }, }; - } else if (cursor.matchKeyword("REFERENCES")) { + } else if (cursor.match("REFERENCES")) { cursor.next(); const foreignTableName = cursor.consumeIdentifier(); let foreignColumns: string[] = []; @@ -355,14 +374,12 @@ export function parseColumnConstraint( // We may visit more rule in the future, but at the moment // it is too complex to handle all the rules. // We will just grab foreign key column first - while (!cursor.end() && cursor.type() !== "Parens" && !cursor.match(",")) { + while (!cursor.end() && !cursor.match("(") && !cursor.match(",")) { cursor.next(); } - const columnPtr = cursor.enterParens(); - - if (columnPtr) { - foreignColumns = parseColumnList(columnPtr); + if (cursor.match("(")) { + foreignColumns = parseColumnList(cursor.consumeParen()); } return { @@ -383,12 +400,10 @@ export function parseColumnConstraint( throw new Error("GENERATED ALWAYS should follow by AS"); cursor.next(); - const expr = cursor.read(); + const expr = cursor.consumeBlock(); cursor.next(); - const virtualColumnType = cursor.matchKeyword("STORED") - ? "STORED" - : "VIRTUAL"; + const virtualColumnType = cursor.match("STORED") ? "STORED" : "VIRTUAL"; return { generatedType: virtualColumnType, @@ -402,7 +417,7 @@ export function parseColumnConstraint( function parseTableDefinition( schemaName: string, - cursor: Cursor + cursor: CursorV2 ): { columns: DatabaseTableColumn[]; constraints: DatabaseTableColumnConstraint[]; @@ -415,7 +430,7 @@ function parseTableDefinition( moveNext = false; if ( - cursor.matchKeywords([ + cursor.matchTokens([ "CONSTRAINT", "PRIMARY", "UNIQUE", @@ -444,6 +459,8 @@ function parseTableDefinition( cursor.next(); } + // console.log(columns, constraints); + for (const constraint of constraints) { if (constraint.primaryKey && constraint.primaryColumns) { for (const pkColumn of constraint.primaryColumns) { @@ -468,7 +485,7 @@ function parseTableDefinition( return { columns, constraints }; } -function parseFTS5(cursor: Cursor | null): DatabaseTableFts5 { +function parseFTS5(cursor: CursorV2): DatabaseTableFts5 { if (!cursor) return {}; let content: string | undefined; @@ -505,7 +522,7 @@ function parseFTS5(cursor: Cursor | null): DatabaseTableFts5 { }; } -function parseTableOption(cursor: Cursor): +function parseTableOption(cursor: CursorV2): | { strict?: boolean; withoutRowId?: boolean; @@ -539,19 +556,15 @@ export function parseCreateTableScript( schemaName: string, sql: string ): DatabaseTableSchema { - const tree = sqliteDialect.language.parser.parse(sql); - const ptr = tree.cursor(); - - ptr.firstChild(); - ptr.firstChild(); - - const cursor = new Cursor(ptr, sql); - cursor.expectKeyword("CREATE"); - cursor.expectKeywordOptional("TEMP"); - cursor.expectKeywordOptional("TEMPORARY"); - cursor.expectKeywordOptional("VIRTUAL"); - cursor.expectKeyword("TABLE"); - cursor.expectKeywordsOptional(["IF", "NOT", "EXIST"]); + const cursor = new CursorV2(tokenizeSql(sql, "sqlite")); + + cursor.expectToken("CREATE"); + cursor.expectTokenOptional("TEMP"); + cursor.expectTokenOptional("TEMPORARY"); + cursor.expectTokenOptional("VIRTUAL"); + cursor.expectToken("TABLE"); + cursor.expectTokensOptional(["IF", "NOT", "EXIST"]); + const tableName = cursor.consumeIdentifier(); // Check for FTS5 @@ -561,19 +574,15 @@ export function parseCreateTableScript( cursor.next(); if (cursor.match("FTS5")) { cursor.next(); - fts5 = parseFTS5(cursor.enterParens()); - cursor.next(); + fts5 = parseFTS5(cursor.consumeParen()); } } - const defCursor = cursor.enterParens(); - const defs = defCursor - ? parseTableDefinition(schemaName, defCursor) + const defs = cursor.match("(") + ? parseTableDefinition(schemaName, cursor.consumeParen()) : { columns: [], constraints: [] }; - cursor.next(); // Parsing table options - const pk = defs.columns.filter((col) => col.pk).map((col) => col.name); const autoIncrement = defs.columns.some( diff --git a/src/drivers/sqlite/sql-parse-trigger.test.ts b/src/drivers/sqlite/sql-parse-trigger.test.ts index 9f171e3c..7345742c 100644 --- a/src/drivers/sqlite/sql-parse-trigger.test.ts +++ b/src/drivers/sqlite/sql-parse-trigger.test.ts @@ -20,7 +20,7 @@ function generateSql({ CREATE TRIGGER ${name} ${whenString}${operation}${columnNameString} ON ${tableName} BEGIN - ${statement}; + ${statement} END; `; } @@ -44,14 +44,19 @@ describe("parse trigger", () => { const insert = parseCreateTriggerScript( "main", - generateSql({ name, operation: "INSERT", tableName, statement }) + generateSql({ + name, + operation: "INSERT", + tableName, + statement: statement + statement, + }) ); expect(insert).toMatchObject({ name: name, when: "BEFORE", operation: "INSERT", tableName: tableName, - statement: statement, + statement: statement + statement, }); const updateOf = parseCreateTriggerScript( diff --git a/src/drivers/sqlite/sql-parse-trigger.ts b/src/drivers/sqlite/sql-parse-trigger.ts index 8041c193..07feb064 100644 --- a/src/drivers/sqlite/sql-parse-trigger.ts +++ b/src/drivers/sqlite/sql-parse-trigger.ts @@ -1,94 +1,95 @@ -import { sqliteDialect } from "@/drivers/sqlite/sqlite-dialect"; -import { Cursor, parseColumnList } from "./sql-parse-table"; import { DatabaseTriggerSchema, - TriggerWhen, TriggerOperation, + TriggerWhen, } from "@/drivers/base-driver"; +import { tokenizeSql } from "@outerbase/sdk-transform"; +import { CursorV2, parseColumnList } from "./sql-parse-table"; -export function parseCreateTriggerScript(schemaName: string, sql: string): DatabaseTriggerSchema { - const tree = sqliteDialect.language.parser.parse(sql); - const ptr = tree.cursor(); - ptr.firstChild(); - ptr.firstChild(); - const cursor = new Cursor(ptr, sql); - cursor.expectKeyword("CREATE"); - cursor.expectKeywordOptional("TEMP"); - cursor.expectKeywordOptional("TEMPORARY"); - cursor.expectKeyword("TRIGGER"); - cursor.expectKeywordsOptional(["IF", "NOT", "EXIST"]); +export function parseCreateTriggerScript( + schemaName: string, + sql: string +): DatabaseTriggerSchema { + const cursor = new CursorV2(tokenizeSql(sql, "sqlite")); + + cursor.expectToken("CREATE"); + cursor.expectTokenOptional("TEMP"); + cursor.expectTokenOptional("TEMPORARY"); + cursor.expectToken("TRIGGER"); + cursor.expectTokensOptional(["IF", "NOT", "EXIST"]); const name = cursor.consumeIdentifier(); let when: TriggerWhen = "BEFORE"; - if (cursor.matchKeyword("BEFORE")) { + if (cursor.match("BEFORE")) { cursor.next(); - } else if (cursor.matchKeyword("AFTER")) { + } else if (cursor.match("AFTER")) { when = "AFTER"; cursor.next(); - } else if (cursor.matchKeywords(["INSTEAD", "OF"])) { + } else if (cursor.match("INSTEAD")) { + cursor.expectTokens(["INSTEAD", "OF"]); when = "INSTEAD_OF"; - cursor.next(); - cursor.next(); } let operation: TriggerOperation = "INSERT"; let columnNames; - if (cursor.matchKeyword("DELETE")) { + if (cursor.match("DELETE")) { operation = "DELETE"; cursor.next(); - } else if (cursor.matchKeyword("INSERT")) { + } else if (cursor.match("INSERT")) { operation = "INSERT"; cursor.next(); - } else if (cursor.matchKeyword("UPDATE")) { + } else if (cursor.match("UPDATE")) { operation = "UPDATE"; cursor.next(); - if (cursor.matchKeyword("OF")) { + if (cursor.match("OF")) { cursor.next(); columnNames = parseColumnList(cursor); } } - cursor.expectKeyword("ON"); + cursor.expectToken("ON"); const tableName = cursor.consumeIdentifier(); - cursor.expectKeywordsOptional(["FOR", "EACH", "ROW"]); + cursor.expectTokensOptional(["FOR", "EACH", "ROW"]); let whenExpression = ""; - const fromExpression = cursor.node()?.from; + const fromExpression = cursor.getPointer(); let toExpression; - if (cursor.matchKeyword("WHEN")) { + if (cursor.match("WHEN")) { // Loop till the end or meet the BEGIN cursor.next(); while (!cursor.end()) { - toExpression = cursor.node()?.to; - if (cursor.matchKeyword("BEGIN")) break; + toExpression = cursor.getPointer(); + if (cursor.match("BEGIN")) break; cursor.next(); } } - if (fromExpression) { - whenExpression = sql.substring(fromExpression, toExpression); + if (fromExpression && toExpression) { + whenExpression = cursor.toStringRange(fromExpression, toExpression); } - cursor.expectKeyword("BEGIN"); + cursor.expectToken("BEGIN"); let statement = ""; - const fromStatement = cursor.node()?.from; + const fromStatement = cursor.getPointer(); let toStatement; while (!cursor.end()) { - toStatement = cursor.node()?.to; - if (cursor.matchKeyword(";")) { - break; + toStatement = cursor.getPointer(); + if (cursor.match(";")) { + cursor.next(); + if (cursor.match("END")) break; + } else { + cursor.next(); } - cursor.next(); } - if (fromStatement) { - statement = sql.substring(fromStatement, toStatement); + if (fromStatement && toStatement) { + statement = cursor.toStringRange(fromStatement, toStatement + 1); } return { diff --git a/src/drivers/sqlite/sql-parse-view.test.ts b/src/drivers/sqlite/sql-parse-view.test.ts new file mode 100644 index 00000000..5ffd8ab4 --- /dev/null +++ b/src/drivers/sqlite/sql-parse-view.test.ts @@ -0,0 +1,89 @@ +import { parseCreateViewScript } from "./sql-parse-view"; + +describe("parse", () => { + test("parsing simple view", () => { + const view = parseCreateViewScript( + "main", + `CREATE VIEW COMPANY_VIEW AS SELECT ID, NAME, AGE FROM COMPANY;` + ); + expect(view).toMatchObject({ + schemaName: "main", + name: "COMPANY_VIEW", + statement: "SELECT ID, NAME, AGE FROM COMPANY", + }); + }); + + test("parsing view with temporary keyword", () => { + const view = parseCreateViewScript( + "main", + `CREATE TEMPORARY VIEW TEMP_VIEW AS SELECT * FROM USERS;` + ); + expect(view).toMatchObject({ + schemaName: "main", + name: "TEMP_VIEW", + statement: "SELECT * FROM USERS", + }); + }); + + test("parsing view with temp keyword", () => { + const view = parseCreateViewScript( + "main", + `CREATE TEMP VIEW TEMP_VIEW AS SELECT * FROM USERS;` + ); + expect(view).toMatchObject({ + schemaName: "main", + name: "TEMP_VIEW", + statement: "SELECT * FROM USERS", + }); + }); + + test("parsing view with IF NOT EXISTS", () => { + const view = parseCreateViewScript( + "custom", + `CREATE VIEW IF NOT EXIST USER_STATS AS SELECT COUNT(*) AS user_count FROM USERS;` + ); + expect(view).toMatchObject({ + schemaName: "custom", + name: "USER_STATS", + statement: "SELECT COUNT(*) AS user_count FROM USERS", + }); + }); + + test("parsing complex view with joins", () => { + const view = parseCreateViewScript( + "main", + `CREATE VIEW ORDER_DETAILS AS + SELECT o.id, o.date, c.name, p.title + FROM orders o + JOIN customers c ON o.customer_id = c.id + JOIN products p ON o.product_id = p.id;` + ); + expect(view).toMatchObject({ + schemaName: "main", + name: "ORDER_DETAILS", + statement: `SELECT o.id, o.date, c.name, p.title + FROM orders o + JOIN customers c ON o.customer_id = c.id + JOIN products p ON o.product_id = p.id`, + }); + }); + + test("parsing view with subquery", () => { + const view = parseCreateViewScript( + "analytics", + `CREATE VIEW TOP_CUSTOMERS AS + SELECT customer_id, SUM(amount) as total + FROM (SELECT * FROM transactions WHERE status = 'completed') + GROUP BY customer_id + ORDER BY total DESC;` + ); + expect(view).toMatchObject({ + schemaName: "analytics", + name: "TOP_CUSTOMERS", + statement: `SELECT customer_id, SUM(amount) as total + FROM (SELECT * FROM transactions WHERE status = 'completed') + GROUP BY customer_id + ORDER BY total DESC`, + }); + }); +}); diff --git a/src/drivers/sqlite/sql-parse-view.ts b/src/drivers/sqlite/sql-parse-view.ts index 812c3f0d..d9081c0b 100644 --- a/src/drivers/sqlite/sql-parse-view.ts +++ b/src/drivers/sqlite/sql-parse-view.ts @@ -1,39 +1,39 @@ -import { sqliteDialect } from "@/drivers/sqlite/sqlite-dialect"; +import { tokenizeSql } from "@outerbase/sdk-transform"; import { DatabaseViewSchema } from "../base-driver"; -import { Cursor } from "./sql-parse-table"; +import { CursorV2 } from "./sql-parse-table"; export function parseCreateViewScript( schemaName: string, sql: string ): DatabaseViewSchema { - const tree = sqliteDialect.language.parser.parse(sql); - const ptr = tree.cursor(); - ptr.firstChild(); - ptr.firstChild(); - const cursor = new Cursor(ptr, sql); - cursor.expectKeyword("CREATE"); - cursor.expectKeywordOptional("TEMP"); - cursor.expectKeywordOptional("TEMPORARY"); - cursor.expectKeyword("VIEW"); - cursor.expectKeywordsOptional(["IF", "NOT", "EXIST"]); + const cursor = new CursorV2(tokenizeSql(sql, "sqlite")); + + cursor.expectToken("CREATE"); + cursor.expectTokenOptional("TEMP"); + cursor.expectTokenOptional("TEMPORARY"); + cursor.expectToken("VIEW"); + cursor.expectTokensOptional(["IF", "NOT", "EXIST"]); + const name = cursor.consumeIdentifier(); - cursor.expectKeyword("AS"); + cursor.expectToken("AS"); let statement = ""; - const fromStatement = cursor.node()?.from; + const fromStatement = cursor.getPointer(); let toStatement; while (!cursor.end()) { - toStatement = cursor.node()?.to; - if (cursor.matchKeyword(";")) { + toStatement = cursor.getPointer(); + + if (cursor.match(";")) { break; } + cursor.next(); } - if (fromStatement) { - statement = sql.substring(fromStatement, toStatement); + if (fromStatement && toStatement) { + statement = cursor.toStringRange(fromStatement, toStatement); } return { From 58c8b2022d207fbeda7dc393c2f83adda0ed5e20 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Fri, 28 Mar 2025 21:19:11 +0700 Subject: [PATCH 06/11] remove debug logging from sqlite-base-driver --- src/drivers/sqlite-base-driver.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/drivers/sqlite-base-driver.ts b/src/drivers/sqlite-base-driver.ts index 23e95ea5..388b8efd 100644 --- a/src/drivers/sqlite-base-driver.ts +++ b/src/drivers/sqlite-base-driver.ts @@ -325,8 +325,6 @@ export class SqliteLikeBaseDriver extends CommonSQLImplement { const schema = await this.tableSchema(schemaName, tableName); let injectRowIdColumn = false; - console.log(schema); - // If there is no primary key, we will fallback to rowid. // But we need to make sure there is no rowid column if ( From 5a2de6600c6de98fbb9e504b19d51121ad7daf0d Mon Sep 17 00:00:00 2001 From: lurenjiamax <1932231507@outlook.com> Date: Sat, 29 Mar 2025 09:47:45 +0800 Subject: [PATCH 07/11] feat: Add export menu for tables. (#415) * fix: offset should not be negative * feat: Add table export menu * chore: add type annotatoin to pass quality check --- .../gui/export/export-result-button.tsx | 2 +- src/components/gui/schema-sidebar-list.tsx | 56 +++++++++++++++++++ src/components/gui/tabs/table-data-tab.tsx | 5 +- src/lib/export-helper.ts | 47 ++++++++++++++++ 4 files changed, 107 insertions(+), 3 deletions(-) diff --git a/src/components/gui/export/export-result-button.tsx b/src/components/gui/export/export-result-button.tsx index 59c083cf..023b674e 100644 --- a/src/components/gui/export/export-result-button.tsx +++ b/src/components/gui/export/export-result-button.tsx @@ -17,7 +17,7 @@ import OptimizeTableState, { } from "../table-optimized/optimize-table-state"; export type ExportTarget = "clipboard" | "file"; -type ExportFormat = "csv" | "delimited" | "json" | "sql" | "xlsx"; +export type ExportFormat = "csv" | "delimited" | "json" | "sql" | "xlsx"; export type ExportSelection = | "complete" | "selected_row" diff --git a/src/components/gui/schema-sidebar-list.tsx b/src/components/gui/schema-sidebar-list.tsx index bcf9b7b4..3ee81b60 100644 --- a/src/components/gui/schema-sidebar-list.tsx +++ b/src/components/gui/schema-sidebar-list.tsx @@ -4,6 +4,7 @@ import { OpenContextMenuList } from "@/core/channel-builtin"; import { scc } from "@/core/command"; import { DatabaseSchemaItem } from "@/drivers/base-driver"; import { triggerEditorExtensionTab } from "@/extensions/trigger-editor"; +import { ExportFormat, exportTableData } from "@/lib/export-helper"; import { Table } from "@phosphor-icons/react"; import { LucideCog, LucideDatabase, LucideView } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; @@ -122,6 +123,31 @@ function flattenSchemaGroup( return schemaGroup; } +// Copy of export-result-button.tsx +async function downloadExportTable( + format: string, + handler: Promise +) { + try { + if (!format) return; + const content = await handler; + if (!content) return; + // TODO: more mimeTypes support + const blob = + content instanceof Blob + ? content + : new Blob([content], { type: "text/plain;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `export.${format === "delimited" ? "csv" : format}`; + a.click(); + URL.revokeObjectURL(url); + } catch (error) { + console.error(`Failed to download exported ${format} file:`, error); + } +} + export default function SchemaList({ search }: Readonly) { const { databaseDriver, extensions } = useStudioContext(); const [selected, setSelected] = useState(""); @@ -136,10 +162,18 @@ export default function SchemaList({ search }: Readonly) { setSelected(""); }, [setSelected, search]); + const exportFormats = [ + { title: "Export as CSV", format: "csv" }, + { title: "Export as Excel", format: "xlsx" }, + { title: "Export as JSON", format: "json" }, + { title: "Export as SQL INSERT", format: "sql" }, + ]; + const prepareContextMenu = useCallback( (item?: DatabaseSchemaItem) => { const selectedName = item?.name; const isTable = item?.type === "table"; + const schemaName = item?.schemaName ?? currentSchemaName; const createMenuSection = { title: "Create", @@ -173,6 +207,26 @@ export default function SchemaList({ search }: Readonly) { ].filter(Boolean) : []; + const exportSection = + isTable && selectedName + ? { + title: "Export Table", + sub: exportFormats.map(({ title, format }) => ({ + title, + onClick: async () => { + const handler = exportTableData( + databaseDriver, + schemaName, + selectedName, + format as ExportFormat, + "file" + ); + downloadExportTable(format, handler); + }, + })), + } + : undefined; + return [ createMenuSection, { @@ -184,6 +238,8 @@ export default function SchemaList({ search }: Readonly) { }, { separator: true }, + // Export Section + exportSection, // Modification Section ...modificationSection, modificationSection.length > 0 ? { separator: true } : undefined, diff --git a/src/components/gui/tabs/table-data-tab.tsx b/src/components/gui/tabs/table-data-tab.tsx index b3aa1235..c25d4749 100644 --- a/src/components/gui/tabs/table-data-tab.tsx +++ b/src/components/gui/tabs/table-data-tab.tsx @@ -352,7 +352,7 @@ export default function TableDataWindow({ onChange={(e) => setLimit(e.currentTarget.value)} onBlur={(e) => { try { - const finalValue = parseInt(e.currentTarget.value); + const finalValue = Math.max(0, parseInt(e.currentTarget.value)); if (finalValue !== finalLimit) { setFinalLimit(finalValue); } @@ -375,10 +375,11 @@ export default function TableDataWindow({ onChange={(e) => setOffset(e.currentTarget.value)} onBlur={(e) => { try { - const finalValue = parseInt(e.currentTarget.value); + const finalValue = Math.max(0, parseInt(e.currentTarget.value)); if (finalValue !== finalOffset) { setFinalOffset(finalValue); } + setOffset(finalValue.toString()); } catch (e) { setOffset(finalOffset.toString()); } diff --git a/src/lib/export-helper.ts b/src/lib/export-helper.ts index a25fd5c4..c20246a7 100644 --- a/src/lib/export-helper.ts +++ b/src/lib/export-helper.ts @@ -1,4 +1,5 @@ import { + ExportFormat, ExportOptions, ExportSelection, ExportTarget, @@ -245,3 +246,49 @@ export function convertExcelStringToArray(data: string): string[][] { const lines = data.split("\r\n"); return lines.map((line) => line.split("\t")); } + +export async function exportTableData( + databaseDriver: any, + schemaName: string, + tableName: string, + format: ExportFormat, + exportTarget: ExportTarget, + options?: ExportOptions +): Promise { + console.log("Exporting", schemaName, tableName, format, exportTarget, options); + const result = await databaseDriver.query( + `SELECT * FROM ${databaseDriver.escapeId(schemaName)}.${databaseDriver.escapeId(tableName)}` + ); + console.log("QueryResults", result); + if (!result.rows || result.rows.length === 0) { + return ""; + } + + const headers = Object.keys(result.rows[0]); + const records = result.rows.map((row: { [x: string]: string; }) => headers.map(header => row[header])); + + const formatHandlers = { + csv: () => exportDataAsDelimitedText(headers, records, ",", "\n", '"', exportTarget), + json: () => exportRowsToJson(headers, records, exportTarget), + sql: () => exportRowsToSqlInsert(tableName, headers, records, exportTarget), + xlsx: () => exportToExcel(records, headers, tableName, exportTarget), + delimited: () => + exportDataAsDelimitedText( + headers, + records, + options?.fieldSeparator || ",", + options?.lineTerminator || "\n", + options?.encloser || '"', + exportTarget + ), + }; + + const handler = formatHandlers[format]; + if (handler) { + return handler(); + } else { + throw new Error(`Unsupported export format: ${format}`); + } +} +// TODO: maybe we should move export related types here +export type { ExportFormat }; From f4802e95997af61894f1b03f4cd27f8ed0d5e4bb Mon Sep 17 00:00:00 2001 From: roth <68660484+roth-dev@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:37:08 +0700 Subject: [PATCH 08/11] fix: unable save edit column after discard change (#421) --- src/components/gui/tabs/schema-editor-tab.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/gui/tabs/schema-editor-tab.tsx b/src/components/gui/tabs/schema-editor-tab.tsx index 78c3636e..0a3a8a74 100644 --- a/src/components/gui/tabs/schema-editor-tab.tsx +++ b/src/components/gui/tabs/schema-editor-tab.tsx @@ -14,10 +14,7 @@ interface SchemaEditorTabProps { } const EMPTY_SCHEMA: DatabaseTableSchemaChange = { - name: { - old: "", - new: "", - }, + name: { old: "", new: "" }, columns: [], constraints: [], createScript: "", @@ -66,6 +63,7 @@ export default function SchemaEditorTab({ const onDiscard = useCallback(() => { setSchema((prev) => { return { + schemaName: prev.schemaName, name: { ...prev.name, new: prev.name.old }, columns: prev.columns .map((col) => ({ From ab5d1f564e4ffef3f7154613415e60e3c881f3d6 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Mon, 31 Mar 2025 14:39:26 +0700 Subject: [PATCH 09/11] refactor: make table component standalone (#419) * fixing the lint complain for schema sidebar * expose the render cell we want to make our table component as very optimized headless table. expose render cell method allows user to customize how the cell render rather bake in renderer * add storybook for table component * fixing typo discard all change * refactor: simplify renderHeader prop by removing index parameter * separate the table style from global style * refactor: table header state should not hard-baked with database specified type * database table header metadata should from table result as optimize table now should has zero dependency * move table state out as it is not relevent to optimize table * decouple create table state from result out * decouple the code to get the aggregate result from state * move some styles to tailwind instead of css file * make table completely tailwind --- src/app/globals.css | 176 ++++++------------ src/app/storybook/table/page.tsx | 60 ++++++ src/components/board/board-chart-editor.tsx | 7 +- .../aggregate-result-button.tsx | 166 +++++++++++++++-- src/components/gui/query-result-table.tsx | 7 +- src/components/gui/schema-sidebar-list.tsx | 16 +- .../gui/table-cell/create-editable-cell.tsx | 6 +- .../gui/table-cell/generic-cell.tsx | 5 +- src/components/gui/table-optimized/helper.ts | 81 +++----- src/components/gui/table-optimized/index.tsx | 108 +++++------ .../table-optimized/optimize-table-state.tsx | 149 +-------------- .../gui/table-optimized/table-cell.tsx | 24 ++- .../table-fake-body-padding.tsx | 6 +- .../gui/table-optimized/table-header-list.tsx | 19 +- .../table-header-resize-handler.tsx | 4 +- .../gui/table-optimized/table-header.tsx | 16 +- .../use-visibility-calculation.ts | 63 ++++++- .../gui/table-result/context-menu.tsx | 11 +- src/components/gui/table-result/helper.ts | 23 +++ .../gui/table-result/render-cell.tsx | 3 +- .../table-state-actions.ts | 9 +- src/components/gui/table-result/type.tsx | 25 +++ .../gui/tabs-result/query-result-tab.tsx | 4 +- src/components/gui/tabs/table-data-tab.tsx | 18 +- src/core/extension-manager.tsx | 9 +- src/lib/build-table-result.ts | 19 +- 26 files changed, 568 insertions(+), 466 deletions(-) create mode 100644 src/app/storybook/table/page.tsx create mode 100644 src/components/gui/table-result/helper.ts rename src/components/gui/{table-optimized => table-result}/table-state-actions.ts (80%) create mode 100644 src/components/gui/table-result/type.tsx diff --git a/src/app/globals.css b/src/app/globals.css index 828d1e89..51baefe4 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -9,11 +9,13 @@ @theme { --font-*: initial; - --font-sans: Inter, Helvetica, ui-sans-serif, system-ui, sans-serif, - "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-sans: + Inter, Helvetica, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; - --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; + --font-mono: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; --color-border: var(--border); --color-input: var(--input); @@ -539,80 +541,6 @@ visibility: visible; } -.libsql-cell { - line-height: 34px; - height: 35px; -} - -.libsql-table { - width: 100%; - height: 100%; - overflow: auto; - position: relative; - font-size: 12px; - user-select: none; -} - -.libsql-table table { - position: absolute; - display: grid; - border-collapse: collapse; - left: 0; - top: 0; - box-sizing: border-box; - table-layout: fixed; -} - -.libsql-table tr, -.libsql-table thead, -.libsql-table tbody { - display: contents; -} - -.libsql-table td, -.libsql-table th { - @apply border-r border-b; - overflow: hidden; -} - -.libsql-table-cell { - overflow: hidden; - flex-grow: 1; - white-space: nowrap; -} - -.libsql-table th { - position: sticky; - top: 0; - user-select: none; - padding: 0px; - height: 35px; - line-height: 35px; - text-align: left; - display: flex; - flex-direction: row; - z-index: 10; -} - -.libsql-table th.sticky { - z-index: 20; -} - -.libsql-resizer { - position: absolute; - right: 0; - top: 0; - bottom: 0; - width: 10px; - cursor: col-resize; - background: var(--color-critical); - opacity: 0; -} - -.libsql-resizer:hover { - opacity: 0.5; -} - /* cyrillic-ext */ @font-face { font-family: "Inter"; @@ -621,8 +549,8 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; + unicode-range: + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -666,9 +594,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, - U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, - U+0329, U+1EA0-1EF9, U+20AB; + unicode-range: + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -679,8 +608,9 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, - U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + unicode-range: + U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, + U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -691,9 +621,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, - U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @@ -704,8 +635,8 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; + unicode-range: + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -749,9 +680,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, - U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, - U+0329, U+1EA0-1EF9, U+20AB; + unicode-range: + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -762,8 +694,9 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, - U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + unicode-range: + U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, + U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -774,9 +707,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, - U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @@ -787,8 +721,8 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; + unicode-range: + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -832,9 +766,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, - U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, - U+0329, U+1EA0-1EF9, U+20AB; + unicode-range: + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -845,8 +780,9 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, - U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + unicode-range: + U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, + U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -857,9 +793,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, - U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @@ -870,8 +807,8 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; + unicode-range: + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -915,9 +852,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, - U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, - U+0329, U+1EA0-1EF9, U+20AB; + unicode-range: + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -928,8 +866,9 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7W0Q5n-wU.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, - U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + unicode-range: + U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, + U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -940,9 +879,10 @@ font-display: swap; src: url("./fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, - U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, + U+2212, U+2215, U+FEFF, U+FFFD; } .window-tab-scrollbar { diff --git a/src/app/storybook/table/page.tsx b/src/app/storybook/table/page.tsx new file mode 100644 index 00000000..29efd11d --- /dev/null +++ b/src/app/storybook/table/page.tsx @@ -0,0 +1,60 @@ +"use client"; + +import OptimizeTable, { + OptimizeTableCellRenderProps, + OptimizeTableHeaderWithIndexProps, +} from "@/components/gui/table-optimized"; +import { createSimpleTableState } from "@/components/gui/table-optimized/helper"; +import { useCallback, useMemo } from "react"; + +export default function TableStorybookPage() { + const state = useMemo(() => { + return createSimpleTableState( + ["id", "name", "age"], + [ + { id: 1, name: "John", age: 25 }, + { id: 2, name: "Jane", age: 30 }, + { id: 3, name: "Doe", age: 22 }, + { id: 4, name: "Alice", age: 28 }, + { id: 5, name: "Bob", age: 35 }, + { id: 6, name: "Charlie", age: 27 }, + { id: 7, name: "David", age: 32 }, + { id: 8, name: "Eve", age: 29 }, + { id: 9, name: "Frank", age: 31 }, + { id: 10, name: "Grace", age: 26 }, + ] + ); + }, []); + + const renderCell = useCallback( + ({ state, x, y }: OptimizeTableCellRenderProps) => { + const value = (state.getValue(y, x) as string).toString(); + return
{value}
; + }, + [] + ); + + const renderHeader = useCallback( + (header: OptimizeTableHeaderWithIndexProps) => { + return ( +
+ {header.display.text} +
+ ); + }, + [] + ); + + return ( +
+ +
+ ); +} diff --git a/src/components/board/board-chart-editor.tsx b/src/components/board/board-chart-editor.tsx index f5b66491..1357a669 100644 --- a/src/components/board/board-chart-editor.tsx +++ b/src/components/board/board-chart-editor.tsx @@ -13,6 +13,8 @@ import EditChartMenu from "../chart/edit-chart-menu"; import ResultTable from "../gui/query-result-table"; import SqlEditor from "../gui/sql-editor"; import OptimizeTableState from "../gui/table-optimized/optimize-table-state"; +import { createTableStateFromResult } from "../gui/table-result/helper"; +import { TableHeaderMetadata } from "../gui/table-result/type"; import { Button } from "../orbit/button"; import { MenuBar } from "../orbit/menu-bar"; import { createAutoBoardChartValue } from "./board-auto-value"; @@ -34,7 +36,8 @@ export default function BoardChartEditor({ storage, resolvedFilterValue, } = useBoardContext(); - const [result, setResult] = useState(); + const [result, setResult] = + useState>(); const [value, setValue] = useState(() => { if (initialValue) return initialValue; @@ -102,7 +105,7 @@ export default function BoardChartEditor({ .query(sourceId, sqlWithVariables) .then((newResult) => { setResult( - OptimizeTableState.createFromResult({ + createTableStateFromResult({ result: newResult, driver: sourceDriver.getDriver(sourceId), schemas: schema, diff --git a/src/components/gui/aggregate-result/aggregate-result-button.tsx b/src/components/gui/aggregate-result/aggregate-result-button.tsx index e9988dfc..d4e6cb18 100644 --- a/src/components/gui/aggregate-result/aggregate-result-button.tsx +++ b/src/components/gui/aggregate-result/aggregate-result-button.tsx @@ -1,11 +1,12 @@ +import { formatNumber } from "@/lib/convertNumber"; import { LucideCheck, LucideChevronDown } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { buttonVariants } from "../../ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover"; import ListButtonItem from "../list-button-item"; -import OptimizeTableState, { - AggregateFunction, -} from "../table-optimized/optimize-table-state"; +import OptimizeTableState from "../table-optimized/optimize-table-state"; + +export type AggregateFunction = "sum" | "avg" | "min" | "max" | "count"; export interface AggregateResult { sum: number | string | undefined; avg: number | string | undefined; @@ -14,6 +15,141 @@ export interface AggregateResult { count: number | string | undefined; } +function isValidDate(value: string): boolean { + const dateRegex = /^\d{4}-\d{2}-\d{2}$/; + if (!dateRegex.test(value)) return false; + + const parsedDate = new Date(value); + return !isNaN(parsedDate.getTime()); +} + +function isValidDateTime(value: string): boolean { + const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; + if (!dateTimeRegex.test(value)) return false; + + const parsedDate = new Date(value); + return !isNaN(parsedDate.getTime()); +} + +function calculateAggregateResult(data: OptimizeTableState): AggregateResult { + let sum: number | string | undefined = undefined; + let avg: number | string | undefined = undefined; + let min: number | string | undefined = undefined; + let max: number | string | undefined = undefined; + let detectedDataType: undefined | "date" | "number" | "string" = undefined; + + const ranges = data.getSelectionRanges(); + + // Process selected cells across all ranges, avoiding duplicates + // by tracking cell coordinates in a Set before collecting values + const selectedCell = new Set(); + const values: unknown[] = []; + for (const range of ranges) { + for (let x = range.x1; x <= range.x2; x++) { + for (let y = range.y1; y <= range.y2; y++) { + const key = `${x}-${y}`; + + if (selectedCell.has(key)) { + continue; + } + + const value = data.getValue(y, x); + + // We don't have to aggregate empty cells + if (value === undefined || value === null || value === "") { + continue; + } + + selectedCell.add(key); + values.push(value); + } + } + } + + if (values.length === 0) { + return { + sum: undefined, + avg: undefined, + min: undefined, + max: undefined, + count: selectedCell.size, + }; + } + + // Sampling the values to detect the data type + if (!isNaN(Number(values[0]))) { + detectedDataType = "number"; + } else if (typeof values[0] === "string" && !isNaN(Date.parse(values[0]))) { + detectedDataType = "date"; + } + + // Aggregate the values based on the detected data type + if (detectedDataType === "number") { + for (const value of values) { + const parsed = Number(value); + if (!isNaN(parsed)) { + sum = sum !== undefined ? sum + parsed : parsed; + min = + min !== undefined + ? (min as number) < parsed + ? min + : parsed + : parsed; + max = + max !== undefined + ? (max as number) > parsed + ? max + : parsed + : parsed; + } + } + } else if (detectedDataType === "date") { + for (const value of values) { + if (typeof value !== "string") continue; + + if (isValidDate(value) || isValidDateTime(value)) { + const parsed = Date.parse(value as string); + if (!isNaN(parsed)) { + min = + min !== undefined + ? Date.parse(min as string) < parsed + ? min + : value + : value; + max = + max !== undefined + ? Date.parse(max as string) > parsed + ? max + : value + : value; + } + } + } + } + + if (sum !== undefined && values.length > 0) { + avg = sum / values.length; + } + + if (detectedDataType === "number") { + return { + sum: formatNumber(sum), + avg: formatNumber(avg), + min: formatNumber(min as number), + max: formatNumber(max as number), + count: selectedCell.size, + }; + } + + return { + sum, + avg, + min, + max, + count: selectedCell.size, + }; +} + export default function AggregateResultButton({ data, }: { @@ -27,14 +163,23 @@ export default function AggregateResultButton({ count: undefined, }); - const [defaultFunction, setDefaultFunction] = useState( - data.getDefaultAggregateFunction() - ); + const [defaultFunction, setDefaultFunction] = + useState("sum"); + useEffect(() => { const changeCallback = () => { - setResult({ - ...(data.getSelectionAggregatedResult() as AggregateResult), - }); + try { + setResult(calculateAggregateResult(data)); + } catch { + // It is better to show no result than to crash the application + setResult({ + sum: undefined, + avg: undefined, + min: undefined, + max: undefined, + count: undefined, + }); + } }; data.addChangeListener(changeCallback); @@ -62,9 +207,8 @@ export default function AggregateResultButton({ const handleSetDefaultFunction = useCallback( (functionName: AggregateFunction) => { setDefaultFunction(functionName); - data.setDefaultAggregateFunction(functionName); }, - [data] + [] ); if (result.count && Number(result.count) <= 1) return null; diff --git a/src/components/gui/query-result-table.tsx b/src/components/gui/query-result-table.tsx index e46a6c16..af2a5a77 100644 --- a/src/components/gui/query-result-table.tsx +++ b/src/components/gui/query-result-table.tsx @@ -27,9 +27,11 @@ import { DropdownMenuTrigger, } from "../ui/dropdown-menu"; import useTableResultContextMenu from "./table-result/context-menu"; +import tableResultCellRenderer from "./table-result/render-cell"; +import { TableHeaderMetadata } from "./table-result/type"; interface ResultTableProps { - data: OptimizeTableState; + data: OptimizeTableState; tableName?: string; onSortColumnChange?: (columns: ColumnSortOption[]) => void; sortColumns?: ColumnSortOption[]; @@ -135,7 +137,7 @@ export default function ResultTable({ }, [data, visibleColumnIndexList]); const renderHeader = useCallback( - (header: OptimizeTableHeaderWithIndexProps) => { + (header: OptimizeTableHeaderWithIndexProps) => { const extensionMenu = extensions.getQueryHeaderContextMenu(header, data); const extensionMenuItems = extensionMenu.map((item) => { if (item.component) { @@ -419,6 +421,7 @@ export default function ResultTable({ renderHeader={renderHeader} rowHeight={35} onKeyDown={onKeyDown} + renderCell={tableResultCellRenderer} /> ); } diff --git a/src/components/gui/schema-sidebar-list.tsx b/src/components/gui/schema-sidebar-list.tsx index 3ee81b60..1aa156b9 100644 --- a/src/components/gui/schema-sidebar-list.tsx +++ b/src/components/gui/schema-sidebar-list.tsx @@ -162,12 +162,14 @@ export default function SchemaList({ search }: Readonly) { setSelected(""); }, [setSelected, search]); - const exportFormats = [ - { title: "Export as CSV", format: "csv" }, - { title: "Export as Excel", format: "xlsx" }, - { title: "Export as JSON", format: "json" }, - { title: "Export as SQL INSERT", format: "sql" }, - ]; + const exportFormats = useMemo(() => { + return [ + { title: "Export as CSV", format: "csv" }, + { title: "Export as Excel", format: "xlsx" }, + { title: "Export as JSON", format: "json" }, + { title: "Export as SQL INSERT", format: "sql" }, + ]; + }, []); const prepareContextMenu = useCallback( (item?: DatabaseSchemaItem) => { @@ -247,7 +249,7 @@ export default function SchemaList({ search }: Readonly) { { title: "Refresh", onClick: () => refresh() }, ].filter(Boolean) as OpenContextMenuList; }, - [refresh, databaseDriver, currentSchemaName, extensions] + [refresh, databaseDriver, currentSchemaName, extensions, exportFormats] ); const listViewItems = useMemo(() => { diff --git a/src/components/gui/table-cell/create-editable-cell.tsx b/src/components/gui/table-cell/create-editable-cell.tsx index c404002e..d66bff3a 100644 --- a/src/components/gui/table-cell/create-editable-cell.tsx +++ b/src/components/gui/table-cell/create-editable-cell.tsx @@ -1,10 +1,10 @@ import { DatabaseValue } from "@/drivers/base-driver"; -import { cn } from "@/lib/utils"; import { ColumnType } from "@outerbase/sdk-transform"; import { useCallback, useEffect, useRef, useState } from "react"; import { useFullEditor } from "../providers/full-editor-provider"; import { OptimizeTableHeaderWithIndexProps } from "../table-optimized"; import OptimizeTableState from "../table-optimized/optimize-table-state"; +import { TableHeaderMetadata } from "../table-result/type"; import GenericCell from "./generic-cell"; export interface TableEditableCell { @@ -16,7 +16,7 @@ export interface TableEditableCell { state: OptimizeTableState; onChange?: (newValue: DatabaseValue) => void; editor?: "input" | "json" | "text"; - header: OptimizeTableHeaderWithIndexProps; + header: OptimizeTableHeaderWithIndexProps; } interface TabeEditableCellProps { @@ -147,7 +147,7 @@ export default function createEditableCell({ (editor === undefined || editor === "input") ) { return ( -
+
{ @@ -21,7 +22,7 @@ interface TableCellProps { focus?: boolean; onFocus?: () => void; onDoubleClick?: () => void; - header: OptimizeTableHeaderWithIndexProps; + header: OptimizeTableHeaderWithIndexProps; } interface SneakpeakProps { @@ -178,7 +179,7 @@ export default function GenericCell({ onDoubleClick, header, }: TableCellProps) { - const className = cn("libsql-cell font-mono flex", "pl-2 pr-2"); + const className = cn("h-[35px] leading-[35px] font-mono flex", "pl-2 pr-2"); const isAlignRight = align === "right"; const textBaseStyle = cn( diff --git a/src/components/gui/table-optimized/helper.ts b/src/components/gui/table-optimized/helper.ts index bcbffab4..a2d16350 100644 --- a/src/components/gui/table-optimized/helper.ts +++ b/src/components/gui/table-optimized/helper.ts @@ -1,61 +1,26 @@ -/** - * Giving the container, we calculate visible rows and column - * - * @param e container elements - * @param headerSizes size of each headers - * @param totalRowCount total number of rows - * @param rowHeight fixed height of each row - * @param renderAhead number of rows that we need to pre-render ahead - * @returns - */ -export function getVisibleCellRange( - e: HTMLDivElement, - headerSizes: number[], - totalRowCount: number, - rowHeight: number, - renderAhead: number, - gutterWidth: number +import OptimizeTableState from "./optimize-table-state"; + +export function createSimpleTableState( + headers: string[], + data: Record[] ) { - const currentRowStart = Math.max( - 0, - Math.floor(e.scrollTop / rowHeight) - 1 - renderAhead - ); - const currentRowEnd = Math.min( - totalRowCount, - currentRowStart + - Math.ceil(e.getBoundingClientRect().height / rowHeight) + - renderAhead + return new OptimizeTableState( + headers.map((header) => ({ + name: header, + display: { + initialSize: 150, + text: header, + }, + sticky: false, + metadata: { + isPrimaryKey: false, + }, + setting: { + readonly: true, + resizable: true, + }, + store: new Map(), + })), + data ); - - let currentColStart = -1; - let currentColAccumulateSize = gutterWidth; - let currentColEnd = -1; - - const visibleXStart = e.scrollLeft; - const visibleXEnd = visibleXStart + e.getBoundingClientRect().width; - - for (let i = 0; i < headerSizes.length; i++) { - if (currentColAccumulateSize >= visibleXStart && currentColStart < 0) { - currentColStart = i - 1; - } - - currentColAccumulateSize += headerSizes[i] ?? 0; - - if (currentColAccumulateSize >= visibleXEnd && currentColEnd < 0) { - currentColEnd = i; - break; - } - } - - if (currentColEnd < 0) currentColEnd = headerSizes.length - 1; - if (currentColStart < 0) currentColStart = 0; - if (currentColEnd >= headerSizes.length) - currentColEnd = headerSizes.length - 1; - - return { - colStart: currentColStart, - colEnd: currentColEnd, - rowStart: currentRowStart, - rowEnd: currentRowEnd, - }; } diff --git a/src/components/gui/table-optimized/index.tsx b/src/components/gui/table-optimized/index.tsx index 6b61ce9a..553c9223 100644 --- a/src/components/gui/table-optimized/index.tsx +++ b/src/components/gui/table-optimized/index.tsx @@ -1,8 +1,5 @@ "use client"; - -import { DatabaseTableColumn } from "@/drivers/base-driver"; import { cn } from "@/lib/utils"; -import { ColumnType } from "@outerbase/sdk-transform"; import { Icon } from "@phosphor-icons/react"; import React, { ReactElement, @@ -20,31 +17,7 @@ import TableHeaderList from "./table-header-list"; import useTableVisibilityRecalculation from "./use-visibility-calculation"; export type TableCellDecorator = (value: unknown) => ReactElement | null; - -export interface TableHeaderMetadata { - from?: { - schema: string; - table: string; - column: string; - }; - - // Primary key - isPrimaryKey: boolean; - - // Foreign key reference - referenceTo?: { - schema: string; - table: string; - column: string; - }; - - type?: ColumnType; - originalType?: string; - - columnSchema?: DatabaseTableColumn; -} - -export interface OptimizeTableHeaderProps { +export interface OptimizeTableHeaderProps { name: string; display: { @@ -64,62 +37,67 @@ export interface OptimizeTableHeaderProps { onContextMenu?: (e: React.MouseEvent, headerIndex: number) => void; - metadata: TableHeaderMetadata; + metadata: MetadataType; store: Map; } -export interface OptimizeTableHeaderWithIndexProps - extends OptimizeTableHeaderProps { +export interface OptimizeTableHeaderWithIndexProps + extends OptimizeTableHeaderProps { index: number; sticky: boolean; } -export interface OptimizeTableCellRenderProps { +export interface OptimizeTableCellRenderProps { y: number; x: number; state: OptimizeTableState; - header: OptimizeTableHeaderWithIndexProps; + header: OptimizeTableHeaderWithIndexProps; isFocus: boolean; } -interface TableCellListCommonProps { - internalState: OptimizeTableState; +interface TableCellListCommonProps { + internalState: OptimizeTableState; renderHeader: ( - props: OptimizeTableHeaderWithIndexProps, - idx: number + props: OptimizeTableHeaderWithIndexProps + ) => ReactElement; + renderCell: ( + props: OptimizeTableCellRenderProps ) => ReactElement; rowHeight: number; onHeaderContextMenu?: ( e: React.MouseEvent, - header: OptimizeTableHeaderWithIndexProps + header: OptimizeTableHeaderWithIndexProps ) => void; onContextMenu?: (props: { - state: OptimizeTableState; + state: OptimizeTableState; event: React.MouseEvent; }) => void; onKeyDown?: (state: OptimizeTableState, event: React.KeyboardEvent) => void; } -export interface OptimizeTableProps extends TableCellListCommonProps { +export interface OptimizeTableProps + extends TableCellListCommonProps { arrangeHeaderIndex: number[]; stickyHeaderIndex?: number; renderAhead: number; } -interface RenderCellListProps extends TableCellListCommonProps { +interface RenderCellListProps + extends TableCellListCommonProps { hasSticky: boolean; onHeaderResize: (idx: number, newWidth: number) => void; customStyles?: React.CSSProperties; - headers: OptimizeTableHeaderWithIndexProps[]; + headers: OptimizeTableHeaderWithIndexProps[]; rowEnd: number; rowStart: number; colEnd: number; colStart: number; } -function renderCellList({ +function renderCellList({ hasSticky, customStyles, + renderCell, headers, rowEnd, rowStart, @@ -130,7 +108,7 @@ function renderCellList({ renderHeader, internalState, onHeaderContextMenu, -}: RenderCellListProps) { +}: RenderCellListProps) { const headerSizes = internalState.getHeaderWidth(); const templateSizes = @@ -149,26 +127,32 @@ function renderCellList({ const cells = windowArray.map((row, rowIndex) => { const absoluteRowIndex = rowIndex + rowStart; - let textClass = - "libsql-table-cell flex items-center justify-end h-full pr-2 font-mono"; - let tdClass = "sticky left-0 bg-neutral-50 dark:bg-neutral-950"; + let textClass = "flex items-center justify-end h-full pr-2 font-mono"; + let tdClass = + "sticky left-0 bg-neutral-50 dark:bg-neutral-950 border-r border-b"; if (internalState.getSelectedRowIndex().includes(absoluteRowIndex)) { if (internalState.isFullSelectionRow(absoluteRowIndex)) { textClass = cn( - "libsql-table-cell flex items-center justify-end h-full pr-2 font-mono", + "flex items-center justify-end h-full pr-2 font-mono", "bg-neutral-100 dark:bg-neutral-900 border-red-900 text-black dark:text-white font-bold" ); - tdClass = "sticky left-0 bg-neutral-100 dark:bg-blue-800"; + tdClass = + "sticky left-0 bg-neutral-100 dark:bg-blue-800 border-r border-b"; } else { textClass = - "libsql-table-cell flex items-center justify-end h-full pr-2 font-mono dark:text-white font-bold"; - tdClass = "sticky left-0 bg-neutral-100 dark:bg-neutral-900"; + "flex items-center justify-end h-full pr-2 font-mono dark:text-white font-bold"; + tdClass = + "sticky left-0 bg-neutral-100 dark:bg-neutral-900 border-r border-b"; } } return ( - + )} @@ -220,6 +205,7 @@ function renderCellList({ colIndex={header.index} rowIndex={absoluteRowIndex} header={header} + renderCell={renderCell} /> ); })} @@ -229,7 +215,10 @@ function renderCellList({ }); return ( - +
({ stickyHeaderIndex, internalState, renderHeader, + renderCell, rowHeight, renderAhead, onContextMenu, onHeaderContextMenu, onKeyDown, arrangeHeaderIndex, -}: OptimizeTableProps) { +}: OptimizeTableProps) { const containerRef = useRef(null); // This is our trigger re-render the whole table @@ -304,7 +294,7 @@ export default function OptimizeTable({ return [ ...(stickyHeaderIndex !== undefined ? [headers[stickyHeaderIndex]] : []), ...headerAfterArranged.filter((x) => x.index !== stickyHeaderIndex), - ]; + ] as OptimizeTableHeaderWithIndexProps[]; }, [internalState, arrangeHeaderIndex, stickyHeaderIndex, headerRevision]); const { visibileRange, onHeaderResize } = useTableVisibilityRecalculation({ @@ -321,6 +311,7 @@ export default function OptimizeTable({ return useMemo(() => { const common = { headers: headerWithIndex, + renderCell, rowEnd, rowStart, colEnd, @@ -345,7 +336,9 @@ export default function OptimizeTable({ style={{ outline: "none", }} - className={"libsql-table"} + className={ + "relative h-full w-full overflow-auto text-[12px] select-none" + } onContextMenu={(e) => { if (onContextMenu) onContextMenu({ state: internalState, event: e }); e.preventDefault(); @@ -375,5 +368,6 @@ export default function OptimizeTable({ onKeyDown, revision, renderHeader, + renderCell, ]); } diff --git a/src/components/gui/table-optimized/optimize-table-state.tsx b/src/components/gui/table-optimized/optimize-table-state.tsx index 8c794dad..6b1f758e 100644 --- a/src/components/gui/table-optimized/optimize-table-state.tsx +++ b/src/components/gui/table-optimized/optimize-table-state.tsx @@ -1,8 +1,3 @@ -import { - buildTableResultHeader, - BuildTableResultProps, -} from "@/lib/build-table-result"; -import { formatNumber } from "@/lib/convertNumber"; import { selectArrayFromIndexList } from "@/lib/export-helper"; import deepEqual from "deep-equal"; import { OptimizeTableHeaderProps, TableCellDecorator } from "."; @@ -15,8 +10,6 @@ export interface OptimizeTableRowValue { isRemoved?: boolean; } -export type AggregateFunction = "sum" | "avg" | "min" | "max" | "count"; - type TableChangeEventCallback = (state: OptimizeTableState) => void; export interface TableSelectionRange { @@ -26,7 +19,7 @@ export interface TableSelectionRange { y2: number; } -export default class OptimizeTableState { +export default class OptimizeTableState { protected focus: [number, number] | null = null; protected data: OptimizeTableRowValue[] = []; @@ -41,7 +34,7 @@ export default class OptimizeTableState { // We primary use it to display row number at the moment public gutterColumnWidth = 40; - protected headers: OptimizeTableHeaderProps[] = []; + protected headers: OptimizeTableHeaderProps[] = []; public headerRevision = 1; protected headerWidth: number[] = []; @@ -54,28 +47,10 @@ export default class OptimizeTableState { protected changeCounter = 1; protected changeLogs: Record = {}; - protected defaultAggregateFunction: AggregateFunction = "sum"; protected sql: string = ""; - static createFromResult(props: BuildTableResultProps) { - const r = new OptimizeTableState( - buildTableResultHeader(props), - props.result.rows.map((r) => ({ ...r })) - ); - - if (r.getRowsCount() >= 1000) { - r.gutterColumnWidth = 50; - } - - if (r.getRowsCount() >= 10000) { - r.gutterColumnWidth = 60; - } - - return r; - } - constructor( - headers: OptimizeTableHeaderProps[], + headers: OptimizeTableHeaderProps[], data: Record[] ) { this.headers = headers; @@ -301,7 +276,7 @@ export default class OptimizeTableState { return this.headers.length; } - disardAllChange() { + discardAllChange() { const newRows: OptimizeTableRowValue[] = []; for (const row of Object.values(this.changeLogs)) { @@ -809,106 +784,6 @@ export default class OptimizeTableState { return { isFocus, isSelected, isBorderBottom, isBorderRight }; } - getSelectionAggregatedResult() { - let sum = undefined; - let avg = undefined; - let min = undefined; - let max = undefined; - let count = 0; - let detectedDataType = undefined; - - const selectedCell = new Set(); - for (const range of this.selectionRanges) { - for (let x = range.x1; x <= range.x2; x++) { - for (let y = range.y1; y <= range.y2; y++) { - const key = `${x}-${y}`; - if (selectedCell.has(key)) { - continue; - } - selectedCell.add(key); - - const value = this.getValue(y, x); - - if (value !== null && value !== undefined && value !== "") { - // detect first valid element data type - if (detectedDataType === undefined) { - if (!isNaN(Number(value))) { - detectedDataType = "number"; - } else if ( - typeof value === "string" && - !isNaN(Date.parse(value)) - ) { - detectedDataType = "date"; - } - } - - if (detectedDataType === "number") { - const parsed = Number(value); - if (!isNaN(parsed)) { - sum = sum !== undefined ? sum + parsed : parsed; - min = - min !== undefined - ? (min as number) < parsed - ? min - : parsed - : parsed; - max = - max !== undefined - ? (max as number) > parsed - ? max - : parsed - : parsed; - } - } else if ( - detectedDataType === "date" && - (isValidDate(value as string) || isValidDateTime(value as string)) - ) { - const parsed = Date.parse(value as string); - if (!isNaN(parsed)) { - min = - min !== undefined - ? Date.parse(min as string) < parsed - ? min - : value - : value; - max = - max !== undefined - ? Date.parse(max as string) > parsed - ? max - : value - : value; - } - } - } - count = count + 1; - } - } - } - if (sum !== undefined && count > 0) { - avg = sum / count; - } - if (detectedDataType === "number") { - return { - sum: formatNumber(sum), - avg: formatNumber(avg), - min: formatNumber(min as number), - max: formatNumber(max as number), - count: formatNumber(count), - }; - } - return { - min, - max, - count, - }; - } - - setDefaultAggregateFunction(functionName: AggregateFunction) { - this.defaultAggregateFunction = functionName; - } - getDefaultAggregateFunction() { - return this.defaultAggregateFunction; - } setSql(sql: string) { this.sql = sql; } @@ -916,19 +791,3 @@ export default class OptimizeTableState { return this.sql; } } - -function isValidDate(value: string): boolean { - const dateRegex = /^\d{4}-\d{2}-\d{2}$/; - if (!dateRegex.test(value)) return false; - - const parsedDate = new Date(value); - return !isNaN(parsedDate.getTime()); -} - -function isValidDateTime(value: string): boolean { - const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; - if (!dateTimeRegex.test(value)) return false; - - const parsedDate = new Date(value); - return !isNaN(parsedDate.getTime()); -} diff --git a/src/components/gui/table-optimized/table-cell.tsx b/src/components/gui/table-optimized/table-cell.tsx index 467a0568..2b0cc4ac 100644 --- a/src/components/gui/table-optimized/table-cell.tsx +++ b/src/components/gui/table-optimized/table-cell.tsx @@ -1,19 +1,25 @@ import { cn } from "@/lib/utils"; -import { useMemo } from "react"; -import { OptimizeTableHeaderWithIndexProps } from "."; -import tableResultCellRenderer from "../table-result/render-cell"; +import { ReactElement, useMemo } from "react"; +import { + OptimizeTableCellRenderProps, + OptimizeTableHeaderWithIndexProps, +} from "."; import OptimizeTableState from "./optimize-table-state"; -export default function OptimizeTableCell({ +export default function OptimizeTableCell({ state, header, rowIndex, colIndex, + renderCell, }: { state: OptimizeTableState; rowIndex: number; colIndex: number; - header: OptimizeTableHeaderWithIndexProps; + header: OptimizeTableHeaderWithIndexProps; + renderCell: ( + props: OptimizeTableCellRenderProps + ) => ReactElement; }) { const { isFocus, isSelected, isBorderBottom, isBorderRight } = state.getCellStatus(rowIndex, colIndex); @@ -49,7 +55,7 @@ export default function OptimizeTableCell({ } const cellClassName = cn( - "box-border hover:bg-neutral-100 dark:hover:bg-neutral-800", + "overflow-hidden border-r border-b box-border hover:bg-neutral-100 dark:hover:bg-neutral-800", isSelected && "border-neutral-950 dark:border-neutral-50", isBorderBottom && "border-b border-b-neutral-950 dark:border-b-neutral-50", isBorderRight && "border-r border-r-neutral-950 dark:border-r-neutral-50", @@ -59,8 +65,6 @@ export default function OptimizeTableCell({ cellBackgroundColor ); - const className = cn("libsql-table-cell"); - return ( + {!!paddingTop && ( - + - - + + + {headers.map((header, idx) => { return ( setResizing(true)} > diff --git a/src/components/gui/table-optimized/table-header.tsx b/src/components/gui/table-optimized/table-header.tsx index 80cbbc8f..ad3f45c0 100644 --- a/src/components/gui/table-optimized/table-header.tsx +++ b/src/components/gui/table-optimized/table-header.tsx @@ -4,7 +4,7 @@ import type { OptimizeTableHeaderWithIndexProps } from "."; import OptimizeTableState from "./optimize-table-state"; import TableHeaderResizeHandler from "./table-header-resize-handler"; -export default function TableHeader({ +export default function TableHeader({ idx, header, onHeaderResize, @@ -15,16 +15,18 @@ export default function TableHeader({ }: { idx: number; sticky: boolean; - header: OptimizeTableHeaderWithIndexProps; - state: OptimizeTableState; + header: OptimizeTableHeaderWithIndexProps; + state: OptimizeTableState; onHeaderResize: (idx: number, newWidth: number) => void; onContextMenu?: React.MouseEventHandler; renderHeader: ( - props: OptimizeTableHeaderWithIndexProps, - idx: number + props: OptimizeTableHeaderWithIndexProps ) => ReactElement; }) { - const className = cn(sticky ? "sticky z-30" : undefined, "bg-background"); + const className = cn( + sticky ? "z-30" : undefined, + "bg-background border-r border-b overflow-hidden sticky top-0 h-[35px] leading-[35px] flex text-left z-10 p-0" + ); return (
-
- {tableResultCellRenderer({ +
+ {renderCell({ x: colIndex, y: rowIndex, state: state, diff --git a/src/components/gui/table-optimized/table-fake-body-padding.tsx b/src/components/gui/table-optimized/table-fake-body-padding.tsx index 1c2945c4..99449f06 100644 --- a/src/components/gui/table-optimized/table-fake-body-padding.tsx +++ b/src/components/gui/table-optimized/table-fake-body-padding.tsx @@ -18,9 +18,9 @@ export default function TableFakeBodyPadding({ const paddingBottom = (rowCount - rowEnd) * rowHeight; return ( -
+
({ headers, onHeaderResize, renderHeader, @@ -11,25 +11,22 @@ export default function TableHeaderList({ onHeaderContextMenu, state, }: { - headers: OptimizeTableHeaderWithIndexProps[]; + headers: OptimizeTableHeaderWithIndexProps[]; renderHeader: ( - props: OptimizeTableHeaderWithIndexProps, - idx: number + props: OptimizeTableHeaderWithIndexProps ) => ReactElement; onHeaderResize: (idx: number, newWidth: number) => void; sticky: boolean; onHeaderContextMenu?: ( e: React.MouseEvent, - header: OptimizeTableHeaderWithIndexProps + header: OptimizeTableHeaderWithIndexProps ) => void; - state: OptimizeTableState; + state: OptimizeTableState; }) { return ( -
-
-
- {renderHeader(header, idx)} + {renderHeader(header)} {header.setting.resizable && ( )} diff --git a/src/components/gui/table-optimized/use-visibility-calculation.ts b/src/components/gui/table-optimized/use-visibility-calculation.ts index c3fa5872..2b85bcef 100644 --- a/src/components/gui/table-optimized/use-visibility-calculation.ts +++ b/src/components/gui/table-optimized/use-visibility-calculation.ts @@ -1,9 +1,70 @@ import useElementResize from "@/components/hooks/useElementResize"; import { useCallback, useEffect, useState } from "react"; import { OptimizeTableHeaderWithIndexProps } from "."; -import { getVisibleCellRange } from "./helper"; import OptimizeTableState from "./optimize-table-state"; +/** + * Giving the container, we calculate visible rows and column + * + * @param e container elements + * @param headerSizes size of each headers + * @param totalRowCount total number of rows + * @param rowHeight fixed height of each row + * @param renderAhead number of rows that we need to pre-render ahead + * @returns + */ +export function getVisibleCellRange( + e: HTMLDivElement, + headerSizes: number[], + totalRowCount: number, + rowHeight: number, + renderAhead: number, + gutterWidth: number +) { + const currentRowStart = Math.max( + 0, + Math.floor(e.scrollTop / rowHeight) - 1 - renderAhead + ); + const currentRowEnd = Math.min( + totalRowCount, + currentRowStart + + Math.ceil(e.getBoundingClientRect().height / rowHeight) + + renderAhead + ); + + let currentColStart = -1; + let currentColAccumulateSize = gutterWidth; + let currentColEnd = -1; + + const visibleXStart = e.scrollLeft; + const visibleXEnd = visibleXStart + e.getBoundingClientRect().width; + + for (let i = 0; i < headerSizes.length; i++) { + if (currentColAccumulateSize >= visibleXStart && currentColStart < 0) { + currentColStart = i - 1; + } + + currentColAccumulateSize += headerSizes[i] ?? 0; + + if (currentColAccumulateSize >= visibleXEnd && currentColEnd < 0) { + currentColEnd = i; + break; + } + } + + if (currentColEnd < 0) currentColEnd = headerSizes.length - 1; + if (currentColStart < 0) currentColStart = 0; + if (currentColEnd >= headerSizes.length) + currentColEnd = headerSizes.length - 1; + + return { + colStart: currentColStart, + colEnd: currentColEnd, + rowStart: currentRowStart, + rowEnd: currentRowEnd, + }; +} + export default function useTableVisibilityRecalculation({ containerRef, totalRowCount, diff --git a/src/components/gui/table-result/context-menu.tsx b/src/components/gui/table-result/context-menu.tsx index 6e075dc5..ab89da7f 100644 --- a/src/components/gui/table-result/context-menu.tsx +++ b/src/components/gui/table-result/context-menu.tsx @@ -11,7 +11,8 @@ import { LucidePlus, LucideTrash2 } from "lucide-react"; import { useCallback } from "react"; import { useFullEditor } from "../providers/full-editor-provider"; import OptimizeTableState from "../table-optimized/optimize-table-state"; -import TableStateActions from "../table-optimized/table-state-actions"; +import TableStateActions from "./table-state-actions"; +import { TableHeaderMetadata } from "./type"; export default function useTableResultContextMenu({ tableName, @@ -20,9 +21,9 @@ export default function useTableResultContextMenu({ pasteCallback, }: { tableName?: string; - data: OptimizeTableState; - copyCallback: (state: OptimizeTableState) => void; - pasteCallback: (state: OptimizeTableState) => void; + data: OptimizeTableState; + copyCallback: (state: OptimizeTableState) => void; + pasteCallback: (state: OptimizeTableState) => void; }) { const { openEditor } = useFullEditor(); const { extensions } = useStudioContext(); @@ -32,7 +33,7 @@ export default function useTableResultContextMenu({ state, event, }: { - state: OptimizeTableState; + state: OptimizeTableState; event: React.MouseEvent; }) => { const randomUUID = generateId(); diff --git a/src/components/gui/table-result/helper.ts b/src/components/gui/table-result/helper.ts new file mode 100644 index 00000000..7b9241f4 --- /dev/null +++ b/src/components/gui/table-result/helper.ts @@ -0,0 +1,23 @@ +import { + buildTableResultHeader, + BuildTableResultProps, +} from "@/lib/build-table-result"; +import OptimizeTableState from "../table-optimized/optimize-table-state"; +import { TableHeaderMetadata } from "./type"; + +export function createTableStateFromResult(props: BuildTableResultProps) { + const r = new OptimizeTableState( + buildTableResultHeader(props), + props.result.rows.map((r) => ({ ...r })) + ); + + if (r.getRowsCount() >= 1000) { + r.gutterColumnWidth = 50; + } + + if (r.getRowsCount() >= 10000) { + r.gutterColumnWidth = 60; + } + + return r; +} diff --git a/src/components/gui/table-result/render-cell.tsx b/src/components/gui/table-result/render-cell.tsx index 464f7fea..b41b04bd 100644 --- a/src/components/gui/table-result/render-cell.tsx +++ b/src/components/gui/table-result/render-cell.tsx @@ -7,6 +7,7 @@ import GenericCell from "../table-cell/generic-cell"; import NumberCell from "../table-cell/number-cell"; import TextCell from "../table-cell/text-cell"; import { OptimizeTableCellRenderProps } from "../table-optimized"; +import { TableHeaderMetadata } from "./type"; function detectTextEditorType( value: DatabaseValue @@ -47,7 +48,7 @@ export default function tableResultCellRenderer({ state, header, isFocus, -}: OptimizeTableCellRenderProps) { +}: OptimizeTableCellRenderProps) { const editMode = isFocus && state.isInEditMode(); const value = state.getValue(y, x); const valueType = determineCellType(value); diff --git a/src/components/gui/table-optimized/table-state-actions.ts b/src/components/gui/table-result/table-state-actions.ts similarity index 80% rename from src/components/gui/table-optimized/table-state-actions.ts rename to src/components/gui/table-result/table-state-actions.ts index a6119a74..dd66cef2 100644 --- a/src/components/gui/table-optimized/table-state-actions.ts +++ b/src/components/gui/table-result/table-state-actions.ts @@ -1,7 +1,8 @@ -import OptimizeTableState from "./optimize-table-state"; +import OptimizeTableState from "../table-optimized/optimize-table-state"; +import { TableHeaderMetadata } from "./type"; export default class TableStateActions { - static duplicateRow(state: OptimizeTableState) { + static duplicateRow(state: OptimizeTableState) { const rowIndex = state.getFocus()?.y; if (!rowIndex) return; @@ -21,7 +22,9 @@ export default class TableStateActions { } } - static duplicateRowWithoutKey(state: OptimizeTableState) { + static duplicateRowWithoutKey( + state: OptimizeTableState + ) { const rowIndex = state.getFocus()?.y; if (!rowIndex) return; diff --git a/src/components/gui/table-result/type.tsx b/src/components/gui/table-result/type.tsx new file mode 100644 index 00000000..f7b2edfa --- /dev/null +++ b/src/components/gui/table-result/type.tsx @@ -0,0 +1,25 @@ +import { DatabaseTableColumn } from "@/drivers/base-driver"; +import { ColumnType } from "@outerbase/sdk-transform"; + +export interface TableHeaderMetadata { + from?: { + schema: string; + table: string; + column: string; + }; + + // Primary key + isPrimaryKey: boolean; + + // Foreign key reference + referenceTo?: { + schema: string; + table: string; + column: string; + }; + + type?: ColumnType; + originalType?: string; + + columnSchema?: DatabaseTableColumn; +} diff --git a/src/components/gui/tabs-result/query-result-tab.tsx b/src/components/gui/tabs-result/query-result-tab.tsx index 6f6df7c6..d7150a5b 100644 --- a/src/components/gui/tabs-result/query-result-tab.tsx +++ b/src/components/gui/tabs-result/query-result-tab.tsx @@ -6,7 +6,7 @@ import AggregateResultButton from "../aggregate-result/aggregate-result-button"; import ExportResultButton from "../export/export-result-button"; import ResultTable from "../query-result-table"; import ResultStats from "../result-stat"; -import OptimizeTableState from "../table-optimized/optimize-table-state"; +import { createTableStateFromResult } from "../table-result/helper"; export default function QueryResult({ result, @@ -22,7 +22,7 @@ export default function QueryResult({ const [cachedSchemas] = useState(schema); const data = useMemo(() => { - const state = OptimizeTableState.createFromResult({ + const state = createTableStateFromResult({ driver: databaseDriver, result: result.result, schemas: cachedSchemas, diff --git a/src/components/gui/tabs/table-data-tab.tsx b/src/components/gui/tabs/table-data-tab.tsx index c25d4749..e1d546fb 100644 --- a/src/components/gui/tabs/table-data-tab.tsx +++ b/src/components/gui/tabs/table-data-tab.tsx @@ -36,6 +36,8 @@ import OpacityLoading from "../loading-opacity"; import ResultStats from "../result-stat"; import OptimizeTableState from "../table-optimized/optimize-table-state"; import useTableResultColumnFilter from "../table-result/filter-column"; +import { createTableStateFromResult } from "../table-result/helper"; +import { TableHeaderMetadata } from "../table-result/type"; import { Toolbar } from "../toolbar"; import { useCurrentTab } from "../windows-tab"; @@ -55,7 +57,7 @@ export default function TableDataWindow({ const [executeError, setExecuteError] = useState(null); const [loading, setLoading] = useState(false); - const [data, setData] = useState(); + const [data, setData] = useState>(); const [tableSchema, setTableSchema] = useState(); const [stat, setStat] = useState(); const [sortColumns, setSortColumns] = useState([]); @@ -92,7 +94,7 @@ export default function TableDataWindow({ orderBy: sortColumns, }); - const tableState = OptimizeTableState.createFromResult({ + const tableState = createTableStateFromResult({ driver: databaseDriver, result: dataResult, tableSchema: schemaResult, @@ -161,7 +163,7 @@ export default function TableDataWindow({ const onDiscard = useCallback(() => { if (data) { - data.disardAllChange(); + data.discardAllChange(); } }, [data]); @@ -352,7 +354,10 @@ export default function TableDataWindow({ onChange={(e) => setLimit(e.currentTarget.value)} onBlur={(e) => { try { - const finalValue = Math.max(0, parseInt(e.currentTarget.value)); + const finalValue = Math.max( + 0, + parseInt(e.currentTarget.value) + ); if (finalValue !== finalLimit) { setFinalLimit(finalValue); } @@ -375,7 +380,10 @@ export default function TableDataWindow({ onChange={(e) => setOffset(e.currentTarget.value)} onBlur={(e) => { try { - const finalValue = Math.max(0, parseInt(e.currentTarget.value)); + const finalValue = Math.max( + 0, + parseInt(e.currentTarget.value) + ); if (finalValue !== finalOffset) { setFinalOffset(finalValue); } diff --git a/src/core/extension-manager.tsx b/src/core/extension-manager.tsx index e3fa7280..ff7f25c1 100644 --- a/src/core/extension-manager.tsx +++ b/src/core/extension-manager.tsx @@ -1,5 +1,6 @@ import { OptimizeTableHeaderProps } from "@/components/gui/table-optimized"; import OptimizeTableState from "@/components/gui/table-optimized/optimize-table-state"; +import { TableHeaderMetadata } from "@/components/gui/table-result/type"; import { DatabaseSchemaItem, DatabaseSchemas } from "@/drivers/base-driver"; import { ReactElement } from "react"; import { IStudioExtension } from "./extension-base"; @@ -29,8 +30,8 @@ type CreateResourceMenuHandler = ( ) => StudioExtensionMenuItem | undefined; type QueryHeaderResultMenuHandler = ( - header: OptimizeTableHeaderProps, - state: OptimizeTableState + header: OptimizeTableHeaderProps, + state: OptimizeTableState ) => StudioExtensionMenuItem | undefined; type AfterFetchSchemaHandler = (schema: DatabaseSchemas) => void; @@ -123,8 +124,8 @@ export class StudioExtensionManager extends StudioExtensionContext { } getQueryHeaderContextMenu( - header: OptimizeTableHeaderProps, - state: OptimizeTableState + header: OptimizeTableHeaderProps, + state: OptimizeTableState ) { return this.queryResultHeaderContextMenu .map((handler) => handler(header, state)) diff --git a/src/lib/build-table-result.ts b/src/lib/build-table-result.ts index 3013be75..9bfdf1ba 100644 --- a/src/lib/build-table-result.ts +++ b/src/lib/build-table-result.ts @@ -1,4 +1,5 @@ import { OptimizeTableHeaderProps } from "@/components/gui/table-optimized"; +import { TableHeaderMetadata } from "@/components/gui/table-result/type"; import { BaseDriver, DatabaseResultSet, @@ -16,7 +17,7 @@ export interface BuildTableResultProps { } function pipeAttachColumnViaSchemas( - headers: OptimizeTableHeaderProps[], + headers: OptimizeTableHeaderProps[], { tableSchema, schemas, driver }: BuildTableResultProps ) { // If there is already table schema, we use it instead because it is more accurate. @@ -54,7 +55,7 @@ function pipeAttachColumnViaSchemas( } function pipeWithTableSchema( - headers: OptimizeTableHeaderProps[], + headers: OptimizeTableHeaderProps[], { tableSchema, driver }: BuildTableResultProps ) { if (!tableSchema) return; @@ -122,7 +123,7 @@ function pipeWithTableSchema( * the readonly status of each column according to the table schema. */ function pipeEditableTable( - headers: OptimizeTableHeaderProps[], + headers: OptimizeTableHeaderProps[], { schemas }: BuildTableResultProps ) { const tables: { @@ -197,7 +198,7 @@ function pipeEditableTable( } export function pipeVirtualColumnAsReadOnly( - headers: OptimizeTableHeaderProps[] + headers: OptimizeTableHeaderProps[] ) { for (const header of headers) { if (header.metadata.columnSchema?.constraint?.generatedExpression) { @@ -207,7 +208,7 @@ export function pipeVirtualColumnAsReadOnly( } export function pipeCalculateInitialSize( - headers: OptimizeTableHeaderProps[], + headers: OptimizeTableHeaderProps[], { result }: BuildTableResultProps ) { for (const header of headers) { @@ -237,7 +238,9 @@ export function pipeCalculateInitialSize( } } -export function pipeColumnIcon(headers: OptimizeTableHeaderProps[]) { +export function pipeColumnIcon( + headers: OptimizeTableHeaderProps[] +) { for (const header of headers) { if (header.metadata.isPrimaryKey) { header.display.icon = LucideKey; @@ -254,7 +257,7 @@ export function pipeColumnIcon(headers: OptimizeTableHeaderProps[]) { export function buildTableResultHeader( props: BuildTableResultProps -): OptimizeTableHeaderProps[] { +): OptimizeTableHeaderProps[] { const { result } = props; const headers = result.headers.map((column) => { @@ -283,7 +286,7 @@ export function buildTableResultHeader( originalType: column.originalType, ...(from ? { from } : {}), }, - } as OptimizeTableHeaderProps; + } as OptimizeTableHeaderProps; }); pipeWithTableSchema(headers, props); From af918ba8ab75fb233dce8a9b5549bf618e7d1ca3 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Mon, 31 Mar 2025 14:49:47 +0700 Subject: [PATCH 10/11] remove coverage checking --- .github/workflows/coverags.yaml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .github/workflows/coverags.yaml diff --git a/.github/workflows/coverags.yaml b/.github/workflows/coverags.yaml deleted file mode 100644 index ffb12d45..00000000 --- a/.github/workflows/coverags.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: "Compute Coverage" -on: - pull_request: - branches: - - develop -jobs: - coverage: - runs-on: ubuntu-latest - permissions: - contents: read - checks: write - pull-requests: write - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: 20 - - - uses: ArtiomTr/jest-coverage-report-action@v2 From 73ffae9418569cf0d9226dd8c1d969c871d65c09 Mon Sep 17 00:00:00 2001 From: "Visal .In" Date: Mon, 31 Mar 2025 17:56:59 +0700 Subject: [PATCH 11/11] bump version 0.10.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index de486ac2..b8877d19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@outerbase/studio", - "version": "0.10.1", + "version": "0.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@outerbase/studio", - "version": "0.10.1", + "version": "0.10.2", "dependencies": { "@codemirror/lang-json": "^6.0.1", "@codemirror/lang-sql": "^6.5.5", diff --git a/package.json b/package.json index 114266a8..8611fc3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@outerbase/studio", - "version": "0.10.1", + "version": "0.10.2", "private": false, "scripts": { "dev": "next dev -p 3008",