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 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/package-lock.json b/package-lock.json index 311959b8..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", @@ -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..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", @@ -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", 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); } 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/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/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 bcf9b7b4..1aa156b9 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,20 @@ export default function SchemaList({ search }: Readonly) { setSelected(""); }, [setSelected, search]); + 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) => { const selectedName = item?.name; const isTable = item?.type === "table"; + const schemaName = item?.schemaName ?? currentSchemaName; const createMenuSection = { title: "Create", @@ -173,6 +209,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 +240,8 @@ export default function SchemaList({ search }: Readonly) { }, { separator: true }, + // Export Section + exportSection, // Modification Section ...modificationSection, modificationSection.length > 0 ? { separator: true } : undefined, @@ -191,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/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) => ({ diff --git a/src/components/gui/tabs/table-data-tab.tsx b/src/components/gui/tabs/table-data-tab.tsx index b3aa1235..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 = parseInt(e.currentTarget.value); + const finalValue = Math.max( + 0, + parseInt(e.currentTarget.value) + ); if (finalValue !== finalLimit) { setFinalLimit(finalValue); } @@ -375,10 +380,14 @@ 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/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/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 }); 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 { 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/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); 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/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 }; 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", - }, - } - ); - } - }; -}